400 против 404 при неожиданном типе переменной пути

#rest #specifications

#rest #технические характеристики

Вопрос:

Допустим, у нас есть следующий API:

 GET /api/colors/{color}
GET /api/integers/{number}
  

В коде я ожидаю, что ‘color’ будет соответствовать некоторому значению в enum, а ‘number’ — целое число.

Например:

 GET /api/colors/red
GET /api/integers/2
  

будет отвечать HTTP 200.

Но тогда как я должен отвечать на такие запросы, как:

 GET /api/colors/foo
GET /api/integers/bar
  

Должно ли оно быть 404, потому что color ‘foo’ и integer ‘bar’ не существуют? Или 400, потому что клиент не использовал некоторые согласованные допустимые значения (перечисление, целое число)?

Ответ №1:

Ресурс, отвечающий на 404 запрос, может 200 появиться позже.

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

 GET /api/colors/lightblue
  

Должен отвечать 404 .

В то время как запрос like /api/integers/bar неверно сформирован и будет искажен в будущем, поэтому он должен отвечать 400 ; целое число семантически никогда не может быть строкой.

Отправка 400 сообщает клиенту «не запрашивать это снова», клиент может «запомнить» (кэшировать) этот ответ неявно.

404 сообщает клиенту: «Прямо сейчас у меня нет того, что вы запрашиваете, повторите попытку позже». Клиент может применять кэширование на основе эвристики или явно.

Комментарии:

1. /api/integers/bar мое приложение может считаться искаженным, но по стандартам оно полностью допустимо. Нормально ли, что разные API по-разному понимают, что такое неправильный uri?

2. @Valdemaras Возможно, искаженный — неправильное слово. Это допустимый URI, но в отношении семантики вашего API он недействителен. Стандарта нет, только лучшие практики. Многие из вопросов, подобных вашему, закрываются, потому что ответ — это мнение, а не стандарт.

3. @DansFromGermany Я думаю, вы правы, что это вопрос мнения. С самого начала просто не ясно, что для этого нет никакого стандарта: (

Ответ №2:

Должно ли оно быть 404, потому что color ‘foo’ и integer ‘bar’ не существуют?

404.

Все коды состояния 4xx сообщают клиенту, что с запросом возникла какая-то проблема. Семантическое различие заключается 404 в том, что намекает на орфографическую ошибку в целевом uri.

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