Код состояния HTTP для частичного успешного запроса

У меня есть приложение, которое отправляет сообщения пользователям. В почтовом запросе переносится строка XML, которая состоит из всех пользователей, которые должны получать это конкретное сообщение. Если ни один из пользователей в списке не существует, я даю список отсутствующих пользователей обратно клиенту для дальнейшей оценки.

Теперь я спрашиваю себя, что будет правильным кодом состояния приложения, заявив, что запрос был принят, но были вещи, которые невозможно было сделать.

Проблему можно было бы избежать, если бы не было разрешено включать отсутствующих пользователей в список. Тогда попытка отправки просто получит ошибку 4xx. Но нет смысла создавать API таким образом. С другой стороны, я мог бы считать условие ошибки чисто специфичным для приложения. Но отправка 200 просто не кажется правильным. И было бы неплохо дать клиенту подсказку, когда нужно глубоко заглянуть в ответ об ошибке. например чтобы не отправлять сообщения этим пользователям снова и снова

Ответ 1

Я рассматривал очень похожую проблему. В этом случае я вернул

207 Multi-Status

Теперь это не строгий HTTP, это часть расширения WebDAV, поэтому, если у вас нет контроля над клиентом, то это не хорошо для вас. Если вы это сделаете, вы можете сделать что-то вроде этого:

   <?xml version="1.0" encoding="utf-8" ?>
   <D:multistatus xmlns:D='DAV:'>
     <D:response>
       <D:user>user-123</D:user>
       <D:status>success</D:status>
     </D:response>
     <D:response>
       <D:user>user-789</D:user>
       <D:status>failure</D:status>
     </D:response>
   </D:multistatus>

Но опять же это HTTP-расширение, и вам также нужно иметь контроль над клиентом.

Ответ 2

У меня была та же проблема, и я решил использовать два разных решения:

  • Код возврата HTTP 202: Accepted, указывая на то, что запрос был в порядке, но нет гарантии, что все пошло так, как должно.
  • Возвратите нормальный 200 в ответе, но включите список того, что не было в теле ответа.

Второй, как правило, лучше всего работает, но первый отлично, если вы ленивы или используете очередь для обработки.

Ответ 3

Протокол передачи гипертекста имеет дело с передачей. У него нет кодов ошибок для устранения ошибок уровня приложения.

Возвращение 200 - это то, что нужно сделать здесь. Что касается HTTP, запрос был получен правильно, правильно обработан и вы отправляете ответ. Итак, на уровне HTTP все в порядке. Любые ошибки или предупреждения, связанные с приложением, работающим поверх http, должны быть внутри ответа. Это также предотвратит некоторые неприятные проблемы, с которыми вы могли столкнуться с прокси-серверами, которые могут не обрабатывать определенные ответы так, как вы ожидаете.