Обработка ошибок в REST API: лучшая практика - PullRequest
1 голос
/ 21 марта 2019

Я пытаюсь разработать API для отдыха, который в основном возвращает информацию о стране.Таким образом, мой URL будет примерно таким:

http://myrestservice/country/US

, поэтому, когда запрос приходит с действительной страной, моя служба отдыха подготовит информацию для этой страны и подготовит объект с именем countryInfo и вернет этоas

return  ResponseEntity.status(200).body(countryInfo);

теперь говорят, что пользователь отправляет запрос как http://myrestservice/country/XX. В этом случае, поскольку XX не является допустимой страной, у меня есть ответ на отправку.Я читаю в другом месте, и большинство из них объясняют только код состояния.Мой вопрос заключается в том, каков наилучший способ вернуть ошибку.

  1. return ResponseEntity.status(404).body("Invalid Country");
  2. return ResponseEntity.status(404).body(myobject); // здесь myObject будет null.

  3. Подготовьте класс, скажем MyResponse.java, как показано ниже.

    public class MyResponse {
    
      private String errorCode;
      private String errorDescription;
      private CountryInfo countryInfo 
    
    }
    

И верните этот объект независимо от того, есть ошибки или нет.Если есть ошибка, установите errorCode и errorDescription в поле с правильным значением и установите countryInfo в ноль и без ошибок установите errorCode и errorDescription как пустое и countryInfo с данными.

Какой из приведенных выше вариантов считается стандартным способом обработки ошибок.

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

Вы действительно должны вернуть 404, но то, что вы возвращаете в теле, зависит от вас.

Некоторые люди просто возвращают html-ответ с некоторой удобочитаемой информацией, но если вы хотите, чтобы ваш API-клиент получил больше информации о том, почему произошло 404, вы также можете захотеть вернуть JSON.

Вместо того, чтобы использовать свой собственный формат, вы должны использовать стандарт application/problem+json. Это очень простой формат:

https://tools.ietf.org/html/rfc7807

0 голосов
/ 22 марта 2019

Вы можете использовать @ControllerAdvice для обработки исключений:

Ваша конечная точка должна идентифицировать ошибку и выдать ошибку:

@RequestMapping("/country/{code}")
public ResponseEntity<Country> findCountry(String code) {
  Country country = this.countryRepository(code);
  if(country == null) throws new IllegalArgumentException("Invalid country code: " + code);
  return  ResponseEntity.status(200).body(country);
}

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

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class })
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}

Там вы должны определить код состояния, чтобы указать пользователю, какая ошибка была сгенерирована, 409, чтобы указать, что произошел конфликт.

Кроме того, вы можете определить тело, включающее дополнительную информацию, либо строку, либо пользовательский объект, содержащий сообщение об ошибке и описание, которое вы предлагаете клиенту через документацию.

...