Правильное использование кодов состояния HTTP на сервере проверки - PullRequest
21 голосов
/ 12 декабря 2008

Среди данных, которые мое приложение отправляет на сторонний SOA-сервер, - сложные XML-файлы. Владелец сервера предоставляет схемы XML (.xsd), и, поскольку сервер отклоняет недопустимые XML с помощью бессмысленного сообщения, мне нужно проверить их локально перед отправкой.

Я мог бы использовать автономный валидатор XML-схемы, но он медленный, в основном из-за времени, необходимого для анализа файлов схемы. Поэтому я написал свой собственный валидатор схемы (на Java, если это имеет значение) в виде HTTP-сервера , который кэширует уже проанализированные схемы.

Проблема в том, что многие вещи могут пойти не так в ходе процесса проверки. За исключением неожиданных исключений и успешной проверки:

  • сервер может не найти указанный файл схемы
  • указанный файл может быть недопустимым файлом схемы
  • XML неверен для файла схемы

Поскольку это HTTP-сервер, я бы хотел предоставить клиенту значимые коды состояния . Должен ли сервер отвечать с ошибкой 400 ( Неверный запрос ) для всех вышеперечисленных случаев? Или они не имеют ничего общего с HTTP, и он должен ответить 200 сообщением в теле? Любое другое предложение?

Обновление : основное приложение написано на Ruby , в котором отсутствует хорошая библиотека проверки схемы XML, поэтому отдельный сервер проверки не является чрезмерной разработкой.

Ответы [ 7 ]

28 голосов
/ 17 апреля 2010

Код состояния 422 («Необработанный объект») звучит достаточно близко:

"Код состояния 422 (Unprocessable Entity) означает, что сервер понимает тип содержимого объекта запроса (следовательно, код состояния 415 (Unsupported Media Type) является неподходящим), и синтаксис объекта запроса является правильным (таким образом, Код состояния 400 (неверный запрос) недопустим), но не смог обработать содержащиеся в нем инструкции. Например, это условие ошибки может возникать, если тело запроса XML содержит правильно сформированные (то есть синтаксически правильные), но семантически ошибочные инструкции XML. «

15 голосов
/ 15 декабря 2008

Это совершенно верное мышление, чтобы отобразить ошибки в процессе проверки на значимые коды состояния HTTP.

Я полагаю, что вы отправляете файл XML на сервер проверки в качестве содержимого POST, используя URI для определения конкретной схемы для проверки.

Итак, вот несколько советов по отображению ошибок:

  • 200: содержимое XML действительно
  • 400: содержимое XML не было правильно сформировано, заголовок не согласован, запрос не соответствует синтаксису RFC 2616
  • 401: схема не была найдена в кэше, и серверу нужны учетные данные для использования для аутентификации на стороннем сервере SOA для получения файла схемы
  • 404: файл схемы не найден
  • 409: содержимое XML недопустимо для указанной схемы
  • 412: указанный файл не является допустимой схемой XMl
  • 500: любое непредвиденное исключение на вашем сервере проверки (NullPointerExceptions и др.)
  • 502: схема не была найдена в кэше, и попытка запросить ее у стороннего сервера SOA не удалась.
  • 503: сервер проверки перезапускается
  • 504: см. 502 с указанием причины = время ожидания
5 голосов
/ 28 мая 2010

Допустим, вы публикуете файлы XML на ресурс, например, так:

POST / валидатор Тип содержимого: application / xml

Если объект запроса не может проанализировать как тип носителя, в котором он был представлен (т.е. как application / xml), неверный статус 400 - это правильный статус.

Если он синтаксически анализируется как тип носителя, в котором он был представлен, но он не проверяется на соответствие какой-либо требуемой схеме или имеет иную семантику, которая делает его недоступным для обработки ресурсом, на который он отправлен, - тогда 422 Непроцессируемый объект является лучшим (хотя вам, вероятно, следует сопровождать его более конкретной информацией об ошибках в ответе об ошибке; также обратите внимание, что она технически определена в расширении HTTP, WebDAV, хотя довольно широко используется в API-интерфейсах HTTP и более подходит, чем любой из других состояний ошибок HTTP. когда есть семантическая ошибка с представленной сущностью).

Если он передается в виде медиа-типа, который подразумевает определенную схему поверх xml (например, как application / xhtml + xml), тогда вы можете использовать 400 Bad Request, если он не проходит проверку по этой схеме. Но если его тип мультимедиа - обычный XML, то я бы сказал, что схема не является частью типа мультимедиа, хотя это немного серая область; если файл xml указывает свою схему, вы можете интерпретировать проверку как часть синтаксических требований для application / xml.

Если вы отправляете файлы XML через отправку форм multipart / form или application / x-www-form-urlencoded, то вам придется использовать 422 Unprocessable Entity для всех проблем с файлом XML; 400 будет подходящим, только если есть синтаксическая проблема с основной загрузкой формы.

5 голосов
/ 04 ноября 2009

Amazon можно использовать в качестве модели для сопоставления кодов статуса http с реальными условиями уровня приложения: http://docs.amazonwebservices.com/AWSImportExport/latest/API/index.html?Errors.html (см. Заголовок «Коды состояния Amazon S3»)

3 голосов
/ 12 декабря 2008

из w3c: 400 = Запрос не может быть понят сервером из-за неправильного синтаксиса.

Я бы не стал это выдвигать, если бы на самом деле сервер не мог понять запрос. Если вы только что получили недействительный xml, наберите 200 и объясните, почему что-то не работает.

С уважением Поддельный

2 голосов
/ 12 декабря 2008

Я бы пошел с 400 Bad request и более конкретным сообщением в теле (возможно, с дополнительным кодом ошибки в заголовке, например X-Parse-Error: 10451 для упрощения обработки)

0 голосов
/ 12 декабря 2008

Звучит как изящная идея, но коды состояния HTTP на самом деле не дают случая "операция завершилась неудачно". Я бы возвратил HTTP 200 с заголовком X-Validation-Result: true/false, используя тело для любого текста или «причины» по мере необходимости. Сохраните HTTP 4xx для ошибок уровня HTTP, а не ошибок уровня приложения.

Хотя это и позор, и двойной стандарт. Многие приложения используют HTTP-аутентификацию, и они могут вернуть HTTP 401 Not Authorized или 403 Forbidden с уровня приложения. Было бы удобно и разумно иметь какое-то общее отклонение запроса HTTP 4xx, которое вы могли бы использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...