Jquery - ¿Cómo hacer que $.post() use contentType=application/json?
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 asp.net mvc necesita tener contentType=application/json
(Consulte esta pregunta para saber por qué debo usar application/json: ASPNET MVC - ¿Por qué ModelState.IsValid es 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 provoca que algunos se rompan.
Entonces, ¿hay alguna manera de cambiar el comportamiento de $.post() para enviar contentType=application/json?
$.ajax({
url:url,
type:"POST",
data:data,
contentType:"application/json; charset=utf-8",
dataType:"json",
success: function(){
...
}
})
Ver: jQuery.ajax()
Finalmente encontré la solución, que funciona para mí:
jQuery.ajax ({
url: myurl,
type: "POST",
data: JSON.stringify({data:"test"}),
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(){
//
}
});
Creo que quizás tengas que hacerlo
$.ajax
1.Modifique la fuente para que $.post siempre use el tipo de datos JSON, ya que en realidad es solo un acceso directo para una llamada preconfigurada.
O
2. Defina su propia función de utilidad que sea un acceso directo para la $.ajax
configuración que desea utilizar.
O
3.Puedes sobrescribirlo $.post function
con tu propia implementación mediante parches de mono.
El tipo de datos JSON en su ejemplo se refiere al tipo de datos devuelto por el servidor y no al formato enviado al servidor.
Terminé agregando el siguiente método a jQuery en mi script:
jQuery["postJSON"] = function( url, data, callback ) {
// shift arguments if data argument was omitted
if ( jQuery.isFunction( data ) ) {
callback = data;
data = undefined;
}
return jQuery.ajax({
url: url,
type: "POST",
contentType:"application/json; charset=utf-8",
dataType: "json",
data: data,
success: callback
});
};
y para usarlo
$.postJSON('http://url', {data: 'goes', here: 'yey'}, function (data, status, xhr) {
alert('Nailed it!')
});
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 JSON.
¡Gracias!
usar solo
jQuery.ajax ({
url: myurl,
type: "POST",
data: mydata,
dataType: "json",
contentType: "application/json; charset=utf-8",
success: function(){
//
}
});
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. Así que simplemente use $.ajax y podrá 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 sólo que el programa funcione, sino también que todos los que lean tu programa lo entiendan de la misma manera. Sobrescribir métodos estándar sin una razón muy importante puede provocar malentendidos al leer el código del programa. Así que repito mi recomendación una vez más: simplemente use el formato jQuery $.ajax original en lugar de jQuery.get
y jQuery.post
obtendrá programas que no sólo funcionan perfectamente, sino que también pueden ser leídos por personas sin malentendidos.