$ .ajax - typ danych

135

Jaka jest różnica pomiędzy

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

vs.

contentType: "application/json",
dataType: "text",
Nick Kahn
źródło

Odpowiedzi:

181
  • contentTypeto nagłówek HTTP wysłany do serwera, określający określony format.
    Przykład: wysyłam JSON lub XML
  • dataTypeczy mówisz jQuery, jakiej odpowiedzi możesz się spodziewać.
    Oczekiwanie na JSON, XML, HTML itp. Domyślnie jQuery próbuje to rozgryźć.

$.ajax()Dokumentacja ma pełne opisy tych również.


W danym przypadku, pierwszy prosi dla odpowiedź będzie w UTF-8drugi nie obchodzi. Również pierwsza traktuje odpowiedź jako obiekt JavaScript, a druga traktuje ją jako ciąg.

Więc pierwsze byłoby:

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

Drugi:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}
Nick Craver
źródło
1
który jest bardziej preferowany lub najbardziej polecany.
Nick Kahn
1
@Adu - Brak bezpośredniej odpowiedzi, zależy od tego, co chcesz zrobić z wynikiem ... robią 2 różne rzeczy. Idealnie, chyba że jest to bardzo prosty wynik, prawdopodobnie chcesz mieć do czynienia z JSON, w którym to przypadku pierwszy byłby łatwiejszy.
Nick Craver
2
Musa ma rację, contentType wskazuje, jaki format wysyłamy do serwera (np. Treść wiadomości), a nie to, co jest żądane z powrotem.
antinome,
@antinome te 2 są zwykle bardzo połączone, ma to znaczenie w wielu miejscach na przykład w Stack Overflow. Ściśle mówiąc, są niezależni, zaktualizowałem to, aby to odzwierciedlić.
Nick Craver
Wciąż nie ma miejsca, w którym mógłbym znaleźć to, co jest domyślne, mam na myśli przechodzenie ręcznie i odbudowywanie obiektu po każdym wywołaniu, ale podczas resetowania mam problemy. jeśli ustawię ją na „json” jako domyślną, w żaden sposób nie będzie to uzupełniać inteligentnego zgadywania, ale działa do pewnego stopnia, dopóki nie dotrze do wywołania, w którym nie zostałem określony (to NIE jest samo wywołanie JSON), a następnie jeśli ustawię go na pusty łańcuch lub null, wydaje się, że wszystko zepsuje. czy mogę ustawić coś takiego jak „default” lub f'in „Intellgent Guess” na miłość boską? JAKIE jest techniczne domyślne domyślne, tj. Jak zdefiniowano między dwoma cudzysłowami dataType = ""?
jagnię
51

(ps: odpowiedź udzielona przez Nicka Cravera jest nieprawidłowa)

contentType określa format danych wysyłanych do serwera w ramach żądania (można je przesłać również w ramach odpowiedzi, o czym później).

dataType określa oczekiwany format danych, które mają być odbierane przez klienta (przeglądarkę).

Obie nie są wymienne.

  • contentTypeto nagłówek wysyłany do serwera, określający format danych (tj. treść wiadomości) trafiających na serwer. Jest to używane z żądaniami POST i PUT. Zwykle, gdy wysyłasz żądanie POST, treść wiadomości składa się z przekazanych parametrów, takich jak:

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

Prośba o próbkę:

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

name=sam&age=35

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

Ostatni wiersz powyżej „name = sam & age = 35” to treść wiadomości, a contentType określa ją jako application / x-www-form-urlencoded, ponieważ przekazujemy parametry formularza w treści wiadomości. Nie ograniczamy się jednak tylko do wysyłania parametrów, możemy wysyłać json, xml, ... w ten sposób (wysyłanie różnych typów danych jest szczególnie przydatne w przypadku usług internetowych RESTful):

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

Prośba o próbkę:

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

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

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

Więc tym razem ContentType to: application / xml, bo to właśnie wysyłamy. Powyższe przykłady pokazały przykładowe żądanie, podobnie odpowiedź wysłana z serwera może mieć również nagłówek Content-Type określający, co serwer wysyła w następujący sposób:

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

przykładowa odpowiedź:

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>

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

  • dataTypeokreśla oczekiwany format odpowiedzi. Jest to związane z nagłówkiem Accept. JQuery spróbuje to wywnioskować na podstawie typu treści odpowiedzi.

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

Prośba o próbkę:

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

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

Powyższe żądanie oczekuje XML z serwera.

Jeśli chodzi o twoje pytanie,

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

Tutaj wysyłasz dane json przy użyciu zestawu znaków UTF8 i oczekujesz zwrotnych danych json z serwera. Zgodnie z dokumentacją JQuery dla typu dataType,

Typ json analizuje pobrany plik danych jako obiekt JavaScript i zwraca skonstruowany obiekt jako dane wynikowe.

Więc to, co otrzymujesz w programie obsługi sukcesu, to odpowiedni obiekt javascript (JQuery konwertuje obiekt json za Ciebie)

natomiast

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

Tutaj wysyłasz dane json, ponieważ nie wspomniałeś o kodowaniu, zgodnie z dokumentacją JQuery,

Jeśli nie określono zestawu znaków, dane będą przesyłane na serwer przy użyciu domyślnego zestawu znaków serwera; musisz to odpowiednio zdekodować po stronie serwera.

a ponieważ dataType jest określona jako tekst, w programie obsługi sukcesu otrzymujesz zwykły tekst, zgodnie z dokumentacją dla dataType,

Typy text i xml zwracają dane bez przetwarzania. Dane są po prostu przekazywane do programu obsługującego sukces

era Nasha
źródło
7

zgodnie z dokumentami :

  • "json": Ocenia odpowiedź jako JSON i zwraca obiekt JavaScript. W jQuery 1.4 dane JSON są analizowane w ścisły sposób; każdy źle sformułowany kod JSON jest odrzucany i generowany jest błąd analizy. (Więcej informacji na temat prawidłowego formatowania JSON można znaleźć w witrynie json.org).
  • "text": Zwykły ciąg tekstowy.
SilentGhost
źródło
2

Moduł ładujący jQuery Ajax nie działa dobrze, gdy wywołujesz jednocześnie dwa interfejsy API. Aby rozwiązać ten problem, musisz wywoływać interfejsy API jeden po drugim, używając isAsyncwłaściwości w ustawieniu Ajax. Musisz również upewnić się, że nie powinno być żadnych błędów w ustawieniach. W przeciwnym razie ładowarka nie będzie działać. Np. Niezdefiniowany typ zawartości, typ danych dla wywołania POST / PUT / DELETE / GET.

Atif Hussain
źródło
Jeśli podasz lepszy opis, to jest dobra odpowiedź ... podaj więcej informacji w tym poście.
wahwahwah