Accept and Accept-Charset - что лучше?

В HTTP вы можете указать в запросе, что ваш клиент может принимать конкретный контент в ответах, используя заголовок accept со значениями, такими как application/xml. Спецификация типа содержимого позволяет включать параметры в тип контента, такие как charset=utf-8, указывая, что вы можете принимать контент с указанным набором символов.

Существует также заголовок accept-charset, который определяет кодировки символов, которые принимаются клиентом.

Если оба заголовка указаны, а заголовок accept содержит типы содержимого с параметром charset, который должен считаться превосходным заголовком сервером?

например:.

Accept: application/xml; q=1,
        text/plain; charset=ISO-8859-1; q=0.8
Accept-Charset: UTF-8

Я отправил несколько примеров запросов на различные серверы, используя Fiddler, чтобы проверить, как они реагируют:

<сильные > Примеры

W3

Запрос

GET http://www.w3.org/ HTTP/1.1
Host: www.w3.org
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

Ответ

Content-Type: text/html; charset=utf-8

Google

Запрос

GET http://www.google.co.uk/ HTTP/1.1
Host: www.google.co.uk
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

Ответ

Content-Type: text/html; charset=ISO-8859-1

StackOverflow

Запрос

GET http://stackoverflow.com/ HTTP/1.1
Host: stackoverflow.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

Ответ

Content-Type: text/html; charset=utf-8

Microsoft

Запрос

GET http://www.microsoft.com/ HTTP/1.1
Host: www.microsoft.com
Accept: text/html;charset=UTF-8
Accept-Charset: ISO-8859-1

Ответ

Content-Type: text/html

Кажется, что нет какого-либо консенсуса относительно ожидаемого поведения. Я пытаюсь выглядеть удивленным.

Ответ 1

Если вы можете установить тип носителя в заголовке Accept, определение параметра charset для этого типа носителя не определено нигде в RFC 2616 (но это не запрещено, хотя).

Поэтому, если вы собираетесь внедрить сервер, совместимый с HTTP 1.1, сначала найдите заголовок Accept-charset, а затем выполните поиск ваших собственных параметров в заголовке Accept.

Ответ 2

Прочтите RFC 2616 Раздел 14.1 и 14.2. Заголовок Accept не позволяет указать charset. У тебя есть  вместо этого используйте заголовок Accept-Charset.

Ответ 3

Во-первых, заголовки Accept могут принимать параметры, см. https://tools.ietf.org/html/rfc7231#section-5.3.2

Все типы text/* mime могут принимать параметр charset. http://www.iana.org/assignments/media-types/media-types.xhtml#text

Заголовок Accept-Charset позволяет пользовательскому агенту указывать кодировки, которые он поддерживает.

Если заголовок Accept-Charset не существует, пользовательский агент должен будет указать каждый параметр набора символов для каждого принятого им типа текста /*, например.

Accept: text/html;charset=US-ASCII, text/html;charset=UTF-8, text/plain;charset=US-ASCII, text/plain;charset=UTF-8

Ответ 4

Я не думаю, что это важно. Клиент делает что-то немым; для этого не требуется интероперабельность: -)