V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hijoker
V2EX  ›  程序员

404 只能用在 GET Method 么?某个同事的一个问题把我搞愣了,我觉得所有的 Method 都可以吧

  •  
  •   hijoker · Aug 1, 2022 · 4789 views
    This topic created in 1364 days ago, the information mentioned may be changed or developed.

    比如 post ,put ,delete 都可以报 404 吧,并不只有 get 能报 404. 看了下 mdn 的文档 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404

    22 replies    2022-08-02 10:48:55 +08:00
    thefck
        1
    thefck  
       Aug 1, 2022   ❤️ 1
    如果按照语义来说,post 不应该报 404 吧
    lllllliiii
        2
    lllllliiii  
       Aug 1, 2022
    都可以用
    justfindu
        3
    justfindu  
       Aug 1, 2022   ❤️ 1
    status 和 method 当然不应该是互斥的. 访问页面不存在不就是 404 , 操作的资源不存在 不就是 404 , 怎么就互斥呢
    iseki
        4
    iseki  
       Aug 1, 2022
    我觉得可以,删除一个不存在的对象,往一个不存在的集合里创建对象报 404 都非常合理
    hijoker
        5
    hijoker  
    OP
       Aug 1, 2022
    @thefck 这个是有点道理的,post 是创建
    Pastsong
        6
    Pastsong  
       Aug 1, 2022
    删除一个不存在的对象按照幂等也可以报 204 的
    heyjei
        7
    heyjei  
       Aug 1, 2022   ❤️ 1
    https://www.rfc-editor.org/rfc/rfc9110.html#name-post

    都可以的。具体可以看 RFC 。

    POST 不能返回的状态码有:206 304 416
    justfindu
        8
    justfindu  
       Aug 1, 2022   ❤️ 1
    @hijoker #5 如果你在其他资源下创建关联资源, 其他资源不存在是不是应该 404 . 你不可能不验证吧.
    eason1874
        9
    eason1874  
       Aug 1, 2022   ❤️ 1
    按规范,其他方法也可以报 404

    这种月经问题,不建议讨论
    dem0ns
        10
    dem0ns  
       Aug 1, 2022
    刚用 nginx 试了,POST 也是 404 ,贴闭。
    swulling
        11
    swulling  
       Aug 1, 2022
    假如有一个 URL POST /users/:user/posts

    如果 user 不存在,返回 404 还是 400 ?
    cslive
        12
    cslive  
       Aug 1, 2022
    @swulling #11 这个应该返回 200 ,用业务码
    hahastudio
        13
    hahastudio  
       Aug 1, 2022
    按标准,都可以 404
    突然想起之前看到的一个观点 https://blog.slimjim.xyz/posts/stop-using-http-codes/
    里面更进一步,只有 path 没有( Technical request failed )才返回 404 ,其他都是 200 + error message
    Felldeadbird
        14
    Felldeadbird  
       Aug 1, 2022
    啊,404 不是所有状态都通用吗?这是用来告诉浏览器当前页面丢失 /不可用。
    IvanLi127
        15
    IvanLi127  
       Aug 1, 2022   ❤️ 1
    POST 返回 404 ,HTTP 规范上可以,语义上可以,甚至自定义的其他方法返回 404 也没问题。
    业务上你遵守 RESTful 的话,其实也可以。REST 是风格,可操作的空间还是有的。像 #11 说的,返回 404 和 400 都行。返回 200 就不符合 RESTful 。
    fuxinya
        16
    fuxinya  
       Aug 1, 2022
    修改、删除等操作一个不存在的资源,也是报 404
    libook
        17
    libook  
       Aug 1, 2022
    HTTP 标准中,method 和 status code 通常不是绑定在一起的,也就是说可以根据需求搭配使用,只要客户端、服务端的默认行为符合你的业务需要就可以。

    HTTP 标准里,404 代表 URL 不存在,所以不论是什么 method ,只要 URL 没有对应上任何资源(包括 API 资源)就可以返回 404 。

    在 HTTP 标准的基础上,有一些成体系的使用风格,会把标准进行一些修改,比如 REST 风格,会把 method 跟业务行为绑定,把 status code 跟业务状态绑定。

    假设使用 REST 风格的话,就得定义,当 HTTP 层 URL 资源不存在的时候如何处理,和当业务上的“资源不存在”如何处理。
    wdwwtzy
        18
    wdwwtzy  
       Aug 1, 2022
    @hahastudio 我正好和这个观点持相反意见,must-using-http-codes
    hijoker
        19
    hijoker  
    OP
       Aug 1, 2022
    感谢各位的回复,学到了,主要是把我问愣了
    codehz
        20
    codehz  
       Aug 1, 2022 via iPhone
    按标准 get 还能带 body 呢(虽然浏览器不支持以防止恶意使用攻击实现不正确的服务端)
    所以这事主要还得看自己定义的上层语义
    nothingistrue
        21
    nothingistrue  
       Aug 1, 2022
    POST/DELETE 通常不会 404 ,因为资源添加通常不会产生不存在,删除资源则因为幂等性允许资源不存在。但是,你 POST/DELETE 一个不存在的资源类型,比如说你在教务系统里面添加苹果(简单说就是后台压根没有这个 URI ),那就该 404 了。404 代表的是 URL/URI 不存在,不一定总是代表资源不存在。

    我觉得,这里面应该先别讨论 POST 能不能 404 ,URI 存在但资源不存在的 GET 请求,是返回 404 , 还是 200 。
    ecloud
        22
    ecloud  
       Aug 2, 2022
    如果你只是自己前后端之间用,怎么定义你高兴就好
    如果你的后端 api 要开放给第三方使用,建议 must-using-http-codes
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   842 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 21:23 · PVG 05:23 · LAX 14:23 · JFK 17:23
    ♥ Do have faith in what you're doing.