V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wanganjun
V2EX  ›  程序员

服务器的 json api 的 response 一定要有 code, msg, data 这些字段吗

  •  
  •   wanganjun · 2016-11-18 11:08:23 +08:00 · 10043 次点击
    这是一个创建于 2933 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了"还能不能好好的写 API 了"( https://www.v2ex.com/t/321243) 这个帖子, 准备所有接口都按状态码 200 和 { code: Number, msg: String, data: Object } 这样的结构返回, 但是假如只返回一个有意义的字段的话(比如只是返回一个 id ), 感觉没必要用 data 字段套一层, 如果 code 是 0, msg 字段也可以不要了.

    我看微信公众号开发文档里面, code, msg, data 这些字段都是有的, 就算不返回任何有意义的信息, 这三个字段都有.

    有没有人可以说说这么做的优劣?
    13 条回复    2020-05-04 18:26:54 +08:00
    Totato5749
        1
    Totato5749  
       2016-11-18 11:16:01 +08:00
    后端是 java 写的话,序列化一个 bean 对象一般就不去修剪了吧 我猜是这样的
    justfindu
        2
    justfindu  
       2016-11-18 11:18:09 +08:00
    那其他人用你接口时候还得注意, 这个接口有没有 msg 有没有 data , 你自己写的时候还要区分 data 要不要 msg 要不要?
    不嫌麻烦?
    beneo
        3
    beneo  
       2016-11-18 11:22:30 +08:00
    简单来说, http response code 不能完全的满足业务需求,也就是业务上的 error code 不能完全的映射到 http response code 上面,所以索性,全部返回 200 ,靠里面的 error code 来区分
    Jakesoft
        4
    Jakesoft  
       2016-11-18 11:45:32 +08:00
    我是有的,{"code":0,"status":1,"data":[{object},{object},{object}],"message":"ok"},

    或者 {"code":2333,"status":0,"data":[],"message":"fail"},

    这样统一设计挺好的,可以通用,

    并且 status 不使用字符串,比如"success"/"fail",也不使用 boolean ,
    SoloCompany
        5
    SoloCompany  
       2016-11-18 12:07:54 +08:00
    10+年前定的协议
    {“ code ”:” 233 ”,” var ”:{…}}
    到现在都没有改过
    为了适应业务的复杂性, code 是 string 类型而不是 int

    当然 10+年前的 json 还没这么流行,所以其实是
    <object><string name=“ code ”>233</string><object name=“ var ”>...</object></object>
    wesley
        6
    wesley  
       2016-11-18 13:00:41 +08:00
    底层错误用 http status code , 比如验证失败, Token 过期,没有权限等

    业务部分用业务系统自己定义的 code ,此时 http status 为 200
    garrydzeng
        7
    garrydzeng  
       2016-11-18 13:27:40 +08:00
    如果是使用 HTTP 协议,这样做没有任何优势。
    mornlight
        8
    mornlight  
       2016-11-18 13:59:15 +08:00
    这么几个字节节省了没有啥意义,统一更重要
    icris
        9
    icris  
       2016-11-18 14:47:23 +08:00
    省掉一个空的 msg 字段对 java 这样的强类型语言没有影响,大部分反序列化工具都能正确赋上默认值(手动取值本来就要处理异常),但 js 会从 null 变成 undefined , python ( json.loads())会有一个 KeyError
    hekunhotmail
        10
    hekunhotmail  
       2016-11-18 15:49:36 +08:00
    这种接口返回统一很重要
    MajorAdam
        11
    MajorAdam  
       2016-11-19 10:45:16 +08:00 via Android
    统一很重要!
    Miy4mori
        12
    Miy4mori  
       2016-11-19 23:29:53 +08:00 via Android
    你是没用 java 之类的对接过各种反人类系统吧,娘的每个接口一套结构,还得专门写个 bean 反序列化话,最坑的是无法直接获得业务状态,还得先反序列化成 map ,看有没有 error ,没有的话再用 bean 反序列化,一不小心就反序列化异常,简直想骂人………
    godsoul
        13
    godsoul  
       2020-05-04 18:26:54 +08:00
    我同事也觉得完全没必要有 data,最主要是大厂 google 支付宝 微信 华为 等等接口,字段都是直接和 code msg 平级的,并不固定报在 data 里面
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 16:41 · PVG 00:41 · LAX 08:41 · JFK 11:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.