gpt4 book ai didi

java - 是否应该使用 HTTP 代码来表示业务失败?

转载 作者:可可西里 更新时间:2023-11-01 16:48:23 26 4
gpt4 key购买 nike

本周早些时候,我的团队讨论了 HTTP 代码是否应该代表业务失败。

想象一下我们有一个 Customer REST API 的场景。在该 API 中,我们有很多操作,例如:

  • POST - mydomain.com/customers(接收 JSON 正文并创建新客户)
  • GET - mydomain.com/customers/{id}(搜索特定客户)
  • PATCH - mydomain.com/customers/{id}(接收 JSON 正文并为特定客户打补丁)
  • DELETE - mydomain.com;customers/{id}(删除特定客户)

现在,想象一下我正在寻找具有 id = 5Customer 的情况。

id = 5 没有 Customer。 HTTP状态码应该怎么办?未找到客户是业务失败。我应该返回 404 - NOT FOUND 吗?我是否应该返回一个 200 - OK(带有一个 JSON 正文,说明 ID 为 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 - NOT FOUND 并向客户提供更多详细信息。


阅读 HTTP/1.1 规范:

404 Not Found

The server has not found anything matching the Request-URI. No
indication is given of whether the condition is temporary or
permanent. The 410 (Gone) status code SHOULD be used if the server
knows, through some internally configurable mechanism, that an old
resource is permanently unavailable and has no forwarding address.
This status code is commonly used when the server does not wish to
reveal exactly why the request has been refused, or when no other
response is applicable.

如果“服务器未找到任何匹配请求 URI...”,我理解返回 404 - NOT FOUND 将是正确的方法。 ,因为 /id 组成了我的 URI (mydomain.com/customers/id)

我说得对吗?

哪种方法更好/正确(如果有错误的方法)?

最佳答案

状态码是用来描述服务器试图理解并满足客户端相应请求的结果。

最终,如果客户端请求不存在的资源表示,服务器应返回 404表明。它本质上是一个客户端错误,应该这样报告。

返回 200会产生误导并导致 API 客户端混淆。


有时 HTTP 状态代码不足以传达有关错误的足够信息以提供帮助。

RFC 7807创建它是为了定义简单的 JSON 和 XML 文档格式,以通知客户端 HTTP API 中的问题。这是在您的 API 中报告错误的一个很好的起点。它还定义了 application/problem+jsonapplication/problem+xml 媒体类型。

关于java - 是否应该使用 HTTP 代码来表示业务失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53191230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com