Как правильно отправить 406 код статуса? - PullRequest
1 голос
/ 12 декабря 2010

Я занимаюсь разработкой службы API RESTful, которая первоначально будет принимать и отвечать только в формате JSON.Я хочу следовать стандартам, и в случае, если заголовок Accept запрашивающей стороны отличается от JSON, я хочу ответить кодом состояния HTTP 406, чтобы сообщить запрашивающей стороне, что я не могу вывести данные в другом формате.

Согласноto W3 I "СЛЕДУЕТ включать объект, содержащий список доступных характеристик объекта и местоположений, из которых пользователь или пользовательский агент может выбрать наиболее подходящий" в моем ответе.

Как мне это сделать, потому что приведенное выше объяснение мне мало что говорит.Что такое упомянутая сущность ?

Любые идеи / предложения?


РЕДАКТИРОВАТЬ

Сначала я подумал, что возможноэто может быть разделенный запятыми список в заголовке Content-Type , но после переосмысления может быть, я должен сделать то же самое, что и браузеры, и использовать заголовок Accept ?На самом деле это имеет гораздо больше смысла, но я не могу найти никакой информации, подтверждающей это.

1 Ответ

3 голосов
/ 17 декабря 2010

Три вопроса здесь:

Во-первых, примечание из RFC 2616 предназначено для рассмотрения схем URI, в которых ответы различных типов доступны для различных URI, таких как "/path/to/thing.xml" vs "/path/to/thing.json ». Это не всегда популярный выбор, но если вы можете сделать это, сделайте это и включите гиперссылки на каждую в «сущности»; то есть в теле ответа. Поскольку RFC не предписывает Content-Type или модель обработки для таких ссылок, вы самостоятельно решаете, как их вернуть, но HTML с тегами <a> является распространенным и полезным.

Если вы не хотите выставлять несколько типов в разных URI, а просто хотите выставить один тип в исходном URI, тогда вполне нормально ответить 406 и сущностью, которая просто говорит, какие типы может выдавать ресурс.

Во-вторых, обратите внимание, что большинство веб-браузеров отправляют */* в заголовке Accept (с низким значением качества), который должен соответствовать любому типу контента. Кроме того, в спецификации говорится: «... если поле заголовка Accept отсутствует, то предполагается, что клиент принимает все типы мультимедиа». Так что случаи, когда вы должны повышать 406, редки.

В-третьих, не отправляйте заголовок ответа Content-Type, который отличается от Content-Type объекта ответа. Он должен не использоваться для перечисления допустимых типов. Вы также должны не выдавать заголовок ответа с именем «Принять»; заголовок «Принять» предназначен только для запросов; см http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1

...