Статус HTTP на случай, если я не хочу поддерживать поиск по одному или нескольким полям - PullRequest
2 голосов
/ 13 июля 2020

Я успешно реализовал API POST /orders и GET /orders/{id}. Теперь я хочу создать один API поиска.

У моего ресурса есть следующие поля: customerId, orderId, customerName, orderName и orderType.

Я хочу создать еще один API получения на основе полей присутствует в ресурсе. Итак, я разработал его так: GET /orders?orderType=ABC&customerName=Xyz

Но я хочу ограничить поиск по некоторым параметрам. В приведенном выше случае скажем, что я хочу ограничить поиск по orderName (хотя поле действительно существует).

Теперь, если вы нажмете GET /orders?orderName=DEF, я отвечу, что поиск не поддерживается.

Что должно код статуса HTTP будет в этом случае?

Меня беспокоит использование 501, так как это больше связано с самим статусом HTTP. То же самое для 422, это связано с сущностью, входящей в код запроса. Невозможно отправить 404, поскольку данные существуют. Требуется некоторая ясность по этому поводу.

И что мне наконец-то реализовать?

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Теперь, если вы нажмете GET / orders? OrderName = DEF, я отвечу, что поиск не поддерживается.

Каким должен быть код состояния HTTP в этом случае?

404 Not Found

Код состояния 404 (Not Found) указывает, что исходный сервер не нашел текущего представления для целевого ресурса или не желает раскрывать, что он существует.

Другими словами, код состояния конкретно определяет целевой uri как проблемную c часть запроса.

5xx - это вне таблицы, потому что это проблема, которую можно решить, изменив запрос.

Невозможно отправить 404, поскольку данные существуют.

Конечно, вы можете .

Важно понимать, что коды состояния HTTP являются частью транспортных документов по сетевому домену, а не вашего домена приложения.

При транспортировке документов через сетевой домен 404 означает "запрошенный вами идентификатор не имеет связанного с ним документа". И это именно тот случай, который у вас есть (с точки зрения HTTP-компонента общего назначения).

Единый интерфейс HTTP - это интерфейс хранилища документов; передать ключ, получить документ, сохраненный с использованием этого ключа. Когда мы сообщаем об ошибках, мы сообщаем о них, используя ту же семантику, что и хранилище документов. KEY_NOT_FOUND в HTTP - это 404.

Могу ли я отправить 404 с сообщением типа - «Преднамеренно не поддерживается» или что-то в этом роде?

Да, вы можете это сделать .

Механизм описан в RF C 7231

Класс кода состояния 4xx (ошибка клиента) указывает на то, что клиент, похоже, совершил ошибку. . За исключением ответа на запрос HEAD, серверу СЛЕДУЕТ отправить представление, содержащее объяснение ситуации с ошибкой и того, является ли это временным или постоянным условием.

Другими словами, вы указываете в ответе тело описание проблемы. Код состояния 404 - это метаданные , который сообщает компонентам общего назначения (например, браузеру или веб-кешу), что сущность, включенная в ответ, является ошибкой, а НЕ представлением ресурса.

Вы можете, например, объяснить ситуацию с ошибкой, используя подробный документ .

0 голосов
/ 13 июля 2020

Хотя я согласен с тем, что 404 можно считать технически правильным, у меня возникнет вопрос: что это сообщает разработчику?

Даже если 404 относится к целому URL

/orders?orderName=DEF

Не будет надуманным, если бы программист предположил, что 404 действительно применяется к /orders с любым параметром запроса .

Многие системы игнорируют входящие нераспознанные параметры запроса, поэтому можно просто игнорировать их. Если вам нужна строгая ошибка, у меня возникнет соблазн использовать более общую ошибку c, например 400 Bad Request, поскольку я думаю, что это улучшит опыт разработчика и будет менее удивительным. важнее, чем быть технически правильным (в данном случае).

...