$ .ajax - tipo de datos

135

Cuál es la diferencia entre

contentType: "application/json; charset=utf-8",
dataType: "json",

vs.

contentType: "application/json",
dataType: "text",
Nick Kahn
fuente

Respuestas:

181
  • contentTypees el encabezado HTTP enviado al servidor, especificando un formato particular.
    Ejemplo: estoy enviando JSON o XML
  • dataType¿Le estás diciendo a jQuery qué tipo de respuesta esperar?
    Esperando JSON, o XML, o HTML, etc. El valor predeterminado es que jQuery intente resolverlo.

La $.ajax()documentación tiene descripciones completas de estos también.


En su caso particular, la primera es buscar la respuesta esté en UTF-8, el segundo no le importa. Además, el primero trata la respuesta como un objeto JavaScript, el segundo la trata como una cadena.

Entonces el primero sería:

success: function(data) {
  // get data, e.g. data.title;
}

El segundo:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}
Nick Craver
fuente
1
cuál es la forma más preferida o más recomendada.
Nick Kahn el
1
@Adu: no hay una respuesta directa para eso, depende de lo que quieras hacer con el resultado ... están haciendo 2 cosas diferentes. Idealmente, a menos que sea un resultado muy simple, probablemente desee tratar con JSON, en cuyo caso el primero sería más fácil.
Nick Craver
2
Musa tiene razón, contentType indica qué formato estamos enviando al servidor (es decir, el cuerpo de la publicación), no lo que se solicita de nuevo.
antinome
@antinome esos 2 generalmente están muy unidos, es importante aquí en Stack Overflow en muchos lugares, por ejemplo. Estrictamente hablando, son independientes, he actualizado para reflejar eso.
Nick Craver
Todavía no hay un lugar donde pueda encontrar lo que está predeterminado, es decir, voy manual y reconstruyo el objeto después de cada llamada, pero al reiniciar, tengo problemas. si lo configuro como 'json' como predeterminado, de ninguna manera complementará la suposición inteligente, pero funciona hasta cierto punto, hasta que llegue a la llamada donde no he especificado (eso NO es una llamada JSON en sí), entonces Si lo configuro en una cadena vacía, o nulo, parece romper todo. ¿Puedo configurar algo como 'predeterminado' o f'in 'Intellgent Guess' por el bien de f? ¿Cuál es el defecto técnico, es decir, como se define entre dos citas dataType = ""?
blamb
51

(ps: la respuesta dada por Nick Craver es incorrecta)

contentType especifica el formato de los datos que se envían al servidor como parte de la solicitud (también se puede enviar como parte de la respuesta, más sobre eso más adelante).

dataType especifica el formato esperado de datos que recibirá el cliente (navegador).

Ambos no son intercambiables.

  • contentTypees el encabezado enviado al servidor, que especifica el formato de los datos (es decir, el contenido del cuerpo del mensaje) que se envía al servidor. Esto se usa con solicitudes POST y PUT. Por lo general, cuando envía una solicitud POST, el cuerpo del mensaje consta de parámetros pasados ​​como:

==============================

Solicitud de muestra:

POST /search HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
<<other header>>

name=sam&age=35

==============================

La última línea sobre "name = sam & age = 35" es el cuerpo del mensaje y contentType lo especifica como application / x-www-form-urlencoded ya que estamos pasando los parámetros del formulario en el cuerpo del mensaje. Sin embargo, no estamos limitados a solo enviar los parámetros, podemos enviar json, xml, ... de esta manera (enviar diferentes tipos de datos es especialmente útil con los servicios web RESTful):

==============================

Solicitud de muestra:

POST /orders HTTP/1.1
Content-Type: application/xml
<<other header>>

<order>
   <total>$199.02</total>
   <date>December 22, 2008 06:56</date>
...
</order>

==============================

Entonces el ContentType esta vez es: application / xml, porque eso es lo que estamos enviando. Los ejemplos anteriores mostraron una solicitud de muestra, de manera similar, la respuesta enviada desde el servidor también puede tener el encabezado Content-Type que especifica lo que el servidor envía de esta manera:

==============================

respuesta de muestra:

HTTP/1.1 201 Created
Content-Type: application/xml
<<other headers>>

<order id="233">
   <link rel="self" href="http://example.com/orders/133"/>
   <total>$199.02</total>
   <date>December 22, 2008 06:56</date>
...
</order>

==============================

  • dataTypeespecifica el formato de respuesta a esperar. Está relacionado con el encabezado Aceptar. JQuery intentará inferirlo en función del tipo de contenido de la respuesta.

==============================

Solicitud de muestra:

GET /someFolder/index.html HTTP/1.1
Host: mysite.org
Accept: application/xml
<<other headers>>

==============================

La solicitud anterior está esperando XML del servidor.

Con respecto a su pregunta,

contentType: "application/json; charset=utf-8",
dataType: "json",

Aquí está enviando datos json utilizando el juego de caracteres UTF8, y espera recibir datos json del servidor. Según los documentos de JQuery para dataType,

El tipo json analiza el archivo de datos recuperados como un objeto JavaScript y devuelve el objeto construido como los datos del resultado.

Entonces, lo que obtienes en el controlador de éxito es el objeto javascript adecuado (JQuery convierte el objeto json por ti)

mientras

contentType: "application/json",
dataType: "text",

Aquí está enviando datos json, ya que no ha mencionado la codificación, según los documentos de JQuery,

Si no se especifica un juego de caracteres, los datos se transmitirán al servidor utilizando el juego de caracteres predeterminado del servidor; debe decodificar esto adecuadamente en el lado del servidor.

y dado que dataType se especifica como texto, lo que obtienes en el controlador de éxito es texto sin formato, según los documentos para dataType,

Los tipos de texto y xml devuelven los datos sin procesamiento. Los datos simplemente se pasan al controlador de éxito

era nash
fuente
7

según los documentos :

  • "json": Evalúa la respuesta como JSON y devuelve un objeto JavaScript. En jQuery 1.4, los datos JSON se analizan de manera estricta; cualquier JSON con formato incorrecto se rechaza y se genera un error de análisis. (Consulte json.org para obtener más información sobre el formato JSON adecuado).
  • "text": Una cadena de texto sin formato.
SilentGhost
fuente
2

El cargador jQuery Ajax no funciona bien cuando llama a dos API simultáneamente. Para resolver este problema, debe llamar a las API una por una utilizando la isAsyncpropiedad en la configuración de Ajax. También debe asegurarse de que no haya ningún error en la configuración. De lo contrario, el cargador no funcionará. Por ejemplo, tipo de contenido indefinido, tipo de datos para llamadas POST / PUT / DELETE / GET.

Atif Hussain
fuente
Si proporciona una mejor descripción, esta es una buena respuesta ... por favor ponga más información en esta publicación.
wahwahwah