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

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

  •  a href="Javascript:" Onclick="downVoteTopic(373770);" class="vote">
  •   Treee 2017-07-07 16:45:04 +08:00 12812 次点击
    这是一个创建于 3038 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在学习 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
    iji86  
       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     Solana     5188 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 09:01 PVG 17:01 LAX 02:01 JFK 05:01
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86