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 种请求方式对应使用的数据类型是:

10685 次点击
所在节点    Java
132 条回复
est
2020-07-15 16:22:52 +08:00
@hantsy 呵呵。订单 200 表示存在,404 表示不存在,那已拆分订单如何表示?

硬用 4 个动词+几个有限的状态码去套真实世界的业务模型才是 sb 。
zsdroid
2020-07-15 16:25:05 +08:00
2014 年,某网友:其实所谓的 restful 更适合那些总想着沽名钓誉的硕士研究生们去堆砌辞藻,用来体现出自己比其他众多工程技术人员“高人一等”。
一开始以为其只是个喷子,对其所说不以为然,一笑而过。
如今看来,这位网友说的太对了。就像某位“大佬”一样,restful 确实可以高人一等。
zsdroid
2020-07-15 16:26:32 +08:00
hantsy
2020-07-15 16:30:07 +08:00
我突然发现定制 HTTP 标准定制者,REST 之父 Fielding 博士都不如你们。
@zsdroid
@est
hantsy
2020-07-15 16:31:30 +08:00
在你们的世界,只要一个请求方法,一个状态,所有问题都可以解决,全世界做技术都是 SB 。
markliu2013
2020-07-15 16:34:37 +08:00
@hantsy REST 给安卓和 iOS 端使用,有啥问题吗?
RoyceLee
2020-07-15 16:35:10 +08:00
话都不要说满了,历史的滚滚车轮会告诉我们,当时认为是对的,可能是大错特错的。
hantsy
2020-07-15 16:41:03 +08:00
@markliu2013 没有问题。

但是如果移动端原生开发,可以选择其它协议,不一定要用 REST 。

RSocket 直接用 TCP,原生效率更高。
WebSocket ( web,Android 原生都是可以用),这个我以前做过一个聊天游戏的后端。

当然我以前是主张混合使用,实时用 WebSocket 交互,一般用 REST 。
libook
2020-07-15 16:42:00 +08:00
@iugo

- 告诉客户端它犯了个错误
- 业务上这个资源不存在

把括号里的去掉可能更突出重点? HTTP 4xx 状态表示“Client Error”,所以主要是突出客户端犯了错误,即客户端在当前情况下不应该发送这个请求。
如果你认为当前客户端发这个请求完全合理,在预期正常的情况下,那么就返回 2xx 。

我没有说“协议统统 200,不需要 404”,事实上你返回 200 还是返回 404 都是可以的( REST 根本就没定义应该返回什么,它也完全不 care ),完全取决于你是否认为这个情况是客户端的错误;关键是系统上所有接口得统一起来,哪些情况一律返回 200,哪些情况一律返回 404.

REST 只是个风格,而不是标准。
[Roy Thomas Fielding 博士的论文]( https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm)第 5 章描述了究竟什么是 REST 风格,但是篇幅非常短,即便是第 6 章的实践部分也没有详细介绍 REST 的最佳实践。
论文前面章节提到了 API 设计的一些问题,而 REST 本身就是为了解决这些问题而提出的思路而已,只要是按照这种思路去设计 API,就是 RESTful 的,就能享受到 REST 带来的收益。

如果认为一种设计违背 Roy Thomas Fielding 博士对 REST 风格的定义,可以引用论文里的段落来说明。

当然如果把某企业或某项目的 REST 实践当做标准的话,就没有什么可讨论的了。
est
2020-07-15 16:43:51 +08:00
@hantsy Fielding 这货在 Adobe 最自鸣得意的发明是 Coldfusion 。也没见你来天天吹呢?
libook
2020-07-15 16:44:29 +08:00
忘了这不能用 markdown 语法。。。

Roy Thomas Fielding 博士的论文
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
est
2020-07-15 16:46:25 +08:00
其实 Fielding 发明 RESTful 有一个极其狭窄的用途,那就是最老派的 HTTP 资源。什么是资源?就是文件。所以 RESTful 最成功的应用应该是 WebDAV 。这跟 Coldfusion 的设计也是一脉相承的。然而现代 web 早就进化得连妈都不认识了。你们还抱着 CGI 时代的老掉牙概念到处吹 B 。

以我的觉得,读操作走 GET,写操作走 POST,其余放在 JSON 里拉倒。
xuanbg
2020-07-15 16:48:31 +08:00
@binux 这个和 https 没关系,你可以尝试以移动 APP 或者服务间调用的角度来看这个事情。因为业务层逻辑不想也不应该关心传输层的事情,是的,除了 web 外,其他调用者使用 http(s)协议只是为了传数据而已。如果不同情况下返回的数据类型不统一,处理起来就很麻烦。所以才有只要请求正常,就是 200 这种方案。
对于 web 来说,可以很方便处理 http status,不同的 status 比较优雅。但对于其他端来说,这就是灾难。
hantsy
2020-07-15 16:54:02 +08:00
@libook Richardson Mature Model 具体的可用于 REST 设计的指导性原则。

https://martinfowler.com/articles/richardsonMaturityModel.html

Fielding 那个博士论文主要讲一些 REST 特性。
lbunderway
2020-07-15 17:03:07 +08:00
我们也是统一 200 再由业务 code 区分 哈哈
hantsy
2020-07-15 17:17:03 +08:00
恰好我用过 Allaire Jrun,所以我知道 CodeFusion 也是 Allaire,但我没有用过。后来( 20 年前左右) Allaire 被 Macromedia 收购。CodeFusion,Jrun 这些服务器都是被边缘化。

到了后来,Adobe 并购 Macromedia,早就没有这些产品。

请问 Fielding 是怎么跑到 Adobe 公司去做 CodeFusion 产品???
@est
maigebaoer
2020-07-15 17:18:54 +08:00
所有都是 200,加一个返回码。反正我受不鸟这种,但是公司要用。
est
2020-07-15 17:24:37 +08:00
> 请问 Fielding 是怎么跑到 Adobe 公司去做 CodeFusion 产品???

@hantsy 这个我就不知道了。毕竟 adobe 里只有 ColdFusion 没有 CodeFusion 。
takemeaway
2020-07-15 17:27:50 +08:00
老问题了,你想用什么就用什么,不能自由选择就按照公司给你的标准来。
hantsy
2020-07-15 17:30:26 +08:00
@est 没错,这个你对了,我写错了,是 ColdFusion,一般简写 CF 。这个产品明明是 Allaire 的,那请问怎么变成 Fielding 在 Adobe 期间的得意作品。

Adobe 并购 Macromedia 才几年而已。

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

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

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

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

© 2021 V2EX