关于接口传 null 的问题,你们是怎么解决的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Pursue9
V2EX    程序员

关于接口传 null 的问题,你们是怎么解决的?

  •  
  •   Pursue9 2020-03-13 19:22:42 +08:00 6228 次点击
    这是一个创建于 2055 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设数据库有一个字段是 int 型可空,接口返回参数时该字段数据可能是 1,2,3,也有可能是 null。 这时候你们是返回 null 还是 ""

    36 条回复    2020-03-14 13:11:30 +08:00
    hstdt
        1
    hstdt  
       2020-03-13 19:25:42 +08:00 via iPhone
    具体情况具体分析呗,json 的话传 0 或者这个字段不传也可以吧,别来个字符串捣乱就行
    Pursue9
        2
    Pursue9  
    OP
       2020-03-13 19:27:24 +08:00
    @hstdt 假设 0 已经被定义了,0 和 null 意义不同;该字段不可不传
    imherer
        3
    imherer  
       2020-03-13 19:33:09 +08:00
    null 或""都可以呗,协商好就行了

    不过我更倾向于 null
    lscho
        4
    lscho  
       2020-03-13 19:46:21 +08:00 via iPhone
    可空肯定要传 null 啊。。。int 型不要给空字符串
    rosu
        5
    rosu  
       2020-03-13 19:54:48 +08:00 via iPhone
    1 楼和 3、4 产生了截然相反的回答。

    首先一定要协商好,形成规范。另一个如果前段是 web,可能 null、“” 或 不传问题都不大。因为 js 是弱类型。

    如果前段是 App,尽量就不要类型混用了。接口是 int 就不要返回字符串。因为你说了 0 和 null 意义不同,那假设这个接口开发之初就有此业务需求,意味着 App 只能用 String 或 object 来接了。

    但是如果是接口后期升级,那还是协商前端升级版本做变更。
    rosu
        6
    rosu  
       2020-03-13 19:55:30 +08:00 via iPhone
    @rosu “前段”更正:前端
    janxin
        7
    janxin  
       2020-03-13 20:02:20 +08:00
    传 null,方便非 JS 语言处理
    itechify
        8
    itechify  
    PRO
       2020-03-13 20:03:51 +08:00 via Android
    JAVA 来说,肯定 Null,不然反序列化属性类型对不上
    zhuisui
        9
    zhuisui  
       2020-03-13 20:12:16 +08:00
    首先该字段类型为 int,就肯定不能传 ''
    然后如果要表示为空值,那肯定是 null。由于 0 已经被占用了,说明它的意义不是空。
    如果不传<=>undefined,在序列化的时候(如 json 或 protobuf )这个键就会被去掉,也就不能看出是空的含义。

    双方约定更应该靠向遵守一般程序接口设计规范,而不是私下约定。
    optional
        10
    optional  
       2020-03-13 20:14:56 +08:00
    传 null, 加上 json-schema 校验, 通不过就说明后端偷偷改了 api,线上 bug 就背锅。
    celeron533
        11
    celeron533  
       2020-03-13 20:25:44 +08:00
    医学影像 DICOM 是这么做的:
    数据 null:返回空数组
    数据有值:返回只有一个值的数组,且 int[0]=value
    hantsy
        12
    hantsy  
       2020-03-13 20:26:44 +08:00
    直接去掉,省数据流量
    noobma
        13
    noobma  
       2020-03-13 20:54:26 +08:00
    菜鸡前端表示,还是 null 好,比如 ts 里面定义 null | number 和 string | number,那肯定是 null | number 一眼就能看得出是啥意思
    xiaoming1992
        14
    xiaoming1992  
       2020-03-13 20:59:31 +08:00 via Android
    或者-1 也行啊
    des
        15
    des  
       2020-03-13 21:09:43 +08:00
    我们用-9999
    blessyou
        16
    blessyou  
       2020-03-13 21:17:13 +08:00 via Android
    空值字段都不给
    luopengfei14
        17
    luopengfei14  
       2020-03-13 21:41:22 +08:00 via iPhone
    连 null 也不传,省流量,装逼中( ̄~ ̄;)
    hstdt
        18
    hstdt  
       2020-03-13 22:36:14 +08:00 via iPhone
    @Pursue9 限制这么多,那就还是传 null 吧。我是被人用"null"坑过几次的,所以一般不想这么推荐,但是这个确实是标准答案
    Pursue9
        19
    Pursue9  
    OP
       2020-03-13 22:43:09 +08:00
    @hstdt ios 那边说接收 null 会变成 "<null>" ,不知道他们怎么解决的

    @des
    @xiaoming1992 负值也有缺点,枚举是可为负数的,
    Pursue9
        20
    Pursue9  
    OP
       2020-03-13 22:45:37 +08:00
    我们这边全转字符串了, 返回
    ```json
    {"status1":"-1","status2":"1","status3":"0","status4":""}
    ```
    用起来就非常奇怪
    Mohanson
        21
    Mohanson  
       2020-03-13 22:54:17 +08:00 via Android
    标准答案是用零值代替空值。Null 的发明者,图灵奖获得者在 2009 年公开承认它是一个百万美元的错误。

    "Null reference, the billion dollar mistakes"
    iamwho
        22
    iamwho   div class="badges">   2020-03-13 23:02:28 +08:00
    @Mohanson #21

    剩下的九亿九千九百万给我吧。(doge
    night98
        23
    night98  
       2020-03-13 23:19:17 +08:00
    @Mohanson #21 那还不如用-1 呢,-1 好歹能表示这是一个业务中不存在的数据
    AV1
        24
    AV1  
       2020-03-13 23:23:38 +08:00
    传 null 吧,至少这个值不用额外做约定,就知道它是一个无效的值。
    noreplay
        25
    noreplay  
       2020-03-13 23:34:27 +08:00
    @iamwho 你要为剩下的那么多埋单啊(逃
    xiaoming1992
        26
    xiaoming1992  
       2020-03-14 00:13:41 +08:00 via Android
    @Pursue9 业务上做好条件判断就行了
    baobao1270
        27
    baobao1270  
       2020-03-14 00:14:47 +08:00 via Android
    如果返回"1,2,3" 传""
    如果返回[1, 2, 3] 传[]
    如果是可能返回 1,可能返回 2,可能返回 3…… 传 null
    kidtest
        28
    kidtest  
       2020-03-14 00:20:20 +08:00
    我宁愿传-1,代表不合法的值
    strongcoder
        29
    strongcoder  
       2020-03-14 00:26:26 +08:00
    传啥都行 APP 解析做好了所有不信任后端的行为
    xuanbg
        30
    xuanbg  
       2020-03-14 07:44:32 +08:00
    对于值来说,是什么就传什么,转换来转换去的,万一没转换对或者转换后产生歧义就不好了。前端凭啥就不用判空,脸大吗?

    另外,对于数组来说,没有数据不应该是 null,应该是一个空数组。
    pomelotea2009
        31
    pomelotea2009  
       2020-03-14 09:52:32 +08:00 via Android
    null
    IvanLi127
        32
    IvanLi127  
       2020-03-14 10:12:27 +08:00 via Android
    正常情况下用 null,这个没什么好纠结的,感觉没必要约定一个特殊值,null 一般情况下就能满足。
    littlefatpaper
        33
    littlefatpaper  
       2020-03-14 11:42:17 +08:00
    赞同 5 楼,分情况,业务主要设计 Web 端,传 null 没问题,
    但是如果有移动端的,最好不要用 null,我 iOS 的同事好像和我说过他们处理 null 值会有问题,具体记不清了,好像要改构造报文的方法才能传 null,安卓的同事也说传 null 不规范。

    我们还是看业务场景来的,主要是沟通好规范,并且还要考虑到后面一些可能会涉及到的场景,例如有些业务如果是传温度数值的,默认传 0,-1 之类的肯定不行,传-9999 (一个不可能出现的值)或者 null 沟通好规范就行了
    littlewing
        34
    littlewing  
       2020-03-14 12:34:21 +08:00 via iPhone
    数据库不允许存 NULL
    Freeego
        35
    Freeego  
       2020-03-14 13:11:16 +08:00
    数据库非空有默认值就传默认值 l,数据库可空就传 null,到底非不非空要看这个字段是干嘛的。
    wangyzj
        36
    wangyzj  
       2020-03-14 13:11:30 +08:00
    给一个默认值啊
    0,-1
    传空可以
    传 null 不是不行,但是得特殊处理而且很不舒服
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     951 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:59 PVG 05:59 LAX 14:59 JFK 17:59
    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