V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Pursue9
V2EX  ›  程序员

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

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

    假设数据库有一个字段是 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 语言处理
    oneisall8955
        8
    oneisall8955  
       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  
       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 好歹能表示这是一个业务中不存在的数据
    DOLLOR
        24
    DOLLOR  
       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   ·   实用小工具   ·   3412 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 00:52 · PVG 08:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.