Код состояния HTTP для частичного успешного запроса - PullRequest
89 голосов
/ 12 декабря 2011

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

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

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

Ответы [ 4 ]

57 голосов
/ 07 апреля 2014

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

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

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

54 голосов
/ 12 декабря 2011

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

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, и вам также необходимо иметь контроль над клиентом.

0 голосов
/ 16 февраля 2019

Как насчет использования 206 частичного контента. Я знаю, что 206 больше о диапазонах, но что, если он может указывать на частично успешный запрос?

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

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

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

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