Должны ли HTTP-коды использоваться для представления несостоятельности бизнеса? - PullRequest
0 голосов
/ 07 ноября 2018

В начале этой недели моя команда обсуждала, должны ли HTTP-коды представлять ошибки бизнеса.

Представьте себе сценарий, в котором у нас есть Customer REST API. В этом API у нас много операций, таких как:

  • POST - mydomain.com/customers (получить тело JSON и создать нового клиента)
  • GET - mydomain.com/customers/{id} (поиск конкретного клиента)
  • PATCH - mydomain.com/customers/{id} (получите тело JSON и исправьте конкретного клиента)
  • УДАЛИТЬ - mydomain.com;customers/{id} (удаляет определенного Клиента)

А теперь представьте ситуацию, в которой я ищу Customer с id = 5.

Там нет Customer с id = 5. Что я должен сделать с точки зрения кода состояния HTTP? Клиент не найден - бизнес-провал. Должен ли я вернуть 404 - НЕ НАЙДЕН ? Должен ли я вернуть 200 - ОК (с текстом JSON, в котором указано, что Клиент с идентификатором 5 не существует)?

Мы обсуждали именно это поведение.

Controller.java (пример)

@GetMapping("/customers/{id}")
public ResponseEntity<?> handleRequestOfRetrieveCustomerById(@PathVariable("id") Integer id) throws CustomerNotFoundException {
    try {
        ResponseEntity.ok(customerService.findCustomerById(id));
    } catch(CustomerNotFoundException e) {
        // log at Controller level and rethrow
        throw e;
    }
}

Handler.java (пример)

@ExceptionHandler(BusinessResourceNotFoundException.class)
@ResponseBody
protected ResponseEntity<Fault> handleExceptionOfBusinessResourceNotFound(BusinessResourceNotFoundException exception) {
    return new ResponseEntity<Fault>(exception.getFault(), HttpStatus.NOT_FOUND);
}

В этом примере 404 - НЕ НАЙДЕН возвращается с телом, дающим больше деталей клиенту.


Из чтения спецификации HTTP / 1.1 :

404 Не найдено

Сервер не нашел ничего, соответствующего Request-URI. Нет
указывается, является ли условие временным или
постоянны. Код состояния 410 (Gone) ДОЛЖЕН использоваться, если сервер
через некоторый внутренне настраиваемый механизм знает, что старый
ресурс постоянно недоступен и не имеет адреса пересылки.
Этот код состояния обычно используется, когда сервер не желает
точно указать, почему запрос был отклонен, или когда нет других
ответ применим.

Если «Сервер не нашел ничего, совпадающего с URI запроса ...», я понимаю, что возвращение 404 - НЕ НАЙДЕНО будет правильным подходом, поскольку / id составляет мой URI (mydomain.com/customers/id)

Я прав?

Какой подход лучше / правильнее (если есть неправильный путь)?

Ответы [ 6 ]

0 голосов
/ 08 ноября 2018

Технически и с точки зрения http, 404 также должен быть возвращен за любую неправильную написание имени сущности (cutsomer вместо customer).

Таким образом, даже если вы решите, что «клиент не найден» приведет к http 404, вы не сможете сделать вывод, что http 404 будет означать «вхождение объекта не найдено».

0 голосов
/ 08 ноября 2018

REST API является частью домена интеграции, а не бизнес-доменом. Это модель вашей доменной модели, чтобы замаскировать себя под веб-сайт или хранилище значений ключей, совместимых с HTTP.

Здесь 404 является подходящим выбором, поскольку он имитирует ответ, который будет возвращен хранилищем значений ключей, если вы попытаетесь получить ключ, который в данный момент не был сохранен.

0 голосов
/ 07 ноября 2018

Я недавно работал над Rest API с Spring Boot, и лучшие практики, найденные в интернете, говорят следующее:

  • Параметры null или значение не установлено: 400 / Bad request
  • Возвращаемое значение не найдено (запись или список пуст): 404 / Not found
  • Исключение с сервера (ошибка базы данных, ошибка сети и т. Д.): 500 / Internal server error

Эти ссылки помогут вам: рекомендации по обработке ошибок , ControllerAdvice , сообщение об ошибке

0 голосов
/ 07 ноября 2018

Я бы понял значение кодов состояния HTTP.

Вики говорят (https://en.wikipedia.org/wiki/List_of_HTTP_status_codes):

Этот класс кода состояния предназначен для ситуаций, в которых ошибка, по-видимому, была вызвана клиентом

Для ясности: mydomain.com/customers/ndomid} - это действительный URL-адрес, который сервер понимает в запросе. Тот факт, что клиент с id = 5 не существует, не имеет ничего общего с «ложным URL» или «непонятным запросом».

По моему мнению, это должно вернуть код статуса 2xx с дополнительной информацией внутри json (определения, сделанные вашим REST API)

0 голосов
/ 07 ноября 2018

HTTP-коды существуют по причине. Тот, кто использует ваш API, должен иметь возможность обрабатывать ответ сразу, без необходимости использовать содержимое тела.

В вашем случае 404 (не найдено) выглядит вполне подходящим.

Или, если вы всегда возвращаете 200, разве это не превосходит цель кода ответа вообще? Если вы получаете ответ, вы уже знаете, что ваш запрос в какой-то степени получен.

TLDR;

Использовать 404:)

0 голосов
/ 07 ноября 2018

Коды состояния предназначены для описания результата попытки сервера понять и удовлетворить соответствующий запрос клиента.

В конечном итоге, если клиент запрашивает представление о несуществующем ресурсе, сервер должен возвратить 404, чтобы указать это. По сути, это ошибка клиента, о которой следует сообщить как таковой.

Возвращение 200 будет вводить в заблуждение и приведет к путанице с клиентами API.


Иногда кодов состояния HTTP недостаточно, чтобы передать достаточно информации об ошибке, чтобы быть полезным.

RFC 7807 был создан для определения простых форматов документов JSON и XML для информирования клиента о проблеме в HTTP API. Это отличная отправная точка для сообщения об ошибках в вашем API. Он также определяет типы носителей application/problem+json и application/problem+xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...