Разница между заголовками HTTP Accept и Content-Type

119

Таким образом, Acceptзаголовок сообщает серверу MIME-тип ресурса, который ищет браузер. Например, сервер может отправлять обычный текст, HTML, JSON и т. Д.

Хорошо, это имеет смысл, но когда я смотрю на Content-Typeзаголовок и он, кажется, делает то же самое. Например, он сообщает серверу, что ему нужен текст или JSON.

Так в чем же разница между заголовками HTTP Acceptи Content-TypeHTTP?

JohnMerlino
источник

Ответы:

155

Как вы правильно заметили, заголовок Accept используется HTTP-клиентами, чтобы сообщить серверу, какие типы контента они будут принимать. Затем сервер отправит обратно ответ, который будет включать заголовок Content-Type, сообщающий клиенту, какой тип содержимого на самом деле является возвращаемым содержимым.

Однако, как вы могли заметить, HTTP-запросы также могут содержать заголовки Content-Type. Почему? Хорошо, подумайте о запросах POST или PUT . С этими типами запросов клиент на самом деле отправляет пакет данных на сервер как часть запроса, а заголовок Content-Type сообщает серверу, что это за данные на самом деле (и, таким образом, определяет, как сервер их проанализирует).

В частности, для POST-запроса, полученного в результате отправки формы HTML, Content-Type запроса (обычно) будет одним из стандартных типов содержимого формы , указанных ниже, как указано в enctypeатрибуте <form>тега:

  • application/x-www-form-urlencoded (по умолчанию, более старый, более простой, немного меньше накладных расходов для небольших объемов простого текста ASCII, без поддержки загрузки файлов)
  • multipart/form-data (новее, добавлена ​​поддержка загрузки файлов, более эффективен для больших объемов двоичных данных или не-ASCII текста)
Илмари Каронен
источник
22
  • Принять : это то, что браузер может переварить, например, все языки, которые кто-то может понять.
  • Тип контента : это какой формат фактических данных, например, на каком языке кто-то говорит. Поскольку компьютеры не могут (ну, теперь они могут) распознавать другие типы, такие как люди могут сказать: «О, он немец!» или "она говорит по-китайски!"
ionFish
источник
1
Не обязательно браузер, но любой http-клиент.
Джим Ахо
20

Принять это как

Вот мой запрос, и я хотел бы (принять) этот формат ответа

Тип контента как

Вот мой запрос (или ответ), а этот (Content-Type) - это формат содержимого, которое я отправляю в своем запросе (или ответе)

JRomio
источник
Я знаю, что опаздываю сюда, но мне любопытно, что произойдет, если формат ответа не будет отправлен сервером в формате «Принять»?
вопль
1
Это было бы до клиента, чтобы решить @shriek. Я предполагаю, что большинство http-клиентов (или браузеров) будут «разумно» смотреть на реальные данные и видеть, что это на самом деле. Может быть, один клиент мог бы также игнорировать ответ, если он должен быть JSON, но синтаксический анализ завершается неудачно, потому что кажется, что это что-то другое.
Джим Ахо
5

Это разговор запрос-ответ, поэтому клиент

  • отправляет запрос «Content-Type» и
  • ожидает получить ответ типа «Принять».
Waldemar
источник
Неправильно. Accept - заголовок запроса. Смотрите принятый ответ.
Даррон
2
@darron Нет, этот ответ правильный. Он не говорит, что это не заголовок запроса, он говорит, что его цель - сообщить серверу, какой ответ он ожидает получить. Отчасти лишний с другими ответами, но я думаю, что он самый лаконичный. +1.
Тодд Менье
0

принимать

HTTP-заголовок запроса Accept сообщает, какие типы контента, выраженные в виде MIME-типов, может понять клиент. Используя согласование содержимого, сервер затем выбирает одно из предложений, использует его и информирует клиента о своем выборе с помощью заголовка ответа Content-Type. Браузеры устанавливают адекватные значения для этого заголовка в зависимости от контекста, в котором выполняется запрос: при извлечении таблицы стилей CSS для запроса устанавливается другое значение, чем при извлечении изображения, видео или сценария.

( источник: developer.mozilla.org )

Тип содержимого

Заголовок объекта Content-Type используется для указания типа мультимедиа ресурса.

В ответах заголовок Content-Type сообщает клиенту, каков тип содержимого возвращаемого содержимого. Браузеры в некоторых случаях выполняют анализ MIME и не обязательно будут следовать значению этого заголовка; чтобы предотвратить такое поведение, заголовок X-Content-Type-Options может быть установлен в nosniff.

В запросах (таких как POST или PUT) клиент сообщает серверу, какой тип данных фактически отправляется.

( источник: developer.mozilla.org )

Wlad
источник