V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
Treee
V2EX  ›  HTTP

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

  •  
  •   Treee · 2017-07-07 16:45:04 +08:00 · 12458 次点击
    这是一个创建于 2731 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    这些方法都是 HTTP 里定义的东西,实际上服务端怎么处理完全看你想怎么实现,你可以不理会 RESTful 的那些概念。如果遵循 RESTful 那就要思考不同方法对应的语义。
    iiji86
        6
    iiji86  
       2017-07-07 17:11:42 +08:00
    my101du
        7
    my101du  
       2017-07-07 17:18:31 +08:00   ❤️ 1
    一开始我也很疑惑。后来看了一些 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
        8
    ahkxhyl  
       2017-07-07 17:47:35 +08:00   ❤️ 1
    小伙子 这里有个文档 接稳了 http://laravelacademy.org/post/549.html
    wtbhk
        9
    wtbhk  
       2017-07-07 17:59:28 +08:00   ❤️ 4
    简单的说,HTTP 的 method 就是一个残缺不全的设计缺陷,而 RESTful 则非要想去合理使用这个 method,带来的结果就很惨。
    实际上设计接口用 GET、POST 就足够了,GET 做幂等操作(查询类),POST 做非幂等的修改类。
    但实际上你还会遇上条件复杂的组合查询不得不用 POST 来实现( GET 有参数长度限制),这时 RESTful 会推荐你使用 POST,这是 RESTful 的妥协,也恰好证明了 HTTP 的缺陷。
    不要纠结这种问题了,好的文档比什么都重要。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:41 · PVG 06:41 · LAX 14:41 · JFK 17:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.