$ .ajax - Datentyp

135

Was ist der Unterschied zwischen

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

vs.

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

Antworten:

181
  • contentTypeist der an den Server gesendete HTTP- Header , der ein bestimmtes Format angibt.
    Beispiel: Ich sende JSON oder XML
  • dataTypeSagen Sie jQuery, welche Art von Antwort zu erwarten ist?
    Erwarten von JSON, XML, HTML usw. Standardmäßig versucht jQuery, dies herauszufinden.

Die $.ajax()Dokumentation enthält auch vollständige Beschreibungen dieser.


In Ihrem Fall ist die erste Bitte um die Antwort in sein UTF-8, wird die zweite nicht. Der erste behandelt die Antwort als JavaScript-Objekt, der zweite behandelt sie als Zeichenfolge.

Das erste wäre also:

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

Der Zweite:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}
Nick Craver
quelle
1
Welches ist der bevorzugte Weg oder am meisten zu empfehlen.
Nick Kahn
1
@Adu - Keine direkte Antwort darauf, hängt davon ab, was Sie mit dem Ergebnis machen wollen ... sie machen 2 verschiedene Dinge. Wenn es sich nicht um ein sehr einfaches Ergebnis handelt, möchten Sie sich im Idealfall wahrscheinlich mit JSON befassen. In diesem Fall wäre das erste einfacher.
Nick Craver
2
Musa hat recht, contentType gibt an, welches Format wir an den Server senden (dh Post-Body), nicht was zurück angefordert wird.
Antinom
@antinome diese 2 sind in der Regel sehr verbunden, es ist hier auf Stack Overflow an vielen Stellen Beispiel wichtig. Genau genommen sind sie unabhängig, ich habe aktualisiert, um dies widerzuspiegeln.
Nick Craver
Es gibt immer noch keinen Ort, an dem ich die Standardeinstellungen finden kann. Ich meine, ich gehe manuell und erstelle das Objekt nach jedem Aufruf neu, aber beim Zurücksetzen habe ich Probleme. Wenn ich es als Standard auf 'json' setze, wird dies in keiner Weise die intelligente Vermutung ergänzen, aber es funktioniert bis zu einem gewissen Grad, bis es zu dem Aufruf kommt, bei dem ich nicht angegeben habe (das ist KEIN JSON-Aufruf selbst) Wenn ich es auf leere Zeichenfolge oder null setze, scheint es alles zu brechen. Kann ich für f etwas auf "Standard" oder "Intelligent Guess" setzen? WAS ist der technische Standard, dh wie zwischen zwei Anführungszeichen definiert dataType = ""?
Blamb
51

(ps: die Antwort von Nick Craver ist falsch)

contentType gibt das Format der Daten an, die als Teil der Anforderung an den Server gesendet werden (sie können auch als Teil der Antwort gesendet werden, dazu später mehr).

dataType gibt das erwartete Format der Daten an, die vom Client (Browser) empfangen werden sollen.

Beide sind nicht austauschbar.

  • contentTypeist der an den Server gesendete Header, der das Format der Daten (dh den Inhalt des Nachrichtentexts) angibt, die an den Server gesendet werden. Dies wird bei POST- und PUT-Anforderungen verwendet. Wenn Sie eine POST-Anfrage senden, besteht der Nachrichtentext normalerweise aus übergebenen Parametern wie:

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

Musteranfrage:

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

name=sam&age=35

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

Die letzte Zeile über "name = sam & age = 35" ist der Nachrichtentext, und contentType gibt ihn als application / x-www-form-urlencoded an, da wir die Formularparameter im Nachrichtentext übergeben. Wir sind jedoch nicht nur auf das Senden der Parameter beschränkt, sondern können auch json, xml usw. senden (das Senden verschiedener Datentypen ist besonders bei RESTful-Webdiensten nützlich):

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

Musteranfrage:

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

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

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

Diesmal lautet der ContentType also: application / xml, denn genau das senden wir. Die obigen Beispiele zeigten eine Beispielanforderung. In ähnlicher Weise kann die vom Server gesendete Antwort auch den Content-Type-Header enthalten, der angibt, was der Server wie folgt sendet:

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

Beispielantwort:

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>

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

  • dataTypeGibt das zu erwartende Antwortformat an. Es bezieht sich auf Accept Header. JQuery wird versuchen, basierend auf dem Inhaltstyp der Antwort darauf zu schließen.

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

Musteranfrage:

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

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

Die obige Anfrage erwartet XML vom Server.

Was Ihre Frage betrifft,

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

Hier senden Sie JSON-Daten mit dem UTF8-Zeichensatz und erwarten JSON-Daten vom Server zurück. Gemäß den JQuery-Dokumenten für dataType

Der Typ json analysiert die abgerufene Datendatei als JavaScript-Objekt und gibt das erstellte Objekt als Ergebnisdaten zurück.

Was Sie also im Erfolgshandler erhalten, ist das richtige Javascript-Objekt (JQuery konvertiert das JSON-Objekt für Sie).

wohingegen

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

Hier senden Sie JSON-Daten, da Sie die Codierung gemäß den JQuery-Dokumenten nicht erwähnt haben.

Wenn kein Zeichensatz angegeben ist, werden Daten mit dem Standardzeichensatz des Servers an den Server übertragen. Sie müssen dies auf der Serverseite entsprechend dekodieren.

und da dataType als Text angegeben ist, erhalten Sie im Erfolgshandler einfachen Text gemäß den Dokumenten für dataType.

Die Text- und XML-Typen geben die Daten ohne Verarbeitung zurück. Die Daten werden einfach an den Success Handler weitergegeben

Nash-Ära
quelle
7

gemäß Dokumentation :

  • "json": Wertet die Antwort als JSON aus und gibt ein JavaScript-Objekt zurück. In jQuery 1.4 werden die JSON-Daten streng analysiert. Jeder fehlerhafte JSON wird zurückgewiesen und ein Analysefehler wird ausgelöst. (Weitere Informationen zur korrekten JSON-Formatierung finden Sie unter json.org.)
  • "text": Eine einfache Textzeichenfolge.
SilentGhost
quelle
2

Der jQuery Ajax Loader funktioniert nicht gut, wenn Sie zwei APIs gleichzeitig aufrufen. Um dieses Problem zu beheben, müssen Sie die APIs nacheinander mithilfe der isAsyncEigenschaft in der Ajax-Einstellung aufrufen . Sie müssen auch sicherstellen, dass die Einstellung keinen Fehler enthält. Andernfalls funktioniert der Lader nicht. ZB undefinierter Inhaltstyp, Datentyp für POST / PUT / DELETE / GET-Aufruf.

Atif Hussain
quelle
Wenn Sie eine bessere Beschreibung geben, ist dies eine gute Antwort ... bitte fügen Sie weitere Informationen in diesen Beitrag ein.
Wahwahwah