$ .ajax - dataType


135

В чем разница между

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

против

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

Ответы:


181
  • contentTypeHTTP- заголовок, отправляемый на сервер, с указанием определенного формата.
    Пример: я отправляю 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 - Прямого ответа нет, зависит от того, что вы хотите сделать с результатом ... они делают две разные вещи. В идеале, если это не очень простой результат, вы, вероятно, захотите иметь дело с JSON, и в этом случае первый будет проще.
Ник Крейвер

2
Муса прав, contentType указывает, какой формат мы отправляем на сервер (т.е. тело сообщения), а не тот, который запрашивается обратно.
Антином

@antinome эти 2, как правило, очень объединены, это имеет значение здесь, на примере переполнения стека во многих местах. Строго говоря, они независимы, я обновил, чтобы отразить это.
Ник Крейвер

Там все еще нет места, где я могу найти то, что по умолчанию, я имею в виду, что я собираюсь вручную и перестраиваю объект после каждого вызова, но при перезагрузке у меня возникают проблемы. если я установлю его на «json» по умолчанию, это никоим образом не дополнит интеллектуальное предположение, но оно будет работать до определенной степени, пока не дойдет до вызова, где я не указал (это НЕ сам вызов JSON), тогда если я установлю его на пустую строку, или ноль, это, кажется, сломать все. Могу ли я установить что-то вроде «по умолчанию» или f'in «Intellgent Guess» ради f? ЧТО ТАКОЕ техническое значение по умолчанию, т.е. как определить между двумя кавычками dataType = ""?
Буб

51

(пс: ответ Ника Крэйвера неверен)

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 попытается вывести его на основе Content-Type ответа.

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

Пример запроса:

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,

Типы text и 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.


Если вы предоставите лучшее описание, это хороший ответ ... пожалуйста, добавьте больше информации в этот пост.
вауахва
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.