V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
godruoyi
V2EX  ›  HTTP

你还在用 HTTP 200 状态码来返回错误响应吗?

  •  
  •   godruoyi · Oct 9, 2018 · 9486 views
    This topic created in 2763 days ago, the information mentioned may be changed or developed.
    HTTP/1.1 200 OK
    Server: nginx/1.14.0
    Content-Type: application/json
    Connection: keep-alive
    Cache-Control: private, must-revalidate
    Date: Tue, 09 Oct 2018 09:31:59 GMT
    ETag: "974542d418f5a923b40fa1e01cba99b8d94216e1"
    Content-Length: 62
    
    {"code":-1,"msg":"用户名密码错误"}
    
    36 replies    2018-10-10 13:15:59 +08:00
    coosir
        1
    coosir  
       Oct 9, 2018
    现在这样做还是很普遍吧,很多公司并不会严格遵循 REST 风格
    HTTP 状态码用来判断系统问题
    JSON 里面的 code 用来判断业务问题
    dobelee
        2
    dobelee  
       Oct 9, 2018
    同意楼上,不喜欢把系统问题和业务问题混为一谈,范式不是必须。
    dorothyREN
        3
    dorothyREN  
       Oct 9, 2018   ❤️ 1
    没毛病啊,你请求的资源是成功的,所以返回 200 啊。
    heixiaobai
        4
    heixiaobai  
       Oct 9, 2018 via Android
    对啊,不然呢?你打算用哪个状态码? 404 ?
    godruoyi
        5
    godruoyi  
    OP
       Oct 9, 2018
    @HeiXiaoBai 你咋不说是 `500` 呀
    godruoyi
        6
    godruoyi  
    OP
       Oct 9, 2018
    @dorothyREN 恩, 你这样说我真的无言以对呢
    godruoyi
        7
    godruoyi  
    OP
       Oct 9, 2018
    @dobelee 噢,
    godruoyi
        8
    godruoyi  
    OP
       Oct 9, 2018
    @coosir 噢,
    ic2y
        9
    ic2y  
       Oct 9, 2018
    不会严格按照 REST 风格,还是要封装一层业务 code,方便进行定制
    alvin666
        10
    alvin666  
       Oct 9, 2018 via Android   ❤️ 1
    状态码不是 200 是系统出问题了,比如错误捕捉没写好,返回 500,这种情况就有很多可能了,然而只要请求成功,具体错误可以写的很清楚,比如说我一个请求有五十种状态,http 状态码哪里够?
    别太杠,多学学
    jlkm2010
        11
    jlkm2010  
       Oct 9, 2018   ❤️ 3
    正常返回数据,比如一个 user 信息,{id:1, name: "xx"},状态码用 200-300 之间;
    当出现错误时,http 状态码使用 400-600 之间的错误码,同时 response 里返回业务错误码和具体错误信息,比如{code: 1, msg: ""}
    我一般这么设计
    MeteorCat
        12
    MeteorCat  
       Oct 9, 2018 via Android
    同意一楼,服务器系统层面的错误码最好和 API 错误码区分开
    U7Q5tLAex2FI0o0g
        13
    U7Q5tLAex2FI0o0g  
       Oct 9, 2018
    200 没毛病,确实请求成功了。
    其他业务错误码就用返回 json 里的 code
    gamexg
        14
    gamexg  
       Oct 9, 2018   ❤️ 1
    听说有运营商、设备会劫持非 200 的响应,
    虽然现在流行 https,但是还是有一些是 http 会中招。
    DCjanus
        15
    DCjanus  
       Oct 9, 2018 via Android
    范式统一就好了,又没什么优劣之分。
    很多人吹 RESTful,却没看过 REST 原始论文,不理解为什么那样设计,只能在细枝末节上做原教旨主义者。
    chotow
        16
    chotow  
       Oct 9, 2018 via Android   ❤️ 1
    用户名密码错误,我会用 400 错误。
    littlewing
        17
    littlewing  
       Oct 9, 2018
    正常,为什么一定要遵循范式?
    就比如数据库表的设计,很多时候反范式才是最好的设计
    blless
        18
    blless  
       Oct 9, 2018 via Android
    这里只是把 http 当业务承载层而已吧,本质上其实就是 rpc 啊,RESTful 实现起来真的麻烦…
    malusama
        19
    malusama  
       Oct 9, 2018
    验证错误不是 401?
    malusama
        20
    malusama  
       Oct 9, 2018
    用状态码和响应信息并不矛盾把? 401 也可以带详细信息啊
    xderam
        21
    xderam  
       Oct 9, 2018
    http code 状态码确实不多 能用得上就用,用不上别强求就 ok 了。 当年设计 http code 的时候或许没考虑到也考虑不到那么多五花八门的业务逻辑。所以不要硬上~
    dongcclk
        22
    dongcclk  
       Oct 9, 2018 via iPhone
    现在在用 RESTful 风格。
    但是下次设计时不会再用了,会统一用 200 状态加错误码。错误码根据业务逻辑设计。
    stormslowly
        23
    stormslowly  
       Oct 9, 2018
    那 graphql 怎么办?
    yhxx
        24
    yhxx  
       Oct 9, 2018
    这样写很合理啊
    godruoyi
        25
    godruoyi  
    OP
       Oct 9, 2018
    young6
        26
    young6  
       Oct 9, 2018
    RESTful 确实有点毛病,详见下文
    https://mmikowski.github.io/the_lie/
    hlwjia
        27
    hlwjia  
    PRO
       Oct 9, 2018   ❤️ 1
    规矩都是人定的,规矩是死的,人是活的。
    scnace
        28
    scnace  
       Oct 10, 2018 via Android
    这种情况我会用 403 一般的 webapi 请求错误我会用 400 这样能很好地 区分到底是哪里出现了问题 (也方便甩锅) 当然 rpc 就另说了(
    yanaraika
        29
    yanaraika  
       Oct 10, 2018
    结果某一天你的服务全挂了,中间件因为根据状态码监控认为一切正常就没报警,第二天起来损失了一个亿
    FanError
        30
    FanError  
       Oct 10, 2018 via iPhone
    @yanaraika 中间件不能根据内容中的 code 监控吗?
    yhxx
        31
    yhxx  
       Oct 10, 2018
    @godruoyi 阮老师说的“最佳实践”未必就是最佳实践
    hcymk2
        32
    hcymk2  
       Oct 10, 2018
    @FanError
    一个服务无所谓。关键是要有统一的规范。要不你得让运维开发一套适配各种情况的监控插件。
    bk201
        33
    bk201  
       Oct 10, 2018
    @FanError 那监控代码就复杂了,既要监控狀態码,又要监控自定义 code,一旦非标准自定义的 code 有修改,又要跟着改动.
    其实自定义 code 最大的问题在于维护,而标准不需要维护,因为这就是标准,一看就知道哪里出了问题.
    pkoukk
        34
    pkoukk  
       Oct 10, 2018   ❤️ 1
    业务上的错误消息远远比 http 状态码多多了,不够用啊
    dallaslu
        35
    dallaslu  
       Oct 10, 2018
    如果你说你是 RESTful,最好还是严格遵循范式;如果你不遵循,那请说你是类 RESTful 并列出设计不同之处。这样既满足业务,又不会有歧义。
    yanaraika
        36
    yanaraika  
       Oct 10, 2018
    @FanError 公司会有 N 种业务,每种用不同的方式来汇报错误码,infra team 表示想自杀
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2326 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 155ms · UTC 05:16 · PVG 13:16 · LAX 22:16 · JFK 01:16
    ♥ Do have faith in what you're doing.