HTTP 中的 PUT 和 DELETE 到底有什么用处?

2017-07-07 16:45:04 +08:00
 Treee

在学习 spring MVC REST 时产生的疑问,哪位大神能够解答一下小白我心中的疑惑?! 问题描述:既然 get 和 post 能够完成数据库增删改查的任务,为什么还会有 PUT 和 DELETE 这两个请求方式?而且,就算用这两个请求方式来进行操作,但是服务器端对于数据资源的修改和删除逻辑还是要我们自己来完成(是这样的吧?),那 PUT 和 DELETE 这两个请求方式岂不是没啥作用?

12313 次点击
所在节点    HTTP
9 条回复
wevsty
2017-07-07 16:51:44 +08:00
PUT 和 DELETE 在 WebDAV 上会有用的,对于 WebDAV 来说是已经有实现了的,不需要自己完成。
zrb0001
2017-07-07 16:53:28 +08:00
语义化
SourceMan
2017-07-07 16:57:36 +08:00
对的,语义化
justfly
2017-07-07 17:01:07 +08:00
简单的说,HTTP 本质就是「应用层」的一套协议,制定之初就考虑到增删改查这样的应用场景给你预设了几个 Method ( GET POST PUT DELETE ...),用来区别对资源( URL,统一资源定位符,设计上一个 URL 就是一个资源)的执行的动作。

只要双方使用 HTTP 协议,对一个 URL 使用某个 Method 访问,服务器就知道对应啥逻辑。只是一直以来大家都没严格的这么使用而已。
mornlight
2017-07-07 17:04:55 +08:00
你要这么想的话,一个 POST 就能完成你说的增删改查,无非就是定义好接口然后各种传数据嘛。

GET:获取资源;
POST:创建资源;
PUT:也是创建资源;
PATCH:修改资源(的一部分);
DELETE:删除资源。

通常认为,对创建资源来说,POST 不是幂等的,PUT 是幂等的。参考: https://stackoverflow.com/questions/630453/put-vs-post-in-rest

这些方法都是 HTTP 里定义的东西,实际上服务端怎么处理完全看你想怎么实现,你可以不理会 RESTful 的那些概念。如果遵循 RESTful 那就要思考不同方法对应的语义。
iiji86
2017-07-07 17:11:42 +08:00
my101du
2017-07-07 17:18:31 +08:00
一开始我也很疑惑。后来看了一些 RESTful 的资料后才想明白。
以及 @zrb0001 和 @SourceMan 提到的“语义化”。

例如,客户端的 GET/POST 可能是“获取”,也可能是“操作”, 取决于服务器获取到请求后内部怎么处理(特别是有时候代码写得乱,从 URL 里看不出干啥动作的时候)。
这时仅仅从字面上来看,GET、POST 很难明确看出来 “什么操作”,“操作什么”。

GET /user/id
POST /user/id/action/edit
POST /user/id/action/delete

是吧,一个 POST 请求,可能有多种动作

而明确规定了这几个请求方法,你可以使用

GET /user/id
DELETE /user/1
PUT /user/1

个人觉得更多的是便于我们直接从请求方法+资源就能看出服务器会怎么处理数据。
ahkxhyl
2017-07-07 17:47:35 +08:00
小伙子 这里有个文档 接稳了 http://laravelacademy.org/post/549.html
wtbhk
2017-07-07 17:59:28 +08:00
简单的说,HTTP 的 method 就是一个残缺不全的设计缺陷,而 RESTful 则非要想去合理使用这个 method,带来的结果就很惨。
实际上设计接口用 GET、POST 就足够了,GET 做幂等操作(查询类),POST 做非幂等的修改类。
但实际上你还会遇上条件复杂的组合查询不得不用 POST 来实现( GET 有参数长度限制),这时 RESTful 会推荐你使用 POST,这是 RESTful 的妥协,也恰好证明了 HTTP 的缺陷。
不要纠结这种问题了,好的文档比什么都重要。

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

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

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

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

© 2021 V2EX