我正在尝试开发一个REST API,该API基本上返回有关国家的信息。所以我的网址将是
http://myrestservice/country/US
因此,当请求包含有效国家/地区时,我的休息服务将为该国家/地区准备信息,并准备名为$$
的对象,并将其返回为
countryInfo
现在说用户发送请求为 http://myrestservice/country/XX。在这种情况下,由于XX不是有效的国家/地区,我已发送回复。我在不同的地方阅读,其中大多数只解释状态码。我的问题是返回错误的最佳方法是什么。
return ResponseEntity.status(200).body(countryInfo);
return ResponseEntity.status(404).body("Invalid Country");
//此处myObject将为return ResponseEntity.status(404).body(myobject);
。
如下准备课程,说null
。
MyResponse.java
并返回该对象,无论是否存在错误。如果将错误集public class MyResponse {
private String errorCode;
private String errorDescription;
private CountryInfo countryInfo
}
和errorCode
设置为正确的值,并将errorDescription
设置为null,并且没有错误,则将countryInfo
和errorCode
设置为空,{{ 1}}和数据。
以上选项被认为是处理错误的标准方法。
答案 0 :(得分:2)
您确实应该返回404,但是体内返回的内容取决于您。
有些人只是返回带有一些人类可读信息的html响应,但是如果您希望您的API客户端获得有关404发生原因的更多信息,则您可能还希望返回JSON。
应该使用标准的application/problem+json
而不是使用自己的格式。这是一种非常简单的格式:
答案 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),以指示存在冲突。
此外,您还可以在其中定义一个主体,其中包括更多信息,可以是字符串,也可以是包含错误消息和自定义文档的自定义对象的自定义对象,这些信息和描述是通过文档提供给客户的。