$ .ajax - type de données

135

Quelle est la différence entre

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

contre.

contentType: "application/json",
dataType: "text",
Nick Kahn
la source

Réponses:

181
  • contentTypeest l'en- tête HTTP envoyé au serveur, spécifiant un format particulier.
    Exemple: j'envoie du JSON ou du XML
  • dataTypeest-ce que vous dites à jQuery quel type de réponse attendre.
    Attente de JSON, XML, ou HTML, etc. La valeur par défaut est que jQuery essaie de le comprendre.

La $.ajax()documentation en contient également une description complète.


Le premier est dans votre cas particulier, demander la réponse soit dans UTF-8la seconde ne se soucie pas. De plus, le premier traite la réponse comme un objet JavaScript, le second va la traiter comme une chaîne.

Donc le premier serait:

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

La deuxième:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}
Nick Craver
la source
1
lequel est le moyen le plus préféré ou le plus recommandé.
Nick Kahn
1
@Adu - Pas de réponse directe à cela, cela dépend de ce que vous voulez faire avec le résultat ... ils font 2 choses différentes. Idéalement, à moins que ce ne soit un résultat très simple, vous voudrez probablement avoir affaire à JSON, auquel cas le premier serait plus facile.
Nick Craver
2
Musa a raison, contentType indique le format que nous envoyons au serveur (c'est-à-dire le corps du message), pas ce qui est demandé.
antinome du
@antinome ces 2 sont généralement très joints, c'est important ici sur Stack Overflow par exemple à de nombreux endroits. À proprement parler, ils sont indépendants, j'ai mis à jour pour refléter cela.
Nick Craver
Il n'y a toujours pas d'endroit où je peux trouver ce qui est par défaut, je veux dire que je vais manuellement et que je reconstruis l'objet après chaque appel, mais lors de la réinitialisation, j'ai des problèmes. si je le règle sur `` json '' par défaut, cela ne complétera en aucun cas la supposition intelligente, mais cela fonctionne dans une certaine mesure, jusqu'à ce qu'il atteigne l'appel où je n'ai pas spécifié (ce n'est PAS un appel JSON lui-même), alors si je le mets sur une chaîne vide ou null, il semble tout casser. puis-je définir quelque chose comme "par défaut" ou f'in "Intellgent Guess" pour l'amour de f? QUEL est le défaut technique, c'est-à-dire défini entre deux guillemets dataType = ""?
blamb
51

(ps: la réponse donnée par Nick Craver est incorrecte)

contentType spécifie le format des données envoyées au serveur dans le cadre de la requête (il peut également être envoyé dans le cadre de la réponse, plus à ce sujet plus tard).

dataType spécifie le format attendu des données à recevoir par le client (navigateur).

Les deux ne sont pas interchangeables.

  • contentTypeest l'en-tête envoyé au serveur, spécifiant le format des données (c'est-à-dire le contenu du corps du message) étant au serveur. Ceci est utilisé avec les requêtes POST et PUT. Habituellement, lorsque vous envoyez une requête POST, le corps du message comprend des paramètres passés tels que:

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

Demande d'échantillon:

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

name=sam&age=35

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

La dernière ligne au-dessus de "name = sam & age = 35" est le corps du message et contentType le spécifie comme application / x-www-form-urlencoded puisque nous transmettons les paramètres du formulaire dans le corps du message. Cependant, nous ne sommes pas limités à simplement envoyer les paramètres, nous pouvons envoyer json, xml, ... comme ceci (l'envoi de différents types de données est particulièrement utile avec les services Web RESTful):

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

Demande d'échantillon:

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

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

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

Donc, le ContentType cette fois est: application / xml, car c'est ce que nous envoyons. Les exemples ci-dessus ont montré un exemple de demande, de même la réponse envoyée par le serveur peut également avoir l'en-tête Content-Type spécifiant ce que le serveur envoie comme ceci:

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

exemple de réponse:

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>

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

  • dataTypespécifie le format de réponse à attendre. Son lié à l'en-tête Accept. JQuery essaiera de l'inférer en fonction du Content-Type de la réponse.

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

Demande d'échantillon:

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

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

La demande ci-dessus attend du XML du serveur.

Concernant votre question,

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

Ici, vous envoyez des données json à l'aide du jeu de caractères UTF8, et vous attendez des données json du serveur. Selon la documentation JQuery pour dataType,

Le type json analyse le fichier de données extrait en tant qu'objet JavaScript et retourne l'objet construit en tant que données de résultat.

Donc, ce que vous obtenez dans le gestionnaire de succès est un objet javascript approprié (JQuery convertit l'objet json pour vous)

tandis que

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

Ici, vous envoyez des données json, puisque vous n'avez pas mentionné l'encodage, selon la documentation JQuery,

Si aucun jeu de caractères n'est spécifié, les données seront transmises au serveur en utilisant le jeu de caractères par défaut du serveur; vous devez le décoder de manière appropriée côté serveur.

et comme dataType est spécifié en tant que texte, ce que vous obtenez dans le gestionnaire de succès est du texte brut, comme indiqué dans la documentation pour dataType,

Les types text et xml renvoient les données sans traitement. Les données sont simplement transmises au gestionnaire de succès

ère nash
la source
7

selon docs :

  • "json": Évalue la réponse en tant que JSON et renvoie un objet JavaScript. Dans jQuery 1.4, les données JSON sont analysées de manière stricte; tout JSON mal formé est rejeté et une erreur d'analyse est générée. (Voir json.org pour plus d'informations sur le formatage JSON approprié.)
  • "text": Une chaîne de texte brut.
SilentGhost
la source
2

Le chargeur jQuery Ajax ne fonctionne pas correctement lorsque vous appelez deux API simultanément. Pour résoudre ce problème, vous devez appeler les API une par une à l'aide de la isAsyncpropriété dans le paramètre Ajax. Vous devez également vous assurer qu'il ne devrait y avoir aucune erreur dans le réglage. Sinon, le chargeur ne fonctionnera pas. Par exemple, type de contenu non défini, type de données pour l'appel POST / PUT / DELETE / GET.

Atif Hussain
la source
Si vous fournissez une meilleure description, c'est une bonne réponse ... veuillez mettre plus d'informations dans cet article.
wahwahwah