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

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

  •  
  •   Pursue9 · Mar 13, 2020 · 7095 views
    This topic created in 2427 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
    hstdt
    Mar 13, 2020 via iPhone
    1
    具体情况具体分析呗,json 的话传 0 或者这个字段不传也可以吧,别来个字符串捣乱就行
    Pursue9
    Pursue9
    OP
    Mar 13, 2020
    2
    @hstdt 假设 0 已经被定义了,0 和 null 意义不同;该字段不可不传
    imherer
    imherer
    Mar 13, 2020
    3
    null 或""都可以呗,协商好就行了

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

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

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

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

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

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

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

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

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

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