$ .ajax - тип даних


135

Яка різниця між

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

vs.

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

Відповіді:


181
  • contentTypeє заголовком HTTP, що надсилається на сервер із зазначенням конкретного формату.
    Приклад: я надсилаю JSON або XML
  • dataTypeВи кажете jQuery, якої відповіді очікувати.
    Очікуючи JSON, або XML, або HTML тощо. За замовчуванням jQuery спробує розібратися.

$.ajax()Документація має повний опис цих , а також.


У вашому конкретному випадку, перший просимо для відповіді бути в UTF-8, то другий не дбають. Також перший трактує відповідь як об’єкт JavaScript, другий - трактує її як рядок.

Тож першим було б:

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

Секунда:

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

1
який із них є найбільш бажаним способом або найбільш рекомендується.
Нік Кан

1
@Adu - Немає прямої відповіді на це, залежить, що ти хочеш зробити з результатом ... вони роблять 2 різні речі. В ідеалі, якщо це не дуже простий результат, ви, мабуть, хочете мати справу з JSON, і в цьому випадку перший буде простішим.
Нік Крейвер

2
Musa має рацію, contentType вказує, який формат ми надсилаємо на сервер (тобто орган поштового зв’язку), а не те, що запитується назад.
antinome

@antinome ці 2 зазвичай дуже приєднані, це важливо тут, на прикладі Stack Overflow. Власне кажучи, вони незалежні, я оновив це, щоб відобразити це.
Нік Крейвер

Все ще немає місця, де я можу знайти те, що є за замовчуванням, я маю на увазі, що я збираюся посібник, і відновити об'єкт після кожного дзвінка, але при перезавантаженні у них виникають проблеми. якщо я встановив його "json" за замовчуванням, жодним чином це не доповнить інтелектуальну здогадку, але воно працює певною мірою, поки не потрапить на виклик, де я не вказав (що НЕ є викликом JSON), то якщо я встановив його в порожній рядок або null, він, здається, все порушить. чи можу я встановити щось на кшталт "за замовчуванням" або f'in "Intellgent Guess" заради f? ЩО технічний дефолт, тобто як визначити між двома цитатами dataType = ""?
блам

51

(ps: відповідь, яку дав Нік Крейвер, невірна)

contentType визначає формат даних, що надсилаються серверу як частину запиту (він також може бути надісланий як частина відповіді, докладніше про це пізніше).

dataType вказує очікуваний формат даних, який повинен отримати клієнт (браузер).

Обидва не взаємозамінні.

  • contentTypeце заголовок, що надсилається серверу, із зазначенням формату даних (тобто вмісту тіла повідомлення), що надходять на сервер. Це використовується для POST та PUT-запитів. Зазвичай, коли ви надсилаєте POST-запит, тіло повідомлення складається з переданих параметрів, таких як:

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

Зразок запиту:

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

name=sam&age=35

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

Останній рядок над "name = sam & age = 35" - це тіло повідомлення, а contentType визначає його як application / x-www-form-urlencoded, оскільки ми передаємо параметри форми в тілі повідомлення. Однак ми не обмежуємось лише надсиланням параметрів, ми можемо надсилати json, xml, ... подібним чином (надсилання різних типів даних особливо корисно за допомогою RESTful веб-сервісів):

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

Зразок запиту:

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

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

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

Тож ContentType цього разу такий: application / xml, тому що ми надсилаємо це. Вищеописані приклади показали зразок запиту; аналогічно, відповідь, що надсилається з сервера, може також мати заголовок Content-Type із зазначенням того, що сервер надсилає так:

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

вибіркова відповідь:

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>

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

  • dataTypeзадає формат відповіді очікувати. Це пов'язано із заголовком Accept. JQuery спробує зробити висновок на основі типу вмісту відповіді.

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

Зразок запиту:

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

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

Вищеописаний запит очікує XML від сервера.

Що стосується вашого питання,

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

Тут ви надсилаєте дані json за допомогою набору символів UTF8, і ви очікуєте повернення даних json з сервера. Відповідно до документів JQuery для dataType,

Тип json аналізує отриманий файл даних як об’єкт JavaScript і повертає сконструйований об'єкт як дані результату.

Отже, те, що ви отримуєте в обробнику успіху, - це належний об’єкт JavaScript (JQuery перетворює об’єкт json для вас)

тоді як

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

Тут ви надсилаєте дані json, оскільки ви не згадали про кодування згідно з документами JQuery,

Якщо діаграма не вказана, дані будуть передані серверу за допомогою типової схеми сервера; Ви повинні розшифрувати це відповідним чином на стороні сервера.

а оскільки dataType вказаний як текст, то, що ви отримуєте в обробці успіху, це звичайний текст, згідно з документами для dataType,

Типи тексту та xml повертають дані без обробки. Дані просто передаються обробнику успіху


7

відповідно до документів :

  • "json": Оцінює відповідь як JSON і повертає об’єкт JavaScript. У jQuery 1.4 дані JSON строго розбираються; будь-який неправильно сформований JSON відхиляється і видається помилка розбору. (Див. Json.org для отримання додаткової інформації щодо правильного форматування JSON.)
  • "text": Простий текстовий рядок.

2

Навантажувач jQuery Ajax працює не так добре, коли ви дзвоните два API одночасно. Щоб вирішити цю проблему, вам потрібно зателефонувати API один за одним, використовуючи isAsyncвластивість у налаштуваннях Ajax. Вам також потрібно переконатися, що в налаштуваннях не повинно бути помилок. В іншому випадку навантажувач не працюватиме. Наприклад, невизначений тип вмісту, тип даних для виклику POST / PUT / DELETE / GET.


Якщо ви надасте кращий опис, це хороша відповідь ... будь ласка, покладіть більше інформації в цьому пості.
wahwahwah
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.