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

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

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

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

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

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

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


person Rômulo Ceccon    schedule 12.12.2008    source источник


Ответы (7)


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

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

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

  • 200: содержимое XML является допустимым
  • 400: содержимое XML не было правильно сформировано, заголовок был несогласованным, запрос не соответствовал синтаксису RFC 2616
  • 401: схема не найдена в кеше, и серверу требуются учетные данные для использования для аутентификации на стороннем сервере SOA, чтобы получить файл схемы
  • 404: файл схемы не найден
  • 409: содержимое XML недопустимо для указанной схемы
  • 412: Указанный файл не является допустимой схемой XMl.
  • 500: любое неожиданное исключение на вашем сервере проверки (NullPointerExceptions и др.)
  • 502: схема не найдена в кеше, и попытка запросить ее у стороннего SOA-сервера не удалась.
  • 503: сервер проверки перезагружается
  • 504: см. 502 с причиной = тайм-аут
person mkoeller    schedule 15.12.2008
comment
Будьте осторожны при использовании статусов http, таких как 401, 409 и 412 - они имеют особое значение в протоколе HTTP и не являются кодами, которые вы можете просто решить использовать в каком-то обобщенном сценарии ошибки, потому что вам нравится, как звучит формулировка :) '422 unprocessable entity '- это, вероятно, то, что вы ищете как универсальное, хотя оно было синтаксически допустимо для своего типа носителя, мы не смогли учесть семантику отправленного объекта запроса tools.ietf.org/html/rfc4918#section-11.2 - person Matt; 28.05.2010

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

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

person Julian Reschke    schedule 17.04.2010
comment
Обратите внимание, что 422 - это расширение, специфичное для WebDAV. Код состояния 400 был бы более подходящим. - person Tom Christie; 04.06.2013
comment
Это расширение, определенное в WebDAV, но все же общий код состояния HTTP. - person Julian Reschke; 05.06.2013

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

person Danny Armstrong    schedule 03.11.2009

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

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

Если объекту запроса не удается проанализировать тип носителя, в котором он был отправлен (например, как application / 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 будет подходящим только в том случае, если есть синтаксическая проблема с загрузкой основной формы.

person Matt    schedule 28.05.2010

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

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

С уважением Подделка

person user45692    schedule 12.12.2008

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

person Piskvor left the building    schedule 12.12.2008

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

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

person Tom    schedule 12.12.2008
comment
Если у вас 200 и дополнительный заголовок для успеха, вы туннелируете протокол через HTTP, вместо того, чтобы правильно использовать HTTP. Не делай этого. - person Julian Reschke; 17.04.2010