接口返回错误码和 msg 的优劣势? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gzk329
V2EX    Java

接口返回错误码和 msg 的优劣势?

  •  
  •   gzk329 2023-09-05 15:34:41 +08:00 3461 次点击
    这是一个创建于 766 天前的主题,其中的信息可能已经有所发展或是发生改变。

    code: 定义错误码
    msg:“xxx error”

    code: 5000
    msg:"xxx 错误,请检查 xxx"

    除了 msg 内少写一些内容,还有别的优劣吗?

    opengps
        1
    opengps  
       2023-09-05 15:41:02 +08:00
    code 是给程序用的,可以自己扩展写分支处理逻辑
    msg 是给人看的,可以友好提示文本(这里不得不吐槽,很多程序没处理到友好的程度)
    mdn
        2
    mdn  
       2023-09-05 16:01:38 +08:00
    code 是给前端看的
    msg 是给用户看的
    k9982874
        3
    k9982874  
       2023-09-05 16:05:59 +08:00
    你只给个 msg 让前端做根据错误跳转页面,你看前端喷 不喷你
    fimd
        4
    fimd  
       2023-09-05 16:30:40 +08:00
    我这么多年来,接口一直来都是按这格式返回:
    code: Success/Error/Empty
    msg: 这是具体的文字提示
    item: 这是业务信息内容
    -----------------
    大家提意见吧,欢迎拍砖
    IvanLi127
        5
    IvanLi127  
       2023-09-05 16:44:44 +08:00   1
    我觉得

    code 是给程序看的
    msg 是给开发看的,要言简意赅
    用户看的错误信息是前端自己结合 code 以及额外的错误信息给的友好提示
    kaedeair
        6
    kaedeair  
       2023-09-05 16:53:43 +08:00
    code 处理逻辑,msg 弹窗告诉用户,有 msg 定位错误快一些
    oppoic
        7
    oppoic  
       2023-09-05 18:01:00 +08:00
    {"code":200,"msg":"操作成功"}
    绿框提示 “操作成功”,并进行下一步(比如刷新页面)

    {"code":403,"msg":"请先勾选再提交"}
    红框提示 “请先勾选再提交”,页面保持不动

    {"code":500,"msg":"未将对象引用到实例"}
    红框提示 “网络异常,请稍后再试”,页面保持不动

    403 和 500 的区别是:403 是逻辑错误,500 是后端抛错了,程序抛错信息不给用户看,让用户看友好提示,程序员按 12 可以看到,也可以去库里查更详细的抛错日志
    mdn
        8
    mdn  
       2023-09-05 18:12:06 +08:00
    @IvanLi127
    1. 服务器内部错误,不应该暴露,应该从日志中查看
    2. 表单中有太多错误提示,无法灵活处理,需要定义很多 code, message
    chendy
        9
    chendy  
       2023-09-05 18:24:54 +08:00
    有编码规则的字符串错误码,比如 模块_功能_编号 这样
    纯数字的存起来能省点空间,但是实在算不上友好
    cnoder
        10
    cnoder  
       2023-09-05 18:36:25 +08:00
    不能都返回吗
    index90
        11
    index90  
       2023-09-05 18:40:29 +08:00
    liuliuliuliu
        12
    liuliuliuliu  
    PRO
       2023-09-05 18:44:01 +08:00
    日经话题了
    个人推荐就是使用 http status code ,然后如果更详细的错误,也有 rfc 的规范可以标准化
    https://www.baeldung.com/rest-api-error-handling-best-practices
    https://blog.axway.com/learning-center/apis/api-design/introduction-to-rfc-7807
    NoKey
        13
    NoKey  
       2023-09-05 18:47:05 +08:00
    有个争议,到底用 http 的 code 还是自己的 code ,这个目前还未分出胜负
    如果使用自己的 code ,那么 code ,msg ,data (实际数据体),这 3 个参数一般都是同时出现,到底给谁的不在意,前端可以根据 code 来快速判定执行是否成功,如果执行失败,那么 msg 就是提示了,很多提示前端不不好去匹配的,后端直接给了就行
    flyqie
        14
    flyqie  
       2023-09-05 18:48:17 +08:00 via Android
    {"code":1,"msg":"未知错误","data":{...业务数据}}
    IvanLi127
        15
    IvanLi127  
       2023-09-05 19:41:21 +08:00 via Android
    @mdn

    生产环境和 msg 大概就是一个 code 对应一两种 msg 文本,不想暴露的内容可以在程序里判断环境去输出,比如我负责的项目的登录结果,开发环境是具体说因为什么原因导致哪个环节登录出错,但是生产环境就的 msg 就只说“账号密码不匹配”和“账户锁定”。

    表单的错误信息,比如 xx 字段不满足 xx 条件,这个信息是扩展的错误信息,扩展的错误信息可以是对象,能结构化地读取具体错误出来。msg 只是一个字符串,除非前端嗝屁了,不然这个信息不应该直接透传到 ui 上。
    Nazz
        16
    Nazz  
       2023-09-05 19:45:24 +08:00 via Android
    我全都要
    lanweizhujiao
        17
    lanweizhujiao  
       2023-09-05 19:49:39 +08:00
    接口返回错误码和消息(通常是一个简短的文本描述)是常见的做法,用于传达接口操作的结果和可能的错误信息。它们各自有一些优劣势,下面是它们的主要优点和缺点:

    错误码( Error Code )的优势:

    标准化和规范性: 错误码是一种标准化的方式来表示不同类型的错误。每个错误都有一个唯一的错误码,这有助于在不同的应用程序和系统之间实现一致性。

    机器可读性: 错误码通常是数字或字符串,易于在程序中进行比较和处理。这使得自动化处理错误变得更容易,例如,根据错误码采取特定的恢复措施。

    多语言支持: 错误码不依赖于语言,因此可以轻松地实现多语言支持,只需根据错误码查找相应的错误消息翻译。

    性能: 错误码通常比文本消息更轻量,所以在网络传输和存储方面具有一定的性能优势。

    错误码的劣势:

    不直观: 错误码通常不直观,不容易理解。开发者可能需要查阅文档来了解每个错误码的含义,这可能会增加开发和调试的复杂性。

    用户不友好: 对于最终用户来说,错误码通常不是一个友好的方式来了解问题,因为它们缺乏描述性的信息。
    lanweizhujiao
        18
    lanweizhujiao  
       2023-09-05 19:50:28 +08:00
    6666666666
    MFWT
        19
    MFWT  
       2023-09-05 19:54:42 +08:00
    个人写的很简单的小项目,最后采取的是 code+msg

    code 为 1 就成功,0 就失败
    具体发生什么事了,写在 msg 显示出来里让用户处理,比如『用户名密码错误』,『请输入有效金额( 0-200 )』

    不知道有没有什么坏处?
    scegg
        20
    scegg  
       2023-09-05 19:57:07 +08:00
    code 比较好实现国际化。
    不然要在后端提供本地化语言描述,导致两端都要处理语言。
    lanweizhujiao
        21
    lanweizhujiao  
       2023-09-05 19:59:25 +08:00
    @mdn 文档
    xuanbg
        22
    xuanbg  
       2023-09-05 22:26:37 +08:00
    code 是用来处理不同分支逻辑用的,message 是抛出来给人看的。所以 code 定义有限的几个就行,message 要在抛出异常的地方定义。
    Orlion
        23
    Orlion  
       2023-09-06 09:15:12 +08:00
    code: 方便排查问题,根据用户返回的 code 找到问题发生地
    msg: 出现了问题,告知用户发生了什么以及如何解决
    liuidetmks
        24
    liuidetmks  
       2023-09-06 11:05:30 +08:00   1
    @MFWT 一般 0 是成功,非 0 是失败
    mark2025
        25
    mark2025  
       2023-09-06 11:47:13 +08:00   1
    @MFWT linux 下面习惯是 0: 成功, 非 0:失败。
    这种方式,成功就一种,而失败就可以多种了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3010 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 12:05 PVG 20:05 LAX 05:05 JFK 08:05
    Do have faith in what you're doing.
    ubao 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