$ .ajax - dataType


135

Qual é a diferença entre

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

vs.

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

Respostas:


181
  • contentTypeé o cabeçalho HTTP enviado ao servidor, especificando um formato específico.
    Exemplo: estou enviando JSON ou XML
  • dataTypevocê está dizendo ao jQuery que tipo de resposta esperar.
    Esperando JSON, XML ou HTML, etc. O padrão é o jQuery tentar descobrir isso.

A $.ajax()documentação também possui descrições completas.


No seu caso particular, o primeiro está pedindo a resposta para a UTF-8, o segundo não se importa. Além disso, o primeiro trata a resposta como um objeto JavaScript, o segundo a trata como uma string.

Então o primeiro seria:

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

O segundo:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}

1
qual é a maneira mais preferida ou mais recomendada.
— Nick Kahn

1
@ Adu - Nenhuma resposta direta para isso depende do que você quer fazer com o resultado ... eles estão fazendo duas coisas diferentes. Idealmente, a menos que seja um resultado muito simples, você provavelmente desejará lidar com o JSON. Nesse caso, o primeiro seria mais fácil.
— Nick Craver

2
Musa está certo, contentType indica o formato que estamos enviando para o servidor (ou seja, o corpo da postagem), não o que é solicitado de volta.
— Antinome

@antinome esses 2 geralmente são muito unidos, isso importa aqui no Stack Overflow em muitos lugares, por exemplo. Estritamente falando, eles são independentes, eu atualizei para refletir isso.
— Nick Craver

Ainda não há um local para encontrar o que é padrão, quero dizer, estou indo para o manual e reconstruindo o objeto após cada chamada, mas, ao redefinir, estou tendo problemas. se eu defini-lo como 'json' como padrão, isso de forma alguma complementará o palpite inteligente, mas funcionará até certo ponto, até chegar à chamada onde eu não especifiquei (que NÃO é uma chamada JSON), então se eu defini-lo como string vazia, ou null, parece que tudo está quebrado. posso definir algo como 'default' ou f'in 'Intellgent Guess' por causa de f? Qual é o padrão técnico, ou seja, como definir entre duas aspas dataType = ""?
— blamb

51

(ps: a resposta dada por Nick Craver está incorreta)

contentType especifica o formato dos dados enviados ao servidor como parte da solicitação (eles também podem ser enviados como parte da resposta, mais sobre isso posteriormente).

dataType especifica o formato esperado de dados a serem recebidos pelo cliente (navegador).

Ambos não são intercambiáveis.

  • contentTypeé o cabeçalho enviado ao servidor, especificando o formato dos dados (isto é, o conteúdo do corpo da mensagem) que está sendo enviado ao servidor. Isso é usado com solicitações POST e PUT. Normalmente, quando você envia uma solicitação POST, o corpo da mensagem é composto por parâmetros passados, como:

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

Pedido de amostra:

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

name=sam&age=35

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

A última linha acima "name = sam & age = 35" é o corpo da mensagem e contentType especifica-o como application / x-www-form-urlencoded, pois estamos passando os parâmetros do formulário no corpo da mensagem. No entanto, não estamos limitados a apenas enviar os parâmetros, podemos enviar json, xml, ... assim (enviar diferentes tipos de dados é especialmente útil nos serviços da web RESTful):

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

Pedido de amostra:

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

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

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

Portanto, o ContentType desta vez é: application / xml, porque é isso que estamos enviando. Os exemplos acima mostraram uma solicitação de amostra. Da mesma forma, a resposta enviada do servidor também pode ter o cabeçalho Content-Type especificando o que o servidor está enviando assim:

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

resposta da amostra:

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 o formato da resposta a esperar. Está relacionado ao cabeçalho Accept. O JQuery tentará deduzi-lo com base no tipo de conteúdo da resposta.

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

Pedido de amostra:

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

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

A solicitação acima está esperando XML do servidor.

Quanto à sua pergunta,

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

Aqui você está enviando dados json usando o conjunto de caracteres UTF8 e espera retornar dados json do servidor. De acordo com os documentos JQuery para dataType,

O tipo json analisa o arquivo de dados buscado como um objeto JavaScript e retorna o objeto construído como os dados do resultado.

Portanto, o que você obtém no manipulador de sucesso é o objeto javascript adequado (o JQuery converte o objeto json para você)

enquanto que

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

Aqui você está enviando dados json, pois não mencionou a codificação, conforme os documentos do JQuery,

Se nenhum conjunto de caracteres for especificado, os dados serão transmitidos ao servidor usando o conjunto de caracteres padrão do servidor; você deve decodificar isso adequadamente no lado do servidor.

e como dataType é especificado como texto, o que você obtém no manipulador de sucesso é texto sem formatação, conforme os documentos para dataType,

Os tipos de texto e xml retornam os dados sem processamento. Os dados são simplesmente transmitidos ao manipulador de sucesso


7

conforme documentos :

  • "json": Avalia a resposta como JSON e retorna um objeto JavaScript. No jQuery 1.4, os dados JSON são analisados ​​de maneira estrita; qualquer JSON malformado é rejeitado e um erro de análise é gerado. (Consulte json.org para obter mais informações sobre a formatação JSON adequada.)
  • "text": Uma sequência de texto simples.

2

O carregador do jQuery Ajax não está funcionando bem quando você chama duas APIs simultaneamente. Para resolver esse problema, é necessário chamar as APIs uma por uma usando a isAsyncpropriedade na configuração Ajax. Você também precisa garantir que não haja nenhum erro na configuração. Caso contrário, o carregador não funcionará. Por exemplo, tipo de conteúdo indefinido e tipo de dados para chamadas POST / PUT / DELETE / GET.


Se você fornecer uma descrição melhor, esta é uma boa resposta ... por favor, coloque mais informações neste post.
— Wahwahwah 2/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.