2010-12-12 1 views
1

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

Согласно W3 I «следует включить объект, содержащий список доступных характеристик объекта и места (мест), из которых пользователь или агент пользователя может выбрать один наиболее подходящий» в моем ответе.

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

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


EDIT

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

ответ

3

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

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

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

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

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

+1

+1 Лично я использовал бы текст/plain как возвращаемый тип контента для 406 и включил некоторый текст, такой как 'Эта услуга только доставляет приложение/json' –

+0

@fumachu Я не хочу, чтобы типы были в URI я хочу сделать это «правильно» через заголовки «Accept» и «Content-Type» (хотя это может быть бит OTT). Я также знаю, что браузеры обычно отправляют '*/*', в этом случае будет использоваться выходной формат по умолчанию (JSON в этом случае). –

+0

@fumachu благодарит за разъяснение, что эта вещь «сущность» является фактическим телом ответа.Я, должно быть, пропустил это, когда переходил к документам (или это было недостаточно ясно указано). –