Правильное использование кодов состояния HTTP на сервере проверки

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

Код состояния 422 ( "Непроцессная сущность" ) звучит достаточно близко:

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

Ответ 4

Предположим, вы отправляете XML файлы на ресурс, например, так:

POST/валидатор Content-type: application/xml

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

Если он синтаксически сидит в качестве типа носителя, который был отправлен как, но он не проверяет какую-либо желаемую схему, или иначе имеет семантику, которая делает ее необработанной ресурсом, на который она была отправлена ​​- тогда 422 Unprocessable Entity - лучший статус (хотя вы, вероятно, должны сопровождать его более конкретной информацией об ошибке в ответе об ошибке, также обратите внимание, что она технически определена в расширении до HTTP, WebDAV, хотя довольно широко используется в HTTP API и более подходит, чем любой другой статус ошибки 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

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

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

Отношения Поддельный

Ответ 6

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

Ответ 7

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

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