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

pzfprimi  于 2023-01-12  发布在  Spring
关注(0)|答案(3)|浏览(162)

我正在尝试开发一个API,它基本上可以返回国家的信息,所以我的url应该是这样的
http://myrestservice/country/US
因此,当请求带有有效国家/地区时,我的REST服务将准备该国家/地区的信息,准备名为countryInfo的对象,并将其返回为

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);//这里我的对象将是null
    1.准备一个类,比如MyResponse.java,如下所示。
public class MyResponse {

  private String errorCode;
  private String errorDescription;
  private CountryInfo countryInfo 

}

无论有无错误,都返回该对象,如果有错误,则将errorCodeerrorDescription字段设置为合适的值,并将countryInfo设置为空,如果没有错误,则将errorCodeerrorDescription设置为空,并将countryInfo设置为数据。
以上哪一个选项被认为是处理错误的标准方法。

waxmsbnn

waxmsbnn1#

你确实应该返回一个404,但是你在身体里返回什么取决于你自己。
有些人只返回一个html响应,其中包含一些人类可读的信息,但是如果您希望API客户机获得更多有关404事件发生原因的信息,那么您可能还需要返回JSON。
您应该使用标准的application/problem+json,而不是使用您自己的格式,这是一种非常简单的格式:
https://www.rfc-editor.org/rfc/rfc7807

s4n0splo

s4n0splo2#

可以使用@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表示存在冲突。
此外,您还可以在其中定义一个包含更多信息的主体,可以是字符串,也可以是包含错误消息和描述的自定义对象,您可以通过文档向客户端提供这些信息。

zlhcx6iw

zlhcx6iw3#

您可以使用Zalando Problem,它是一个实现application/problem+json的库。
https://github.com/zalando/problem
https://thecodingduck.blogspot.com/2023/01/best-practices-for-rest-api-design.html#standard_error

相关问题