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 写的客户端来说,恐怕就忍不住要问候服务端程序员一家了。

更重要的是……

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

全文完,欢迎拍砖。

42324 次点击
所在节点    程序员
207 条回复
uzumaki
2017-02-17 15:14:36 +08:00
秀优越 秀大神还是找喷?
hysterin
2017-02-17 15:37:03 +08:00
讲道理,我是来学习撕 b 技巧的。
真的受教了。感恩各位大神。
uzumaki
2017-02-17 15:42:08 +08:00
@hysterin 妹子 可以约么。。。
hysterin
2017-02-17 15:43:53 +08:00
@uzumaki 拒绝。
neurocomputing
2017-02-17 15:45:58 +08:00
瞧你说的 HTTP 其实也不需要了

直接 raw TCP 通信呗
开头写上资源和动作 后面跟参数就行了呗
silva
2017-02-17 15:54:53 +08:00
@uzumaki 问个问题啊,在没有特定背景铺垫的情况下,直接论坛上看到个女的就约,有成功的可能性么?
ijustdo
2017-02-17 15:56:41 +08:00
我咋看都觉得应该是 nginx rewrite 该干的事
xcv58
2017-02-17 16:03:21 +08:00
uzumaki
2017-02-17 16:16:42 +08:00
@silva 虎躯一震,王八之气一发,只要你说就有机会,不说,机会都没有,再说了,你不知道他是谁而已
silva
2017-02-17 16:32:48 +08:00
@uzumaki 积极乐观的精神真是让人欣赏。。。原来真的有人这么想的。。。
受教了,谢谢啊
uzumaki
2017-02-17 16:36:20 +08:00
@silva 嘲讽么。。
silva
2017-02-17 16:39:52 +08:00
@uzumaki 怎么会,只是经常看到类似现象,有点好奇是不是真的可以约到罢了
noli
2017-02-17 16:46:02 +08:00
@hysterin

讲道理的话,我这种撕的手段只能在 v2 生存。因为这里的立场是讲有帮助的内容。

遇到像你这样的回复,我肯定没招。完全是天外飞仙的歪楼,而在别处不一定属于禁手。
uzumaki
2017-02-17 16:54:45 +08:00
@silva 你有酒么。其实不能, but....这妹子我肯定能约上。
hysterin
2017-02-17 16:57:35 +08:00
@noli

不不不,您误会了,先跟你道个歉。这里不是来歪楼的,确实是表达敬意。只是可能态度不太端正。

事实上我是做品牌的,您的回复全程我都有关注。

虽然内容准确与否有待商榷,毕竟是争议性话题,而且大家各有立场,无法说出个绝对正义。但是您的回复,非常精彩,公关级的撕逼。除了有几楼稍微过激之外,真的是很厉害。
----------------------------------------------------------------------------------------
顺便回复 @silva 小伙伴,悄悄跟你说,别说论坛了,我曾经认识过一个妹子还能在淘宝约。。平台不重要,重要的是你想不想约。。想约就总有上钩的人的。。。
baconrad
2017-02-17 17:27:56 +08:00
@noli

那兩句話只是想提醒自己,不要再犯同樣的錯誤。

兩年前看到 Restful 的設計方式後,真的覺得自己撿到了一塊寶,興奮地和當時合作的後端介紹它的規範和理念,然後討論著該如何導入之後的項目裡。

但以結果來說我錯在太堅持,全部依賴 Restful 設計原則,導致任何需求必須把它捏成 Restful 能夠接受的樣子,還得告訴自己 Restful 果然很棒,什麼都做得到。

「當時的我們就像拿著鎚子的小孩,所有的東西都想拿鎚子來敲。」

Restful 可以解決大部分的需求,我同意,
但不是所有需求都得用 Restful 解,即使它做得到。

離題了,
但這是那兩句話的原意。
silva
2017-02-17 17:30:19 +08:00
@hysterin 谢谢来自妹子圈的实例,我的世界观又可以刷新升级了。
话说淘宝那个,妹子主动约应该比较简单吧。

------------------------------------------------------------
@uzumaki 这么有信心,其实你俩本身就是好 CP 吧?
uzumaki
2017-02-17 17:46:43 +08:00
@noli 事实就是 当你用如果是纯粹的 xxxx 来考虑,就违背了现实因素。我还纯粹数据库呢。。要你这有何用
youutetsu
2017-02-17 17:55:18 +08:00
这帖子太精彩了,忍不住冒个泡
Nitromethane
2017-02-17 21:15:08 +08:00
Restful 只是 http 这一层面的~
客户端浏览器使用 restful ,或服务端使用 restful ,模板都是解决工程问题。
服务端调用其他系统的借口,当然还是习惯 RPC 和 Thrift~

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

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

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

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

© 2021 V2EX