404 只能用在 GET Method 么?某个同事的一个问题把我搞愣了,我觉得所有的 Method 都可以吧 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hijoker
V2EX    程序员

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

  •  
  •   hijoker 2022-08-01 10:42:55 +08:00 4421 次点击
    这是一个创建于 1174 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    我觉得,这里面应该先别讨论 POST 能不能 404 ,URI 存在但资源不存在的 GET 请求,是返回 404 , 还是 200 。
    ecloud
        22
    ecloud  
       2022-08-02 10:48:55 +08:00
    如果你只是自己前后端之间用,怎么定义你高兴就好
    如果你的后端 api 要开放给第三方使用,建议 must-using-http-codes
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2883 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 07:54 PVG 15:54 LAX 00:54 JFK 03:54
    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