首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  服务器

如何看待:不遵循 restful_api 设计,所有的 api 使用 POST 提交

  •  3
     
  •   ikaiguang · 55 天前 · 4241 次点击
    这是一个创建于 55 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • GET ( SELECT ):从服务器取出资源(一项或多项)。
    • POST ( CREATE ):在服务器新建一个资源。
    • PUT ( UPDATE ):在服务器更新资源(客户端提供改变后的完整资源)。
    • PATCH ( UPDATE ):在服务器更新资源(客户端提供改变的属性)。
    • DELETE ( DELETE ):从服务器删除资源。

    把所有的 API 都设计为 POST 提交方式,你们是如何看待的。

    懒?

    38 回复  |  直到 2019-08-27 17:23:30 +08:00
        1
    ieiayaobb   55 天前
    当 GET 超过了 URL 限制,只能用 POST 替代
        2
    qq292382270   55 天前
    我觉得挺好的. 因为我的客户大部分只会 post .
        3
    mokeyjay   55 天前
    没啥好看待的,有些人只知道获取资源用 GET,其他所有情况用 POST
    至于用这种还是用 restful 看具体情况谁话语权大了
        4
    Cyron   55 天前
    无所谓,文档写好就行了
        5
    wingoo   55 天前   ♥ 1
    restful 并不是标准, 不用就会出错
        6
    hnbcinfo   55 天前
    严格遵循 restful 我觉得不现实,也不一定就好。我一般就用 Get Post。读操作 get,写操作 post,当然也会偶尔有例外。只要文档写好,有一套规则,别随便用就好。
        7
    rockyou12   55 天前
    远古时代,http 的 get 请求会被各种服务商做缓存,所以请求都用 post 还算合理的设计。现在反正都 https 了,不存在了
        8
    mcfog   55 天前   ♥ 1
    不如何看待,工作那么多年了就没见过纯按标准来的 PATCH 或者 PUT 方法的接口

    顺便,楼主你的理解也并不准确,PUT 同样适用于新增
        9
    learnshare   55 天前
    没有最佳实践,不专业才是正常的,多数上层应用不遵守协议也能凑合运行嘛

    @rockyou12 也不知道谁遇到过这个问题,并把他的垃圾经验推广开了
        10
    ikaiguang   55 天前
    @mcfog

    嗯呢。上面的理解,摘自“ 阮一峰”的。
        11
    ikaiguang   55 天前
    @Cyron
    @qq292382270

    我们的项目都是 post,不使用 get.

    为了贪图方便
        12
    est   55 天前   ♥ 1
    挺好的。

    real world 如果只能用这 5 种方式操作资源简直是智障设定。比如我登出操作,如何对应这 5 种资源操作?
        13
    mcfog   55 天前 via Android
    @est 可以当然是可以的,虚拟资源虚拟万物即可
    DELETE /session/current 或者 /session/:sid
        14
    baiyi   55 天前   ♥ 2
    不赞成所有的 API 都是用 POST

    但同样不赞成将 HTTP 方法对应 CRUD,例如说 POST:确实有“创建新资源”的语义,但是它还有“向数据处理过程提交数据块”的语义,这个“ data-handling process ”描述的太模糊了,所以 POST 方法完全可以替代 PUT、DELETE、PATCH,就像 HTML 的 form 标签,只支持 GET、POST,也完全符合语义的。在《 RESTful Web APIs 》这本书里叫它“ whatever ”......

    所以我个人更倾向于用业务逻辑的安全性、幂等性来定义 API 该是用哪种方法。

    举个例子:转账,使用 CRUD 就很难去对应,有的可能会用 PUT,因为修改了两个账户的余额信息,有的用 POST,但可能是强行将主体对象从账户转为转账记录这样的资源上,就会让人感觉很混乱。

    但如果使用幂等性来判断就很简单,PUT 幂等,POST 不幂等,那转账,肯定是不幂等的。按照这个思路换个例子:修改用户余额,可能这样的场景比较少,但主要是为了说明。这个就应该使用 PUT,应为它是幂等的。
        15
    beyond99   55 天前
    @mcfog 这种为了 restful 而 restful 的方式有什么意义?只会让接口更难懂
        16
    baiyi   55 天前
    @mcfog #13 不建议这样构建资源

    对于用户来说,POST “/user/logout ” 比 DELETE “/session ” 更容易理解,用户需要额外的去理解 session 这个资源的意义
        17
    ArJun   55 天前
    所谓的规矩就是用来打破的,且意义上的 restful 都用 POSt 请求方式并没有什么影响
        18
    wu67   55 天前
    post 没什么毛病啊. 上面也说了 get 会被缓存, 这是其一; 统一 post 的话, 前端 /客户端封装请求方法也简洁很多, 不会出现 新来的菜鸡实习生搞不清楚为什么出错到处发问(笑) 的情况...
        19
    hmzt   55 天前
    挺方便的,甚至一开始就不该设计那么复杂
        20
    Vegetable   55 天前   ♥ 1
    挺方便的,信息更集中,通过 json 传递的参数带基本类型,减少犯错空间.比如 querystring 的 a=1&a=2 这种设计,很容易让新手犯错.

    你可能觉得不遵守规范是不对的,实际上这就是一种权衡,严格遵守 restful 很难,复杂业务下,只要有一份规则,大家共同遵守就可以,没有圣经.
        21
    Cyron   55 天前
    @ikaiguang #11 json api 全用 post 也没问题,时间可以花在命名规范上
        22
    westoy   55 天前
    还有就是跨浏览器和避开一些防火墙对 delete、patch、put 的阻断, 你永远不知道真实世界里会出啥妖蛾子

    框架里最早提倡 REST 实践的是 rails 2 吧, 但是貌似直到现在 rails 都是通过 POST 传_method 字段来做的
        23
    nnqijiu   55 天前
    都用 post
        24
    otakustay   55 天前
    总比都用 GET 好,对吧
        25
    est   55 天前
    @mcfog 那带 CAPTCHA、2FA 的登入呢?

    验证邮箱的 API 呢?

    明明一个 资源名字 + 动词就能描述很清晰的东西,非得限定只用 5 个 verb 去套。。这是削足适履。

    而且正规的 RESTful 还要区分单数复数的。。这个就是个笑话。章鱼有 3 种复数形式。做 log 统计的时候就想把 RESTful 作者砍死。

    对了 RESTful 作者的发明其实就是 Adobe CodeFusion 没啥值得吹的。而且 RESTful 最好的应用也就 WebDAV 了。协议来说其实设计出发点听起来不错,用起来各种问题。性能也不高。
        26
    mayne95   55 天前 via Android   ♥ 2
    谢邀(并没有)
    既然楼主用知乎的提问体,那么我就用知乎的回答体。

    抛开业务场景谈 API 设计的都是耍流氓(加粗)

    规则是个约定俗称的东西,能减少沟通成本,但规则本身也有学习成本。如果 rest 是有 RFC 支持,白纸黑字明文规定的规则。那非常好,大家都按这个来,不会出什么幺蛾子。V 站也不会有人隔三差五的出来讨论 rest 规范。

    (不管对不对,先踩一番显得自己很高明的亚子)
    像 REST 这种含糊不清的约定本来就是一坨 shit,restful ful ful 风格你懂吗,你的 API 有自己的 freestyle 嘛?真是滑天下之大稽!正如 5 楼所说,rest 不是标准,不是标准,不是标准。API 能在符合 HTTP 协议的情况下运行起来即可。

    这个问题就像是,你觉得空格好还是 tab 好。又比如函数式之于面向对象。如果今后 graphql 普及,这个问题还有意义嘛?
    拿前朝的剑斩本朝的官?(大雾)

    在那个 API 风格混乱的年代,rest 的出现如同指路明灯。大家都按着这个来,减少了混乱,降低了沟通成本。这是值得肯定的。但是随着业务场景逐渐复杂,API 的设计已经没法完全符合 rest 的理念了。花心思去设计一个看起来美好的格式高度统一的 API,不如直接加个接口来的简单。

    全用 post 是有缺陷的。举个例子,如果前端要上 service worker,这时候 API 全用 post,请求是没法被拦截并缓存的,也就谈不上什么离线应用。这种场景下用 rest 是保险的。

    GitHub 的 API 堪称业界典范,程序员都喜欢。notion 获取数据全用的 post 请求,但这并不妨碍我喜欢它。重要的是产品。

    好的 API 是自描述的,能够自洽的,符合直觉的。用户在使用某个接口后,能够推导出其它接口的用法。API 面向的用户群体是程序员,对于程序员来说文档最重要。文档是最好的约定,rest 不 rest 无所谓啦。
        27
    mcfog   55 天前 via Android
    @est 我说 restful 能做,又没说建议用 restful 做。

    如果你不懂怎么在一个 restful 风格的体系里设计符合 restful 风格的 2fa 也好 captcha 也罢我可以和你讨论一下我的想法,但我觉得你肯定没有兴趣

    哦对了,我也不喜欢 restful,但喜不喜欢一门技术和是否理解这门技术的优缺点,还有能否理性地讨论一门技术是三件不一样的事情,希望你不会因此错过一些更有价值或是有趣的技术
        28
    artandlol   55 天前 via Android
    建议用 grpc 吧
        29
    akira   55 天前
    文档齐全的 API 就是好 API
        30
    dodo2012   55 天前
    @westoy rails 到现在也是按 rustful 来的,所以写习惯 rails 后,写所有其它语言的接口全会自学按 restful,
        31
    AngelCriss   55 天前 via Android
    不用 http 不就行了
        32
    chocotan   55 天前
    从上面的回复来看,不同的人对 restful 理解会出现偏差
    那就别用了,全用 POST 吧
        33
    chocotan   55 天前
    刚看到二楼...
    我的客户连 content-type 都不懂,指望对方懂这些 http method ?
        34
    tedzhou1221   54 天前 via Android
    我司现状,强制 Post + json 也不知道好不好,但我知道拍板的人不懂技术。
        35
    liuxey   54 天前   ♥ 1
    能完全参照 RESTful 的有几个,所以也不能 50 笑百,

    只要文档清晰, 沟通顺畅,工具好用,HTTP+XML 我也没意见
        36
    est   54 天前
    @mcfog 说得好。。。。
        37
    switch100   54 天前 via iPhone
    前端就是屁事多,给你 api 非得挑三拣四的,乖乖切页面不就可以了吗,还管到后端来了
        38
    StarkWhite   54 天前
    GET, PUT, DELETE 等会对参数转义,调试麻烦,而且浏览器对字符长度限制也比较大,
    GraphQL 就是只用 HTTP POST 了,参数内用 query 和 mutation 标识,多简单~
    话说大家经常讨论的那个 APIJSON 也跟风全用 HTTP POST 了 /狗头
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   888 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 30ms · UTC 18:47 · PVG 02:47 · LAX 11:47 · JFK 14:47
    ♥ Do have faith in what you're doing.