HTTP/1.1, протокол передачи гипертекста
12 Обсуждение содержимого (Content Negotiation).
Большинство HTTP ответов включают объект, который содержит информацию, предназначенную для интерпретации пользователем. Естественно желание обеспечить пользователя "лучшим доступным" объектом, соответствующим запросу. К сожалению для серверов и кэшей, не все пользователи имеют одиннаковые предпочтения, и не все агенты пользователя одинаково способны к визуализации всех типов объектов. По этой причине, HTTP имеет средства для нескольких механизмов "обсуждения содержимого" - процесса выбора самого лучшего представления для данного ответа, когда доступно несколько представлений.
Обратите внимание: Это не вызывается "обсуждение формата" ("format negotiation"), потому что альтернативные представления могут иметь одиннаковый медиа тип, но использовать различные возможности этого типа, иметь разные языки и т.д.
Любой ответ, содержащий тело объекта (entity-body) МОЖЕТ быть темой обсуждения, включая ошибочные ответы.
Имеются два вида обсуждения содержимого, которые возможны в HTTP: управляемое сервером и управляемое агентом обсуждение. Эти два вида обсуждения независимы, и, таким образом, могут использоваться отдельно или вместе. Один метод использования их вместе, упоминаемый как прозрачное обсуждение, происходит, когда кэш использует информацию обсуждения, управляемого агентом, предоставляя ее первоначальному серверу, для обеспечения управляемого сервером обсуждения при последующих запросах.
12.1 Управляемое сервером обсуждение.
Обсуждение называется управляемым сервером, если выбор самого лучшего представления для ответа произведен алгоритмом, размещенным на сервере. Выбор основан на доступных представлениях ответа (они могут различаться по нескольким характеристикам; например языку, кодированию содержимого (content-coding), и т.д.) и содержании специфических полей заголовка в сообщении запроса, или на другой информации, имеющей отношение к запросу (такой как сетевой адрес клиента).
Управляемое сервером обсуждение выгодно, когда алгоритм выбора из числа доступных представлений трудно описать агенту пользователя, или когда сервер желает послать "лучшее предположение" клиенту одновременно с первым ответом (надеясь избежать задержки пересылки туда и обратно последующего запроса, если "лучшее предположение" устроит пользователя). Чтобы улучшить предположение сервера, агент пользователя МОЖЕТ включать поля заголовка запроса (Accept, Accept-Language, Accept-Encoding, и т.д.), которые описывают предпочтительный ответ.
Управляемое сервером обсуждение имеет недостатки:
- Сервер не может точно определить, что могло бы быть "самым лучшим" для данного пользователя, так как это требует полного знания, как возможностей агента пользователя, так и целей использования ответа (например, пользователь хочет просматривать его на экране или печатать на бумаге?).
- Наличие описания возможностей агента пользователя в каждом запросе может быть очень неэффективным (при условии, что только небольшой процент ответов имеет несколько представлений) и потенциально нарушает секретность пользователя.
- Оно усложняет реализацию первоначального сервера и алгоритмов генерации ответов на запрос.
- Оно может ограничивать способность общего кэша использовать один и тот же ответ для запросов нескольких пользователей.
HTTP/1.1 включает следующие поля заголовка запроса (request-header), которые обеспечивают управляемое сервером обсуждение посредством описания возможностей агента пользователя и предпочтений самого пользователя: Accept (раздел 14.1), Accept-Charset (раздел 14.2), Accept-Encoding (раздел 14.3), Accept-Language (раздел 14.4), and User-Agent (раздел 14.42). Однако первоначальный сервер не ограничен этим и МОЖЕТ изменить ответ, основываясь на любом аспекте запроса, включая информацию, которая не содержится в полях заголовка запроса или информацию из расширенных полей заголовка, не определенных в этой спецификации.
Первоначальный сервер HTTP/1.1 ДОЛЖЕН включать соответствующее поле заголовка Vary (раздел 14.43) в любой кэшируемый ответ, основанный на управлямом сервером обсуждении. Поле заголовка Vary описывает характеристики, которые могут меняться в ответе (то есть характеристики, согласно которым первоначальный сервер выбирает "наилучший" ответ из нескольких представлений).
Общие HTTP/1.1 кэши ДОЛЖНЫ распознать поле заголовка Vary, если он присутствует в ответе, и отвечать требованиям, описанным в разделе 13.6, который описывает взаимодействия между кэшированием и обсуждением содержимого.
12.2 Управляемое агентом обсуждение.
При управляемом агентом обсуждении, выбор лучшего представления ответа выполняется агентом пользователя после получения начального ответа первоначального сервера. Выбор основан на списке доступных представлений ответа, включенном в поля заголовка (эта спецификация резервирует имя поля Alternates, как описано в приложении 19.6.2.1) или тело объекта начального ответа. Каждое представление идентифицируется собственным URI. Выбор представления может выполняться автоматически (если агент пользователя способен это сделать) или вручную пользователем из сгенерированного (возможно гипертекстового) меню.
Управляемое агентом обсуждение выгодно, когда ответ варьируется по общеиспользуемым характеристикам (таким как тип, язык, или кодирование), когда первоначальный сервер не способен определить возможности агента пользователя путем исследования запроса, и обычно при использовании общих кэшей для распределения нагрузки на сервер и уменьшения использования сети.
Управляемое агентом обсуждение страдает тем, что для получения самого лучшего альтернативного представления требуется второй запрос. Этот второй запрос эффективен только тогда, когда используется кэширование. Кроме того, эта спецификация не определяет никакого механизма для обеспечения автоматического выбора, хотя также и не предотвращает разработку такого механизма в качестве расширения и использования в HTTP/1.1.
HTTP/1.1 определяет коды состояния 300 (Множественный выбор, Multiple Choices) и 406 (Не приемлем, Not Acceptable) для обеспечения управляемого агентом обсуждения, когда сервер не желает или не способен обеспечить изменение ответа, используя управляемое сервером обсуждение.
Прозрачное обсуждение - это комбинация управляемого сервером и управляемого агентом обсуждения. Когда кэш обеспечен списком доступных представлений ответа (как при управляемом агентом обсуждении) и изменяющиеся характеристики полностью поняты кэшем, тогда он способен выполнять управляемое сервером обсуждение последующих запросов этого же ресурса от имени первоначального сервера.
Прозрачное обсуждение имеет то преимущество, что работа по обсуждению распределяется. Когда кэш способен правильно предположить нужный ответ сокращается работа, которая раньше требовалась от первоначального сервера и не происходит задержки второго запроса, как при управляемом агентом обсуждении.
Эта спецификация не определяет никакого механизма прозрачного обсуждения, хотя также и не предотвращает разработку такого механизма в качестве расширения и использования в HTTP/1.1. HTTP/1.1 кэш, выполняющий прозрачное обсуждение ДОЛЖЕН включать поле заголовка Vary (определяющее параметры, которые могут варьироваться) в ответ, если он кэшируем, чтобы гарантировать правильную интерпретацию всеми HTTP/1.1 клиентами. Информацию управляемого агентом обсуждения, представленную первоначальным сервером, СЛЕДУЕТ включать в ответ при прозрачном обсуждении.