Какой тип MIME, если JSON возвращается REST API?
Мой REST API возвращает JSON.
В настоящее время я возвращаю text/plain как тип MIME, но это забавно. Должен ли я возвращаться application/x-javascript
или какой-то другой тип?
Второй вопрос касается кода состояния HTTP для условий ошибки. Если мой REST API возвращает состояние ошибки, я возвращаюсь как JSON
{ result: "fail", errorcode: 1024, errormesg: "That sucked. Try again!" }
Должен ли код состояния HTTP оставаться на 200 OK
?
6 ответов
Спецификация JSON предполагает application/json
и это, кажется, поддерживается реестром IETF и IANA.
Что касается второго вопроса, я думаю, что если обработка сообщения каким-то образом не удалась, вы должны вернуть структурированный и стандартный ответ об ошибке в виде сообщения JSON; только если по какой-либо причине произошла ошибка при доставке сообщения бэкэнд-обработчику, следует учитывать код ошибки HTTP.
Обновление 2014-06-27: дни, когда клиенты (браузеры) работали только с ответом 200, давно прошли, и преобладающим советом для API RESTful является использование HTTP-кодов ответов, подходящих для ответа, 2xx для успешных ответов (например, 201 Создан для PUT; 204 No Content for DELETE) и 4xx и 5xx для всех состояний ошибки, в том числе из самого API.
MIME-тип JSON
application/json
http://www.ietf.org/rfc/rfc4627.txt
http://www.iana.org/assignments/media-types/application/
Более конкретно здесь:
Нет, вы не должны возвращать 200 в состоянии ошибки.
Можно повторить код состояния или включить более подробный код ошибки в полезную нагрузку ответа.
Я предпочитаю отвечать как сообщением об ошибке HTTP, так и информацией о приложении.
Правильный Content-type
вернуть это application/json
согласно RFC 4627, который также регистрирует IANA MIME-типа (и действительно, он отображается на странице IANA). Конечно, если бы вы написали клиента, вы бы хотели быть более либеральными в том, что вы принимаете, а также принимать других, таких как text/json
а также text/x-json
,
Теперь, если есть ошибка, вы не должны возвращать HTTP 200, это принципиально не RESTful. Я знаю, что иногда нет точного соответствия вашей ошибке, но выбирайте ближайшие ошибки 4XX (ошибка клиента) или 5XX (ошибка сервера) в RFC 2616, разделы 10.4-10.5, и будьте более точны в JSON.
Если под "REST API" вы подразумеваете, что хотите следовать архитектуре REST, тип используемого носителя определяется функциональностью, которую вы хотите предоставить через REST API. Хотите иметь возможность создавать новые объекты? Запросить список объектов? Редактировать объект? Если это так, то хорошим типом мультимедиа RESTful может быть vnd.collection+json, поскольку он определяет гипертекстовый интерфейс для управления коллекцией объектов json.
Примечание: RESTful API может использовать медиа-тип application/json, но этот медиа-тип не имеет RESTful-интерфейса с гипертекстовой связью, поэтому он будет конечной точкой в изменении состояния.
Также вполне приемлемо следовать архитектуре веб-API, где вызовы HTTP RPC возвращают объекты application/json, а другие вызовы HTTP RPC манипулируют этими объектами, и нет интерфейса с гипертекстовой ссылкой для использования и навигации по изменениям состояния. Но это не ОТДЫХ.
Мне нравится это описание REST (от создателя REST):
REST APIS должен управляться гипертекстом
Другими словами, если механизм состояния приложения (и, следовательно, API) не управляется гипертекстом, то он не может быть RESTful и не может быть REST API. Период.
Кроме того, из обсуждения этого поста приведен пример приложения RESTful: REST-приложение Lost Boys Spam-E