$ .ajax - dataType

135

Qual é a diferença entre

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

vs.

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

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);
}
Nick Craver
fonte
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

era nash
fonte
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.
SilentGhost
fonte
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.

Atif Hussain
fonte
Se você fornecer uma descrição melhor, esta é uma boa resposta ... por favor, coloque mais informações neste post.
Wahwahwah 2/03