Me di cuenta de que cuando uso $ .post () en jquery, el tipo de contenido predeterminado es application / x-www-form-urlencoded, cuando mi código aspvc mvc necesita tener contentType = application / json
(Consulte esta pregunta para saber por qué debo usar application / json: ASPNET MVC - ¿Por qué es ModelState.IsValid falso "El campo x es obligatorio" cuando ese campo tiene un valor? )
¿Cómo puedo hacer que $ .post () envíe contentType = application / json? Ya tengo una gran cantidad de funciones $ .post (), así que no quiero cambiar a $ .ajax () porque tomaría demasiado tiempo
Si lo intento
$.post(url, data, function(), "json")
Todavía tiene contentType = application / x-www-form-urlencoded. Entonces, ¿qué hace exactamente el parámetro "json" si no cambia el tipo de contenido a json?
Si lo intento
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
Eso funciona pero afecta a todos los $ .get y $ .post que tengo y hace que algunos se rompan.
Entonces, ¿hay alguna manera de que pueda cambiar el comportamiento de $ .post () para enviar contentType = application / json?
jQuery.post
método, es una función realmente simple ..."mystring data"
seráapplication/x-www-form-urlencoded;
donde como un objeto{ anyKey: "anyvalue and type" }
seráapplication/json
. Muchos servidores que leen json solo permitirán un objeto o matriz, no una cadena, por lo que jquery predice las cosas de esta manera. Si tiene un servidor que lee cadenas, números, etc. sin estar envuelto en un objeto, debe especificar el tipo de contenido como en esta respuesta.Ver: jQuery.ajax ()
fuente
JSON.stringify(data)
, ya que el servidor espera una cadena JSON y jQuery simplemente concatenaría los pares de clave-valor usando símbolos "ampersands".Finalmente encontré la solución, que funciona para mí:
fuente
data
argumentox-www-form-urlencoded
, pero si indica que el tipo de contenido de la solicitud es JSON, todavía insiste en enviarlodata
en un formato no coincidente.Terminé agregando el siguiente método a jQuery en mi script:
Y para usarlo
Esto se hizo simplemente copiando el código de "get" y "post" de las fuentes originales de JQuery y codificando algunos parámetros para forzar una POST DE JSON.
¡Gracias!
fuente
usar solo
ACTUALIZADO @JK: si escribe en su pregunta solo un ejemplo de código con $ .post, encontrará un ejemplo correspondiente en la respuesta. No quiero repetir la misma información que ya estudiaste hasta que sepas: $ .post y $ .get son formas cortas de $ .ajax. Tan solo use $ .ajax y puede usar el conjunto completo de sus parámetros sin tener que cambiar ninguna configuración global.
Por cierto, no recomendaría sobrescribir el $ .post estándar. Es mi opinión personal , pero para mí es importante, no solo que el programa funciona, sino también que todos los que leen tu programa lo entienden de la misma manera. Sobrescribir los métodos estándar sin tener una razón muy importante puede seguir a los malentendidos en la lectura del código del programa. Así que repito mi recomendación una vez más: simplemente use el formulario original $ .ajax jQuery en lugar de
jQuery.get
y,jQuery.post
y recibirá programas que no solo funcionan perfectamente, sino que pueden ser leídos por personas sin malentendidos.fuente
El tipo de datos "json" que puede pasar como el último parámetro para publicar () indica qué tipo de datos espera la función en la respuesta del servidor, no qué tipo está enviando en la solicitud. Específicamente establece el encabezado "Aceptar".
Honestamente, su mejor opción es cambiar a una llamada ajax (). La función post () se entiende como una conveniencia; una versión simplificada de la llamada ajax () para cuando solo está haciendo una publicación de formulario simple. No lo eres
Si realmente no desea cambiar, puede hacer que su propia función se llame, digamos, xpost (), y que simplemente transforme los parámetros dados en parámetros para una llamada jQuery ajax (), con el tipo de contenido establecido. De esa manera, en lugar de reescribir todas esas funciones post () en funciones ajax (), solo tiene que cambiarlas todas de post a xpost (o lo que sea).
fuente
Esta extensión simple de API jquery (de: https://benjamin-schweizer.de/jquerypostjson.html ) por $ .postJSON () hace el truco. Puede usar postJSON () como cualquier otra llamada nativa de jquery Ajax. Puede adjuntar controladores de eventos, etc.
Al igual que otras API de Ajax (como $ http de AngularJS), establece el tipo de contenido correcto en application / json. Puede pasar sus datos json (objetos javascript) directamente, ya que aquí se encriptan. El tipo de datos devuelto esperado se establece en JSON. Puede adjuntar los controladores de eventos predeterminados de jquery para promesas, por ejemplo:
fuente
Sé que esta es una respuesta tardía, en realidad tengo un método de acceso directo que utilizo para publicar / leer en / desde servicios basados en MS ... funciona con MVC y ASMX, etc.
Utilizar:
NOTA: También tengo un método JSON.parseAjax que se modifica del archivo JS de json.org, que agrega manejo para las fechas "/Date(...)/" de MS ...
El archivo json2.js modificado no está incluido, utiliza el analizador basado en scripts en el caso de IE8, ya que hay casos en los que el analizador nativo se rompe cuando extiende el prototipo de matriz y / u objeto, etc.
He estado considerando renovar este código para implementar las interfaces de promesas, pero me funcionó muy bien.
fuente
El meollo del asunto es el hecho de que JQuery en el momento de la escritura no tiene un método postJSON mientras que getJSON existe y hace lo correcto.
un método postJSON haría lo siguiente:
y se puede usar así:
fuente
La documentación muestra actualmente que a partir de 3.0, $ .post aceptará el objeto de configuración, lo que significa que puede usar las opciones $ .ajax. 3.0 aún no se ha lanzado y en el commit están hablando de ocultar la referencia en los documentos, ¡pero búscalo en el futuro!
fuente
Tuve un problema similar con el siguiente código JavaScript:
Donde en el Fiddler pude ver la solicitud con:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
Como resultado, mi servidor no pudo asignar un objeto a un tipo del lado del servidor.
Después de cambiar la última línea a esta:
En el violinista todavía podía ver:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
Sin embargo, el servidor comenzó a devolver lo que esperaba.
fuente
¿Qué tal su propio adaptador / envoltura?
Y uso extremadamente simple:
fuente
Por alguna razón, configurar el tipo de contenido en la solicitud ajax como @Adrien sugirió no funcionó en mi caso. Sin embargo, en realidad puede cambiar el tipo de contenido usando $ .post haciendo esto antes:
Entonces haz tu
$.post
llamada:Tuve problemas con jQuery + IIS, y esta fue la única solución que ayudó a jQuery a comprender el uso de la codificación windows-1252 para las solicitudes ajax.
fuente
podemos cambiar el tipo de contenido como este en $ .post
$ .post (url, data, function (data, status, xhr) {xhr.setRequestHeader ("Content-type", "application / x-www-form-urlencoded; charset = utf-8");});
fuente
$ .post no funciona si tiene un problema CORS (Cross Origin Resource Sharing). Intente usar $ .Ajax en el siguiente formato: "$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, headers: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', tipo: 'POST', asíncrono: falso, éxito: función (Datos) {...}}); "
fuente
No puedes enviar
application/json
directamente, tiene que ser un parámetro de una solicitud GET / POST.Entonces algo como
fuente