REST API中的错误处理:最佳实践

时间:2019-03-21 20:07:15

标签: spring rest spring-boot spring-rest

我正在尝试开发一个REST API,该API基本上返回有关国家的信息。所以我的网址将是

http://myrestservice/country/US

因此,当请求包含有效国家/地区时,我的休息服务将为该国家/地区准备信息,并准备名为$$的对象,并将其返回为

countryInfo

现在说用户发送请求为 http://myrestservice/country/XX。在这种情况下,由于XX不是有效的国家/地区,我已发送回复。我在不同的地方阅读,其中大多数只解释状态码。我的问题是返回错误的最佳方法是什么。

  1. return ResponseEntity.status(200).body(countryInfo);
  2. return ResponseEntity.status(404).body("Invalid Country"); //此处myObject将为return ResponseEntity.status(404).body(myobject);

  3. 如下准备课程,说null

    MyResponse.java

并返回该对象,无论是否存在错误。如果将错误集public class MyResponse { private String errorCode; private String errorDescription; private CountryInfo countryInfo } errorCode设置为正确的值,并将errorDescription设置为null,并且没有错误,则将countryInfoerrorCode设置为空,{{ 1}}和数据。

以上选项被认为是处理错误的标准方法。

2 个答案:

答案 0 :(得分:2)

您确实应该返回404,但是体内返回的内容取决于您。

有些人只是返回带有一些人类可读信息的html响应,但是如果您希望您的API客户端获得有关404发生原因的更多信息,则您可能还希望返回JSON。

应该使用标准的application/problem+json而不是使用自己的格式。这是一种非常简单的格式:

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

答案 1 :(得分:0)

您可以使用@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),以指示存在冲突。

此外,您还可以在其中定义一个主体,其中包括更多信息,可以是字符串,也可以是包含错误消息和自定义文档的自定义对象的自定义对象,这些信息和描述是通过文档提供给客户的。