Код состояния HTTP для частичного успешного запроса
У меня есть приложение, которое отправляет сообщения пользователям. В запросе post передается строка XML, состоящая из всех пользователей, которые должны получить это конкретное сообщение. Если какой-либо из пользователей в списке не существует, я возвращаю список отсутствующих пользователей клиенту для дальнейшей оценки.
теперь я спрашиваю себя, что было бы правильным кодом состояния для приложения, говорящим, что запрос был принят, но были вещи, которые нельзя было сделать.
проблема была бы устранена, если бы не было разрешено включать отсутствующих пользователей в список. Тогда попытка отправки просто получит ошибку 4xx. Но нет никакого смысла в формировании API таким образом. С другой стороны, я мог бы считать условие ошибки чисто прикладным. Но отправка 200 просто не чувствует себя хорошо. И было бы неплохо дать клиенту подсказку, когда нужно глубоко заглянуть в ответ на ошибку. например, чтобы избежать отправки сообщений этим пользователям снова и снова за
3 ответа:
Я имел дело с очень похожим вопросом. В этом случае я вернул a
207 Multi-Состояния
теперь это не строгий 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, и Вам также нужно иметь контроль над клиентом.
у меня была та же проблема, и я в конечном итоге использовал два разных решения:
- HTTP код возврата
202: Accepted
, указывая, что запрос был в порядке, но нет никакой гарантии, что все действительно прошло как надо.- вернуть нормальный
200
в ответ, но включать список того, что не получилось в теле ответа.второй обычно работает лучше всего, но первый отлично подходит, если вы ленивы или используете очередь для обработка.
протокол передачи гипертекста имеет дело с передачей стороны вещей. Он не имеет кодов ошибок для работы с ошибками уровня приложения.
возвращение 200-это правильная вещь, чтобы сделать здесь. Что касается HTTP, запрос был получен правильно, обработан правильно, и вы отправляете ответ обратно. Итак, на уровне HTTP все в порядке. Любые ошибки или предупреждения, связанные с приложением, которое работает поверх http, должны быть внутри ответа. Это также предотвратите некоторые неприятные проблемы, с которыми вы можете столкнуться с прокси-серверами, которые могут не обрабатывать определенные ответы так, как вы ожидаете.