В rest семантически, как отличить 404, возвращенный недопустимым URL, от 404, возвращенного хорошим URL, указывающим на несуществующий ресурс?

#rest #http-status-code-404 #semantics

#rest #http-status-code-404 #семантика

Вопрос:

Так что я на самом деле не поклонник RESTful API, но там, где я нанят, они все еще часто используются.

Итак, я придумал гипотетический случай, который отображает мое замешательство:

Представьте, что у вас есть конечная GET v1/users/{id} точка.

Теперь представьте, что на данный момент есть только один пользователь с id 1 .

Как мне отличить 404, возвращенный

GET /v1/users/0

и возвращаемого

GET /v1/usres/1 ? (опечатка нарочно)

Ответ №1:

Как мне отличить 404, возвращенный….

Тело ответа, см. Семантику HTTP

За исключением случаев ответа на запрос HEAD, сервер ДОЛЖЕН отправить представление, содержащее объяснение ситуации с ошибкой, и является ли это временным или постоянным условием.

 GET /v1/users/0

404 Not Found
Content-Type: text/plain

There is currently no user 0 in the database
  
 GET /v1/usres/1

404 Not Found
Content-Type: text/plain

usres? What are you talking about?

Did you mean? 
 * /v1/users/1
 * /v1/ursae/1 
  

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

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

Для человека это означает возврат текста, который объясняет проблему, в тело ответа (например, на HTML-странице).

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