Могу ли я использовать пользовательские причины для кода состояния HTTP для дифференциации ошибок для REST API

Я хочу различать отдельные типы ошибок "Not Found". Для примера дается следующий запрос:

GET /author/Adams/works/HHGTTG

Либо автор может быть "не найден", либо работа не может быть "не найдена", и я хочу провести различие между ними.

статус: 404 - автор не найден - статус: 404 - работа не найдена

Согласно спецификации, причина фразы может быть изменена. http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

6.1.1 Код состояния и причина фразы

... Приведенные здесь фразы причины - это только рекомендации - они МОГУТ быть заменены локальными эквивалентами, не влияя на протокол...

Можно ли также использовать две уникальные фразы для одного и того же кода статуса?

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

В конечном счете, я хочу иметь клиентскую библиотеку, которая может генерировать исключение AuthorNotFound или WorkNotFound вместо общего исключения AuthorOrWorkNotFound.

Ответы

Ответ 1

При использовании вашего "затененного" не найденного подхода вы можете использовать 404 с телом ответа:

  • использовать статус 404 с текстовыми данными ( "автор не найден", "работа не найдена" ). Чтобы быть более гибким для языка, вы можете использовать метки (например, error.author.notFound)
  • используйте более структурированные и гораздо более легкие для анализа "подкоды" (например, 10 означает, что автор не найден, 11 пользователей не найдены).

Тем не менее я НЕ рекомендую вышеупомянутые субкоды, они добавляют много сложностей и усилий по обслуживанию для единого интерфейса HTTP. Структура вашей библиотеки api-client по-разному. Позвольте сначала называть /author/adams/work/11. Если он возвращает 404, тогда вызовите /author/adams/ рядом, чтобы узнать, был ли это недостающий автор, который вызвал 404. Затем вы можете бросить соответствующие исключения NotFound.

Другой альтернативой является создание конечного api-клиентского приложения по-разному. Сначала нужно вызвать /author/adams, тогда если бы не 404 продолжалось бы /author/adams/work. Таким образом, естественно, что само приложение идет по пути. Но это, конечно, работает только в том случае, если поток вашей страницы внутри интерфейса адаптируется к этой последовательности вызовов.

Ответ 2

У вас может быть тело ответа HTTP, содержащее сообщение, которое вы можете анализировать с любой дополнительной информацией.

Сообщение о статусе HTTP в коде состояния (в ответе) может быть любым, что вы хотите, и оно не будет влиять на клиентов. Обычно клиенты HTTP игнорируют текст сообщения.