V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
red13
V2EX  ›  程序员

你们在设计 restful api 时会用 put 和 delete 吗?

  •  
  •   red13 · 18 天前 · 8906 次点击

    我一直用 get 和 post ,完全可以满足需求,我不知道是否有业务场景是使用 put 和 delete 会带来好处的,我能想到的就是可以一眼看出接口的作用是什么。使用 put 和 delete 在功能性、安全性、性能上能带来好处吗?

    120 条回复    2025-08-16 13:03:09 +08:00
    1  2  
    seedhk
        1
    seedhk  
       18 天前
    刚毕业那几年会,PUT DELETE POST GET 分的清清楚楚。现在直接 GET POST 一把嗦
    momo2789
        2
    momo2789  
       18 天前   ❤️ 30
    首先 RESTful 约定 URL 表示资源(名词),HTTP Method 表示动作(动词)。所以 post /deleteUser 这种 URL 其实把“动词”塞进了路径,不算是纯正的 RESTful 风格。

    功能性上来讲假如上了一定规模,需要用上 API Gateway 。使用标准方法可以让它们自动识别请求意图,从而自动启用缓存、权限、幂等、限流等功能。全用 POST ,那么安全审核无法直接区分这个 POST 是“新增”还是“删除”,只能靠解析 URL 或 Body ,这样更复杂印象性能且容易漏。

    RESTful 不是强制约束,也没有标准。所以找到一个符合公司团队都能一致接受就都可以。当然我还是更推荐使用 PUT 和 DELETE ,可以少走一些弯路。
    BlueSkyXN
        3
    BlueSkyXN  
       18 天前 via iPhone
    一般不会
    maocat
        4
    maocat  
       18 天前 via Android
    直接 post 一把梭哈
    jamesxu
        5
    jamesxu  
       18 天前   ❤️ 4
    国内好多政企部署要求禁用 PUT 、DELETE
    chanChristin
        6
    chanChristin  
    PRO
       18 天前 via iPhone
    我们公司的项目在最早的开发手上做过 put 和 delete ,但是后来就没人写了,在搜接口的时候同一个接口出来好几个,第一次看的时候还好奇为啥几个接口名一样项目没报错。
    接口名字做好语义化就行了,不需要写固定的方法名
    BernieDu
        7
    BernieDu  
       18 天前
    https://app.swaggerhub.com/apis/portainer/portainer-ee/2.19.3#/ 这是 portainer api ,/custom_templates/{id} 同时有 get , put , delete, 这种场景蛮多的,对服务端来说不用命三个名,对客户端来说一看就知道啥意思,封装方法的时候好封,大家都开心。 单纯满足需求的话 get 和 post 肯定是能满足
    flytsuki
        8
    flytsuki  
       18 天前
    会用,但项目刚上线接口容易调不通 最好还是只用 get 和 post
    izneogoud
        9
    izneogoud  
       18 天前
    产生新内容时用 post ,幂等的更新操作时用 put 。
    EastLord
        10
    EastLord  
       18 天前 via iPhone
    项目里没用,所以我也不用
    loading
        11
    loading  
       18 天前
    如果写下一个,我准备都用 POST ,GET 也不用了。
    pusheax
        12
    pusheax  
       18 天前   ❤️ 1
    之前出过好几个与 PUT 相关的安全漏洞,如 tomcat 的 CVE-2017-12615 和 IIS 的 Webdav 漏洞。
    虽说这更多还是应用程序设计的问题,但搞的安全人员有点 PTSD 。水平较差的漏洞扫描器或者入侵检测设备,看到 PUT 就喜欢报安全问题。
    因而会有一刀切要求禁用 PUT 的情况。
    irisdev
        13
    irisdev  
       18 天前
    运维和信息安全不让用
    dcsuibian
        14
    dcsuibian  
       18 天前
    PUT 很少用,一般是用 PATCH ,DELETE 肯定很常用了
    我挺喜欢 RESTful 的,一般能用 RESTful 的地方我都要 RESTful 。不过自己对 RESTful 的理解也是慢慢加深的,所以也不敢说接口很 RESTful
    本质上来说,他这个东西省的就是沟通成本,很清晰
    不用 RESTful 当然可以,但是目前没有更好或者平替的方案
    MonkeyJon
        15
    MonkeyJon  
       18 天前

    问就是全上
    jiangzhexin
        16
    jiangzhexin  
       18 天前 via Android
    @izneogoud 更新内容有 patch method
    ryalu
        17
    ryalu  
       18 天前
    post 一把梭。对大家都好
    nekoneko
        18
    nekoneko  
       18 天前
    都用, delete 用来删除, put 用来完全更新, patch 用来部分更新
    lxh0412
        19
    lxh0412  
       18 天前   ❤️ 1
    get post 就好啦,为啥要给自己找事呢
    so2back
        20
    so2back  
       18 天前
    post 一把梭,感觉没必要讲究那么多
    EricYuan1
        21
    EricYuan1  
       18 天前
    @jamesxu 为啥啊
    caiqichang
        22
    caiqichang  
       18 天前
    put delete 比 restful 诞生得早,restful 是给 put delete 强加概念
    Configuration
        23
    Configuration  
       18 天前   ❤️ 1
    POST /orders orders#create
    GET /orders/:id orders#show
    PATCH /orders/:id orders#update
    PUT /orders/:id orders#update
    DELETE /orders/:id orders#destroy

    用啊
    nanpu
        24
    nanpu  
       18 天前
    用啊,
    ala2008
        25
    ala2008  
       18 天前
    安全检测不能使用
    pyyalt
        26
    pyyalt  
       18 天前
    确实 一般很难做到 所有方法都用到,一般都是怎么方便怎么来。我司是随便用。😄
    jeesk
        27
    jeesk  
       18 天前
    看情况, 如果用 grpc 就是一把梭子。 如果用 http 只用 get /post . 方便测试开发。
    xiangyuecn
        28
    xiangyuecn  
       18 天前
    脑子不好使 restful
    脑子好使点 get post
    自己说了算 post
    xiejay97
        29
    xiejay97  
       18 天前
    以前分,现在全是 post ,约定 api 命名规则
    gotonull
        30
    gotonull  
       18 天前
    我们做 toB 项目的用 delete 过不了人家的安全扫描。现在全是 get 、post 一把梭
    K753255157
        31
    K753255157  
       18 天前
    我愿称之为,纯粹没事找事
    S1ahs3r
        32
    S1ahs3r  
       18 天前
    会有 REST 警察出没的。
    arsenal4
        33
    arsenal4  
       18 天前
    单一资源还好,我想问一下嵌套资源的最佳实践是什么?如获取客户的订单
    1 、/customer/{customer_id}/orders:如果用这种接口写在哪个控制器里,返回结果是直接返回订单数组还是先返回客户信息,再套订单数组。如果是后者分页怎么搞?
    2 、/orders?customer_id=xxx:上面的方式要查询所有客户的订单好像也没那么方便,所以用这种好像更方便

    似乎看起来第一种形式更符合语义但是有不方便的地方,第二种更方便。哪一种算更符合标准 Restful 呢?
    kuaner
        34
    kuaner  
       18 天前
    不会用,很多神奇的 waf 会禁用
    xiejay97
        35
    xiejay97  
       18 天前
    @arsenal4 如果是我设计,应该是 /orders/list ,customer_id 作为查询参数
    dfkjgklfdjg
        36
    dfkjgklfdjg  
       18 天前
    全部都用 POST 也可以实现全部的业务需求。那么为什么还要多一个 GET 呢,有什么好处吗?自己回答一下就知道了。
    i8086
        37
    i8086  
       18 天前   ❤️ 1
    经过 nn 个项目的经验,最兼容的方式全部用 POST 。
    ms17010
        38
    ms17010  
       18 天前
    会用,不过可能其他地方某些无脑一刀切的 WAF 和运维安全人员会封 PUT 、DELETE
    li746224
        39
    li746224  
       18 天前
    不用,我们公司的安全检测会报“ 检测到目标服务器启用了 OPTIONS 方法”的风险提示。只能微笑.jpg 了
    Narcissu5
        40
    Narcissu5  
       18 天前
    现在好多人设计的 restful 接口一股 web service 的味道,完全没有意识到当年 web service 是怎么死的。。
    另外一个更严重的问题是很多所谓的 restful 接口不用 http 状态码表示错误,而是把错误放在消息体里面,消息体可能还不标准,一会儿`code`一会儿`errorCode`的,结果就是完全没法做监控,系统早就挂了后端还感觉良好。
    Reficul
        41
    Reficul  
       18 天前
    说服对方,不如远离对方。 年纪大了,爱咋咋滴吧。
    chawuchiren
        42
    chawuchiren  
       18 天前
    以前会,现在全部 POST ,并且只有 httpcode 200
    wenkgin
        43
    wenkgin  
       18 天前
    我以前的同事项目用了 get 、post ,就搁那天天 restful 接口、restful 接口,我都 webapi 就 webapi 嘛 偏要叫 restful 显得高级。
    我觉得 restful 接口挺好的 规范!虽然现在很多都是通过权限去限制接口,但是没有 delete 、put 分的细且更直观。
    dd0754
        44
    dd0754  
       18 天前
    以前用,现在全部 post~~~
    HolmLoh
        45
    HolmLoh  
       18 天前
    用 patch 有时候前端又说用不了
    用 get 做 feign 的 API 又反馈说 query parameter 超出系统限制长度,要改配置文件不愿意改,又有时候说团队规定的 LocalDateTime 格式跟 feign 自带的格式不匹配,用不了 @JsonFormat
    反正一堆乱七八糟的问题吧,想要定义优雅的接口变成了自寻烦恼,现在已经经历了好多个项目了,不想用了,接下来全用 POST 算了
    Stevenv
        46
    Stevenv  
       18 天前
    restful 最傻逼的地方就是 路由上有参数,body 里也有参数。
    特别是业务复杂了,路由长的一批
    HetFrame
        47
    HetFrame  
       18 天前
    用 method 区分的话,全局搜一个接口结果搜出来多个,还得一个一个看 method
    GuluMashimaro
        48
    GuluMashimaro  
       18 天前
    @jamesxu 因为有的漏洞扫描软件会报这是漏洞
    nivalxer
        49
    nivalxer  
       18 天前
    最早是强制要求,严格区分
    后面在某些项目上某些态势感知和防火墙会识别为是异常请求直接中断,找客户联合厂家沟通又是半天
    现在基本没强制要求了
    adzchao
        50
    adzchao  
       18 天前
    现在 put 都少了,如果是全量更新才会用 put ,部分更新使用的是 patch
    hyqCrystal
        51
    hyqCrystal  
       18 天前
    不好用 就不用了
    SoloKing
        52
    SoloKing  
       18 天前
    阿里云 CND 不支持 delete 和 patch ,DCDN 才支持,有时候想用也不行
    wk8023
        53
    wk8023  
       18 天前
    不用 put 和 delete ,就不是 RESTful ,就是普通的 rpc 风格
    way2create
        54
    way2create  
       18 天前
    一般不用,没完全遵循 restful api ,直接 get post 一把梭,用地址去体现操作,不过我无所谓的,随便,只要结合应用场景有一套合理的规范即可,别跟我遇到的某些傻 x 一样把不同语言的规范直接套到别的语言或数据库甚至还自己造个框架难用的要死自我陶醉就行
    crazycloudccc
        55
    crazycloudccc  
       18 天前
    线上 post, 调试 get;
    主要是图个好记;
    JoeDH
        56
    JoeDH  
       18 天前
    懒得用 我看个方法直接看 Url 就能知道他大致做什么 如果用上了还得瞟一眼 method 来区分同路径的 url 真费劲 纯粹给自己找事
    since1997
        57
    since1997  
       18 天前
    @jamesxu indeed
    joooooker21
        58
    joooooker21  
       18 天前
    下一个准备只用 POST
    QlanQ
        59
    QlanQ  
       18 天前
    主要是 命名困难,所以用了 restful
    但是 在查询 列表,比如 查询所有的 orders 的时候,按理说应该用 get 表示获取
    但是如果有很多查询条件,又觉得 在 url 太难看,太长,而且还有可能参数数 数组或者有其他的符号,就感觉 get 不行
    所以 我一般 get orders 这种,都会改成 post /order/search ,post /order 创建
    jamesxu
        60
    jamesxu  
       18 天前
    sam2478
        61
    sam2478  
       18 天前
    个人觉得 put, delete 更优雅一点,Apple Ads Api 也是这样的
    skallz
        62
    skallz  
       18 天前
    对外的接口一般就 get 和 post ,甚至只用 post ,因为 put 和 del 接口别人不一定能对接,不要给自己找麻烦,自己项目内部使用的话就随便了,反正五花八门的团队标准都见过
    ljkgpxs
        63
    ljkgpxs  
       18 天前
    POST 一把梭哈,功能用 url 区分
    jsq2627
        64
    jsq2627  
       18 天前
    刚毕业的时候会。现在见的项目多了,国内外都有,聪明和傻比的程序员也都合作过不少,最明智做法是 GET/POST 一把梭,沟通成本最低,出问题概率最低。
    yibo2018
        65
    yibo2018  
       18 天前
    已经有大半年没写过这些细节了,AI 想怎么写都行
    flybluewolf
        66
    flybluewolf  
       18 天前
    按照楼主的说法,post 也完全可以不用,所有 get 一把梭....
    love2328
        67
    love2328  
       18 天前
    直接 post 一把梭哈 , 特别自己的项目
    y1y1
        68
    y1y1  
       18 天前
    restful 不就是要用 method 作为语义的一部分么
    fuzzsh
        69
    fuzzsh  
       18 天前 via Android
    我大清自有国情在此,不面向锅内的业务才能用除 get post 以外的 method ,抓你做等保的时候,你在全量改 API ?黑皮只认为 get post 才是安全 method ,其它都什么牛鬼蛇神
    yuyanggongzi
        70
    yuyanggongzi  
       18 天前
    一般就用 get post delete
    AX5N
        71
    AX5N  
       18 天前
    @flybluewolf 百度还真就是这样,直接把 json 写在 url 里。
    aababc
        72
    aababc  
       18 天前   ❤️ 1
    感觉这种帖子没啥意义,有喜欢 restful 的,有喜欢 rpc 的,有喜欢 graphql 的,最终讨论不出来个啥,自己权衡利弊之后,选择一个比较适合自己场景的,然后制定好各种规范就 OK 了
    aababc
        73
    aababc  
       18 天前
    @QlanQ #59 好像最近出了一个规范添加了一个 Query Method 来解决这个问题
    runliuv
        74
    runliuv  
       18 天前
    @seedhk 优秀
    kakki
        75
    kakki  
       18 天前
    这个只是风格问题,没有高下之分吧,除了那些搞什么网安的强制外,爱用什么用什么.只是各种接口管理工具五颜六色好看,那必须全用起来.
    Dogtler
        76
    Dogtler  
       18 天前
    不用 put get delete post 对资源进行操作的接口能被叫做 restful 么??? 但是据我观察,好像还有另外的解释?
    Kumo31
        77
    Kumo31  
       18 天前
    只用 PATCH ,不用 PUT 。严格来说我们用的也是不是标准的 RESTful ,是 Google Cloud 的标准: https://google.aip.dev/
    malzahar
        78
    malzahar  
       18 天前   ❤️ 1
    如果是自己的服务,那随便怎么搞都行。如果是公司的,我建议你按标准来。

    虽然看起来没啥区别,但是不标准的接口对你的下游简直是灾难。

    如果是标准 restful ,API 网关,metrics ,tracing 等等其他系统都可以无缝衔接,否则就要为你单独适配了,这种工作就是不做不行,做了纯属浪费时间。
    作为 SRE ,我提供给别人的接口都是标准 restful ,谁给我不标准的我就喷谁
    SchwarzeR
        79
    SchwarzeR  
       18 天前
    直接全 post ,方便规范 cover 团队能力最下限的人。
    另外除了 get 和 post 的外的请求有被某些脑瘫上古运维和安全系统 ban 掉的风险 [我还见过会 ban http2.0 的
    clarkethan
        80
    clarkethan  
       18 天前
    如果下游没有要求,目前倾向于 get+post 一把梭,符合中国国情
    leeg810312
        81
    leeg810312  
       18 天前
    azure/aws 这些云服务的 rest api 都是这么设计的呀,我也遵循这样的规范,在公司做项目的时候就是这么用的
    niceyoo
        82
    niceyoo  
       18 天前
    项目的生产环境直接把 delete 、put 请求方式禁了,只能 post 、get 一把梭
    SanjinGG
        83
    SanjinGG  
       18 天前
    自己写基本是怎么规范怎么来,公司项目后端用什么就用什么
    leeg810312
        84
    leeg810312  
       17 天前
    我遵循 restful 规范做不同业务系统给十几个外资大企业用,它们用不同的安全扫描软件,但都没有说这个有问题。我知道政府国企限于它们的 IT 管理能力,这些机构项目可能不行,但给其他企业用说安全扫描不允许,表示非常怀疑什么安全扫描会扫出来认为这个有问题。
    akakidz
        85
    akakidz  
       17 天前
    政府类项目,只能用 post/get
    SynchronizedLock
        86
    SynchronizedLock  
       17 天前
    @EastLord 是没地方 CTRL C 吗
    fionasit007
        87
    fionasit007  
       17 天前
    @jamesxu #5 之前 oss 没关 put 被网管通知过
    ychost
        88
    ychost  
       17 天前
    @seedhk 真实,有时候 GET 都不想用了,参数嵌套了还得 POST 好使
    fuchish112
        89
    fuchish112  
       17 天前
    全部 post
    Pantheoon
        90
    Pantheoon  
       17 天前
    跑起来就完了 整那么多事 都用 post
    jackOff
        91
    jackOff  
       17 天前
    post 一把梭
    BQsummer
        92
    BQsummer  
       17 天前
    虽然我也喜欢用 restful ,但是我是做监控的,你 url 不一样,我怎么把指标聚合,纯数字还好,英文混数字的,根本没法识别
    baiyi
        93
    baiyi  
       17 天前
    怀念啊,曾经的月经贴,现在一年都看不到一个了

    其实 RESTful 主要是大家有一个统一的描述接口的规范,比如接口的安全性,幂等性,用不用取决于涉及到的团队开发人员以及项目使用的相关 web 组件
    spike0100
        94
    spike0100  
       17 天前
    get+post 。其他的用的少
    EastLord
        95
    EastLord  
       17 天前
    @SynchronizedLock 为了与项目代码风格保持一致
    dssxzuxc
        96
    dssxzuxc  
       17 天前
    全用 post 。
    现实是复杂的,RESTful 的表达能力不足以覆盖所有 case ,强行使用统一约定会让一些简单的东西变得难以理解。
    2#说 `全用 POST ,那么安全审核无法直接区分这个 POST 是“新增”还是“删除”,只能靠解析 URL 或 Body ,这样更复杂印象性能且容易漏。`
    为什么要区分是新增还是删除,而且一个接口本来就可以删除一些 A ,新增一些 B ,修改一些 C 。
    真正的安全策略应该基于权限规则和业务逻辑,不应该简单地基于约定式的 Method ,它本质上和 /add /edit /del /info /page 一模一样,能严格遵守 RESTful 标准的人,同样能遵守自定义的语义要求。
    我一直觉得接口的语义化完全没必要,一个硬编码玩出花来有什么意义,只要把代码给组织好就足够了。
    Oktfolio
        97
    Oktfolio  
       17 天前
    很少有全量更新的场景,所以不怎么用 PUT 。用 PATCH + Json Patch ,不然就是 POST /resources/{id}:action 这种设计。
    kinkin666
        98
    kinkin666  
       17 天前
    后端服务,post 一把梭哈,而且有时候还有超接口,里面就俩字段 method 和 payload ,可扩展性 max
    nexo
        99
    nexo  
       17 天前
    你这题目就是个悖论 如果你遵循 restful 风格就得用 put 而且你问出这个问题就说明了你不懂 restful
    illiteracy0001
        100
    illiteracy0001  
       17 天前
    标准是标准,真用起来就会发现各种问题,完全的资源抽象有一定的难度、前端也不一定愿意配合
    1  2  
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:25 · PVG 14:25 · LAX 23:25 · JFK 02:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.