• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Pursue9
V2EX  ›  程序员

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

  •  
  •   Pursue9 · Mar 13, 2020 · 6634 views
    This topic created in 2281 days ago, the information mentioned may be changed or developed.

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

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

    不过我更倾向于 null
    lscho
        4
    lscho  
       Mar 13, 2020 via iPhone
    可空肯定要传 null 啊。。。int 型不要给空字符串
    rosu
        5
    rosu  
       Mar 13, 2020 via iPhone
    1 楼和 3、4 产生了截然相反的回答😹。

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

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

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

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

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

    "Null reference, the billion dollar mistakes"
    iamwho
        22
    iamwho  
       Mar 13, 2020
    @Mohanson #21

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

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

    我们还是看业务场景来的,主要是沟通好规范,并且还要考虑到后面一些可能会涉及到的场景,例如有些业务如果是传温度数值的,默认传 0,-1 之类的肯定不行,传-9999 (一个不可能出现的值)或者 null 沟通好规范就行了
    littlewing
        34
    littlewing  
       Mar 14, 2020 via iPhone
    数据库不允许存 NULL
    Freeego
        35
    Freeego  
       Mar 14, 2020
    数据库非空有默认值就传默认值 l,数据库可空就传 null,到底非不非空要看这个字段是干嘛的。
    wangyzj
        36
    wangyzj  
       Mar 14, 2020
    给一个默认值啊
    0,-1
    传空可以
    传 null 不是不行,但是得特殊处理而且很不舒服
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1003 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 22:21 · PVG 06:21 · LAX 15:21 · JFK 18:21
    ♥ Do have faith in what you're doing.