• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hijoker
V2EX  ›  程序员

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

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

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

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

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

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

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

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

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

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