RESTful 有用吗? HTTP 有 GET POST 就足够了?

2017-02-15 12:59:26 +08:00
 noli

不少程序员都是这么认为的,基于 HTTP API 的服务,只要用 GET 请求和 POST 请求就足够了。 像 RESTful 这样的 大量使用 PUT , DELETE 请求是不必要的。

真的吗,我来举一个例子。

假设有一类资源 ResourceXYZ ,对其有增删查改的操作。 如果只使用 GET POST 之类的设计方式,那么很可能会设计以下的请求接口:

POST .../addResourceXYZ
POST .../delResourceXYZ
GET .../getResourceXYZ?resourceId=resourceId
POST .../updateResourceXYZ

如果按照 RESTful 的 设计方式,很可能会设计以下的请求接口

POST .../ResourceXYZs
DELETE .../ResourceXYZ/{resourceId}
GET .../ResourceXYZ/{resourceId}
PUT .../ResourceXYZ/{resourceId}

现在假设,客户端要获取该资源,其 ID 为 resourceId 。 如果成功,那么一切都好说。 如果失败, Restful 的处理方式是,通过 HTTP status 返回错误码来表示原因,例如 404 表示该资源不存在。

那么只用 GET POST 两种方法的方式呢? 响应请求

GET .../getResourceXYZ?resourceId=resourceId

的时候能不能也用 404 呢?

按照 404 的语义,响应 404 是不对的: 因为客户端请求的 URL 实际上是正确的,只是对应的参数没有找到对应的结果 很多时候,就只能靠响应 200 然后返回空数据或者空对象来处理了。 例如 Content-type 为 application/json 时,可以返回 {} 或者

{
    "error": "not found",
    "code": 404
}

这样就会要求客户端,必须处理 HTTP 回复的具体内容,而不能只处理头部。 那么客户端要怎么处理这个 json 呢 要先解析 json ,然后尝试分别这是一个资源的内容,还是一个错误提示。

对于强类型语言例如 C/C++ OC Swift 写的客户端来说,恐怕就忍不住要问候服务端程序员一家了。

更重要的是……

没有库会支持这种拍脑袋式的设计。

全文完,欢迎拍砖。

40963 次点击
所在节点    程序员
207 条回复
noli
2017-02-15 16:24:59 +08:00
@PhilC

在我那个实现里面, POST Transaction 的时候大多数情况下返回 200 以及事务 ID
然后根据 事务 ID 查询 事务状态的时候,会给出事务的状态、结果什么的。

当然,这个设计是有不足之处的,例如 事务里面的前后两条如果有输出间的依赖关系的话,目前是实现不了的。
但是,你举的这个例子也太 TM 弱智了吧……?
hronro
2017-02-15 16:38:59 +08:00
undeflife
2017-02-15 17:01:12 +08:00
@magict4 后几个都可以用 patch 因为是修改状态
Sight4
2017-02-15 17:02:26 +08:00
这个 topic 在 V2EX 已经引战 N 次...

1. 在经历多个前后端分离的坑之后,从结果上看,完全符合的 restful 规范风格的 api 是很难实现(应该说是实现起来反而很别扭)

2. 但是 restful 风格的 URL 、幂等性、授权对于设计基于 web 的 api 是很有指导意义的,所以最终在项目实施的时候,很多时候都会按照资源来划分 url ,但是不再使用 http 返回码以及 method 来表达资源的结果和用途,毕竟, API 文档还是要写的嘛

3. 其实,统一的 http post 在某种意义上很方便前端对 api 的封装
chairuosen
2017-02-15 17:06:30 +08:00
又来引战了
noli
2017-02-15 17:10:03 +08:00
@msg7086

漏了回复你。
对于某些浏览器不支持 GET POST 之外的动作,可以用 http method override
baiyi
2017-02-15 17:37:36 +08:00
@Sight4
@chairuosen

虽说我也认为楼主有点引战的意思.
但是,这类的"战争"我觉得还是有一定意义的.
能引得起来,就说明还是存在着许多人不认同的地方,有了更多的讨论,融会贯通嘛,对自身的理解也很有帮助
noli
2017-02-15 17:39:44 +08:00
@Sight4

1. 因为很多人根本没有操刀设计 API 的水平。别说 RESTful 了,我厂也算知名互联网企业,某 C++ SDK 出品一样是个渣渣。 RESTful 要考虑的更多难度更高,但说 RESTful 会导致实现别扭…… 呵呵

2. HTTP 返回码和 回复里面的返回码,通常其含义不应该是冲突的,诸如 HTTP 200 但是 "code": 404 这种只能说某些人自以为很了解 HTTP 协议及其客户端。


3. 不用 HTTP method ,那么基本上就是把动作写在 URL 里面,这种设计我觉得见仁见智,有些时候是很省事,但通常深挖一下就会发现是解耦不够。
更重要的是,这基本上等于放弃了各种 RESTful client SDK 带来的好处。
那还不如直接点干脆不用 HTTP

所以我觉得你说了很多没有经过深入思考的经验,但基本上是废话。
guokeke
2017-02-15 17:41:36 +08:00
restful 已死。 graphql 当立。
Sight4
2017-02-15 18:10:58 +08:00
@baiyi 唉,主要是每次引战,非得要说那个是适合,那个不适合,抛开场景来啥扯一般很难有结论, restful 优雅,但 db 设计的三范式何尝不是?度是很重要
cnt2ex
2017-02-15 18:20:12 +08:00
URL 不是 Uniform Resource Locator 吗?
Actrace
2017-02-15 18:30:25 +08:00
猩球大战开始了。
Lucups
2017-02-15 18:42:56 +08:00
同样的话题这已经是我看到过的第 4 篇 topic 了。

看到现在的评论,我的感觉是大多数人倾向于:
restful 不错,有借鉴意义,但我只会有限使用或者在不会去用。
lightening
2017-02-15 18:52:29 +08:00
@magict4 仔细想的话,其实都是对资源的操作。

发送是 CREATE 了一个 delivery ,移动和归档是 UPDATE 了状态(或位置,取决于你的实现)。我倒不是觉得做 API 应该永远按照 RESTful 设计,但确实仔细想想的话,确实至今我没有遇到任何不能 fit 进 REST 的操作。

推荐 DHH 的关于 RESTful 的演讲: <amp-youtube data-videoid="GFhoSMD6idk" layout="responsive" width="480" height="270"></amp-youtube>
jsq2627
2017-02-15 20:13:22 +08:00
restful 是信仰,不是一言两语能说清楚的。
https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md
pathbox
2017-02-15 21:31:41 +08:00
怎么会没有人用呢
zhengkai
2017-02-15 21:36:35 +08:00
忘了 RESTful 吧,去了解 GraphQL
zonyitoo
2017-02-15 23:25:55 +08:00
其实 GET 也是多余的,只需要 POST
Balthild
2017-02-16 01:06:52 +08:00
@noli 别转移话题,我说的不是什么东西比 REST 更优雅,我说的是在不用 REST 更优雅的前提下就不要用 REST 。
请求的东西不是资源时, REST 一点都不优雅。
noli
2017-02-16 01:50:21 +08:00
@Balthild

你要说优雅,那你优雅的标准是什么?举个例子都没有,我很难跟你说话哦。

又说请求的东西不是资源,什么东西不能视作资源来被管理呢?除了无限的东西之外。

你没有办法用合适的方式把要管理的东西视作资源
——我见到的很多程序员都这样,例如楼上某层不知道事务怎么用资源视觉来处理——
就说 RESTful 不优雅,这是拒绝承认自己有问题。

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

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

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

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

© 2021 V2EX