RESTful 的增删改查成功应该返回什么状态码?

2020-07-14 15:13:54 +08:00
 Vimax

RESTful 的 GET POST PUT DELETE 如果操作成功应该返回什么状态码呢?

用 200,201,202,204 代表 4 种请求的成功合适吗?

请求成功

如果 GET POST PUT   DETELE 请求,数据库执行结果都为 0.又如何返回 HTTP 状态码呢?

是返回 404 not found 吗?

另外一个问题

请求方式的数据类型: GET 和 DELETE 是否[不能]或[不推荐]使用 JSON 数据的形式.

前端使用的是 VUE axios 发送请求,之前 DELETE 发送 JSON 数据,后端无法接收到.

目前 4 种请求方式对应使用的数据类型是:

10375 次点击
所在节点    Java
132 条回复
hantsy
2020-07-14 15:33:58 +08:00
Spring 内容协商规律:

Get , Accept: application/json
POST,PUT Content-Type:application/json
DELETE 不用管。

实现:
https://github.com/hantsy/spring-reactive-jwt-sample/blob/master/src/main/java/com/example/demo/web/PostController.java

各种情况状态返回参考测试代码:

https://github.com/hantsy/spring-reactive-jwt-sample/blob/master/src/test/java/com/example/demo/IntegrationTests.java
qdzzyb
2020-07-14 15:34:23 +08:00
成功统一 200 就可以了
Vimax
2020-07-14 15:46:15 +08:00
@hantsy 学习了.谢谢兄弟.
Vimax
2020-07-14 15:46:46 +08:00
@qdzzyb 这样语义不清晰吧.
bxb100
2020-07-14 15:49:16 +08:00
@Vimax #4 统一返回 200, 然后返回定义的 业务 code 处理错误
chendy
2020-07-14 15:52:25 +08:00
get 和 delete 默认没 body,指定 application/x-www-form-urlencoded 没用
hantsy
2020-07-14 15:53:22 +08:00
在 Spring 3 。x 的时候都是要自己配置,现在自动内置了 Content Negotiation 内容。

https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc/

对于 REST API,内容协商主要就是根据 Accept (返回内容可接受的格式) 和 Content-Type (请求的内容使用格式) 来决定 mediatype 。

一般情况下:

GET, 前端需要设置 Accept: application/json
POST,PUT 前端需要设置 Content-Type:application/json
DELETE 不用管。

如果有特例,特殊要求,比如 POST 有返回内容,那么 Accept,Content-Type,甚至你可以用不同的格式。

Accept:applicaiton/xml
Content-Type:applicaiton/json

这个依赖你后端是否能够处理。
baiyi
2020-07-14 16:01:33 +08:00
状态码是根据不同的接口有不同的响应。

GET 200 不必多说。

POST 也有很多种形式,如果是正常创建并需要返回创建结果的,可以使用 201 Created
如果是异步处理,提前响应结果的,需要使用 202 Accepted
如果是正常处理,不需要响应结果的,需要响应 204 No Content
如果是正常处理,但结果不方便直接响应,需要返回 205 Reset Content,提示 Client 重新获取

如果你想写一个非常标准的 HTTP API,那就需要学习每个状态码所代表的含义,不能与请求方法一一对应
如果不想这么费劲,因为确实也没多少人在乎,那就完全可以直接 200,也没问题
hantsy
2020-07-14 16:03:16 +08:00
对于 Accept,Content-Type,Spring 的 Controller 方法 @RequestMapping (或者其它 GetMapping,xxx 等) 可以设置 produces,consumes 属性对应处理。

Accept ---------------produces
Content-Type----------consumes

默认情况下,现在 Spring 处理过于宽松,什么格式都放进来。严格的情况下最好指定 Mediatype,对于一些不支持格式,前端访问 API 时,Spring 会更快速的响应,返回 415 。
jones2000
2020-07-14 16:38:22 +08:00
你返回数据结构里面应该有一个状态码, 这些查询或操作失败的, 最好是返回 200 ok, 然后内有有一个状态码来表示具体的错误码,好点的还有一个错误的描述字符串, 方便前端提示给客户,否则都是 404,客户直接抓瞎了。
hantsy
2020-07-14 17:39:57 +08:00
@jones2000 404 怎么会抓狂???

/posts/anoneexistingpost 是一个不存在的 Post
/users/noneexistignuser 是一个不存在的 User
/products/noneexiting 是一个不存在的产品
/orders/noneexiting 是一个不存在的订单
hantsy
2020-07-14 17:41:58 +08:00
不同的路径下 404 的意义已经将不同的 Resource 区分的很清楚,只有 SB 才用 200 返回一切数据。
wangyanrui
2020-07-14 17:44:46 +08:00
全部 200,自定义 code

另:前面的兄弟们吵起来不要带上我~
zhuweiyou
2020-07-14 17:48:21 +08:00
国情是全部 200,你搞各种状态码,前端要骂你的。
qdzzyb
2020-07-14 18:03:32 +08:00
@Vimax #4 不会不清晰吧 GET 200 POST 200 PUT 200 DELETE 200 这四个表示的是四个语义吧
一般前端喜欢 统一返回 200 body 里{code: 0, data: xxx} 或者 {code: xxx, err_msg: "error message"}
EminemW
2020-07-14 18:08:41 +08:00
不是应该 http 状态码描述请求状态 自定义业务状态码描述业务状态么
hantsy
2020-07-14 18:28:40 +08:00
@qdzzyb
@zhuweiyou 你们公司由前端决定系统架构吗?由前端来定交互协议?
hantsy
2020-07-14 18:39:24 +08:00
Angular 中 httpclient 处理 API 使用 Rxjs Obseverable, subscribe 中 next 和 error 天然分开处理。

用 axios 访问 API 的话,then 里面正常业务,catch 处理异常。

代码清楚可见。

全部返回 200 就会部跑到 then 里面, 代码变成屎一样。哪个前端喜欢写这样的屎?我听到很多前端抱怨过后端写的什么垃圾都塞进 200 body,自己拿到还要先判断。

自己的懒惰,无知和无能非要说成什么国情,前端需要。
wanacry
2020-07-14 18:39:57 +08:00
参考 es 的
xlinux
2020-07-14 18:41:41 +08:00
400 会不会被打?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/689938

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX