#api #rest #query-parameters
Вопрос:
В своей работе я обнаружил, что люди разрабатывают API REST, в котором есть конечные точки, возвращающие один объект Json (не коллекцию) на основе параметров запроса (не параметров пути). Например:
/users?name=Johnamp;surname=Sparrow
с ответным органом
{id:10, name="John", surname="Sparrow", gender="male"}
Но какой код ответа соответствует в REST API отсутствию поиска ресурса из-за параметров запроса?
Например:
/users?name=Johnamp;surname=Smith
(когда Джона Смита не существует).
Я не думаю, что это ошибка 404, потому что конечная точка /users существует, но я не знаю, должен ли я возвращать ошибку 400 или 200 без тела (или нулевое значение) или другой вид ответа
Вы не могли бы мне помочь?
Спасибо
Комментарии:
1. это все еще 404 ИМО, или, может быть, 204.
Ответ №1:
Что является наиболее подходящим, зависит от того, является ли пустой список результатов в порядке или явный сбой. Являются ли параметры параметрами пути или параметрами запроса, не имеет никакого отношения к кодам возврата.
Мой общий подход заключается в том, что функции поиска, такие как findStuffBySearchTerms, всегда возвращают успешный HTTP-код, например 200, и либо результаты, либо пустой список. С другой стороны, fetchStuffById, где я ожидаю, что объект будет найден, вернет HTTP 404, если он не найден.
Ответ №2:
Какой код ответа соответствует в REST API отсутствию поиска ресурса из-за параметров запроса?
Я не думаю, что это ошибка 404, потому что существует конечная точка /users,
Идентификатор ресурса включает параметры запроса. Иными словами, параметры запроса являются частью идентификатора точно в том же смысле, в каком сегменты пути являются частью идентификатора.
В теле вашего запроса вы можете описать обстоятельства вашей реализации так точно, как вам нравится.
Но аудитория кодов состояния HTTP включает компоненты общего назначения (браузеры, прокси-серверы, веб-сканеры), для которых код ответа является основным механизмом описания семантики ответа:
Элемент кода состояния представляет собой 3-значный целочисленный код, описывающий результат попытки сервера понять и удовлетворить соответствующий запрос клиента. Остальная часть ответного сообщения должна интерпретироваться в свете семантики, определенной для этого кода состояния. — RFC 7230
Тем не менее, ваш сервер владеет своими собственными ресурсами, и поэтому вы можете решить, существует ли ресурс или нет, и как выглядит его текущее представление.
GET /users?name=Dave HTTP/1.1
200 OK
Content-Type: text/plain
Dave's not here, man.
Из фрейминга HTTP/REST это вполне разумный обмен; кто-то запросил последнее представление /users?name=Dave
, и последнее представление-это обычный текстовый документ. Абсолютно нормально.
Ключевая идея здесь заключается в том, что этот код состояния HTTP является метаданными передачи документов по сетевому домену.
HTTP безразличен к семантическому значению представлений ресурсов.
Тем не менее, вы должны учитывать при разработке такие проблемы, как «как это выглядит в наших журналах доступа?» Если вы хотите, чтобы ваши операторы могли отличить этот случай от аналогичного случая, когда параметры запроса соответствуют информации в вашей базе данных, 200 против 404-это естественный способ сделать это.
Обычно вы предпочитаете 404 другим кодам состояния ошибки в этом случае, потому что 404 указывает, что ответ можно кэшировать, что, вероятно, требуется, когда вам передается целевой объект запроса, в котором где-то есть орфографическая ошибка.
Комментарии:
1. При подходе 200 вам необходимо реализовать дополнительные проверки на стороне клиента, можете ли вы десериализовать тело ответа пользователю или нет. По-моему, это не так уж и хорошо.