Согласование содержания - Content negotiation

Согласование содержания относится к механизмам, определенным как часть HTTP которые позволяют обслуживать разные версии документа (или, в более общем смысле, представления ресурса) одновременно URI, так что пользовательские агенты могут указать, какая версия лучше всего соответствует их возможностям. Одним из классических способов использования этого механизма является обслуживание изображения в Гифка или же PNG формат, поэтому браузер, который не может отображать изображения PNG (например, MS Internet Explorer 4), будет обслуживать версию GIF.

Ресурс может быть доступен в нескольких различных представлениях; например, он может быть доступен на разных языках или на разных типах носителей. Один из способов выбора наиболее подходящего варианта - предоставить пользователю индексную страницу и позволить им выбрать наиболее подходящий вариант; однако часто можно автоматизировать выбор на основе некоторых критериев выбора.

Механизмы

HTTP обеспечивает несколько различных механизмов согласования контента, в том числе: управляемые сервером (или проактивные), управляемые агентом (или реактивные), прозрачные и / или гибридные их комбинации.

Управляемый сервером

Управляемое сервером или упреждающее согласование содержимого выполняется алгоритмами на сервере, которые выбирают среди возможных вариантов представления. Обычно это выполняется на основе критериев приемлемости, предоставляемых пользовательским агентом.

Подводя итог, как это работает, когда пользовательский агент отправляет запрос на сервер, пользовательский агент сообщает серверу, что типы медиа или другие аспекты представления контента, которые он понимает, с оценками того, насколько хорошо он их понимает. Точнее, пользовательский агент предоставляет Заголовки HTTP в котором перечислены приемлемые аспекты ресурса и факторы качества для них. После этого сервер может предоставить версию ресурса, которая наилучшим образом соответствует потребностям пользовательского агента.

Например, браузер может указать, что ему нужна информация на немецком языке, установив параметр Принять-язык так:

Принять-язык: de

Браузер может вместо этого сказать, что немецкий предпочтительнее, если это возможно, но этот английский также приемлем, установив:

Accept-Language: de; q = 1.0, en; q = 0,5

Где «q» - коэффициент качества для немецкого языка выше, чем для английского.

Несколько заголовков HTTP часто поставляются вместе для формата содержимого или, в частности, типа мультимедиа, языка и некоторых других аспектов ресурса. В дополнение к обычно используемым Принимать заголовок для типа носителя, Принять-язык заголовок для согласования языка, RFC 7231 также описывает Accept-Charset & Прием-кодировки для кодирования символов и кодирования содержимого (сжатия) соответственно.

Пример более сложного запроса: браузер отправляет заголовки о языке, указывающем, что немецкий язык является предпочтительным, но английский приемлем, как указано выше, и что, что касается форматов, HTML (текст / html) предпочтительнее других типов текста (текст/*), GIF (изображение / gif) или же JPEG (изображение / jpg) изображения предпочтительнее других форматов изображений (изображение/*), но любой другой тип носителя (*/*) принимается в крайнем случае:

Принять-язык:де;q = 1.0,en;q = 0,5Принимать:текст / html;q = 1.0,текст/*;q = 0,8,image / gif;q = 0,6,изображение / JPEG;q = 0,6,изображение/*;q = 0,5,*/*;q = 0,1

В дополнение к аспектам согласования контента, управляемого сервером, Тип содержимого и по язык указано в RFC 7231, есть расширения, определяющие другие аспекты согласования контента, например Memento который описывает использование Accept-Datetime заголовок для получения версии представления ресурса в определенные моменты времени[1] и IETF / W3C Согласование содержания по профилю[2] который описывает использование Принять-Профиль заголовок для получения представлений ресурсов, соответствующих профилям данных.

Ни один RFC 7231 ни более поздние связанные спецификации, такие как Согласование содержания по профилю[2] укажите, как разрешить компромиссы в тех случаях, когда разные заголовки определяют противоречивые требования, например, в приведенном выше примере выбор между HTML-страницей на английском языке и изображением GIF на немецком языке.

Управляемый агентом

Управляемое агентом или реактивное согласование контента выполняется с помощью алгоритмов в пользовательском агенте, которые выбирают среди возможных вариантов представления. Обычно это выполняется на основе предоставленного сервером списка представлений и метаданных о них.

Подводя итог, как это работает, когда пользовательский агент отправляет запрос на сервер, сервер информирует пользовательского агента, какие представления он имеет, а также любые метаданные, которые он имеет о каждом представлении (например, тип содержимого, качество, язык, так далее.). Затем пользовательский агент повторно отправляет запрос на определенный URL-адрес для выбранного представления. Это может быть автоматически выбран пользовательским агентом, или пользовательский агент может предоставить пользователю варианты выбора, и пользователь может выбрать их напрямую. Точнее, сервер отвечает либо 300 множественным выбором, либо 406 неприемлемо (когда предоставленные сервером критерии приема предоставлены агентом пользователя, но сервер не может автоматически сделать выбор). К сожалению, HTTP оставляет неопределенным формат списка представлений и метаданных вместе с механизмами выбора.


Рекомендации

  1. ^ Memento: Добавление времени в Интернет. Mementoweb.org. Проверено 8 сентября 2013.
  2. ^ а б «Консорциум World Wide Web (W3C),« Согласование содержания по профилю », рабочий проект W3C, 26 ноября 2019 г.».

внешняя ссылка


Эта статья частично основана на эта страница, авторские права на который принадлежат Apache Foundation, но выпущены под бесплатной лицензией.