› httpbin - 协议调试工具
› httpstatuses - 协议状态码查询
› httpie - cURL-like tool for humans
Fiddler
godruoyi
V2EX  ›  HTTP

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

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