zoukankan      html  css  js  c++  java
  • 接口数据总是返回 null 如何回馈和处理

    先说结果, 请避免返回 null.

    null 是如何产生的

    根据 为何后端经常会将一个空数组返回为 null ? 帖子里描述的示例:

    这个应该是后端代码不够严谨吧。比如后端可以加一个判断,如果 applies 是一个array,但是没有值,也需要用array,不能使用NULL 等。

    测试代码:

    $c;
    
    $arr = array(
        'status' => 1, 
        'data' => array(
            'a' => 111,
            'b' => array(),
            'c' => $c,
            'd' => (empty($c) ? array() : $c)
        )
    );
    
    echo json_encode($arr);
    

    输出

    {
      "status": 1,
      "data": {
        "a": 111,
        "b": [],
        "c": null,
        "d": []
      }
    }
    

    关于返回 null 的相关讨论

    为什么不要返回 null

    文章 不要再返回Null了 详细描述了原因. 认为:

    Null值不应该由程序员在方法中返回,因为这样做,一是违背了方法名的语意。二是由于我们返回null值,更加增加了系统的不稳定性;因为在调用者忘记做null检查时,就一定会因为我们的方法出错。最后,null值所充斥的系统模型违反了OOP原则。

    阿里巴巴 《Java开发手册》第十章《前后端规约》(第28页)明确规定:

    【强制】前后端数据列表相关的接口返回,如果为空,则返回空数组[]或空集合{}。 说明:此条约定有利于数据层面上的协作更加高效,减少前端很多琐碎的 null 判断。

    对于便于前后端协作开发, 我们有了接口文档来规定数据的类型. 前端按规定的类型来操作数据, 例如 array 类型会进行递归遍历操作. 但不知道何时何地会或不会突然变成 null, 那这时候 null 的类型是 array 类型吗?

    抛开 null 会造成语义和类型混乱这些问题, 在前端出会造成数据错误, 例如:

    /**
     * 获取数组的长度
     * @param {array} arr 数组
     * @returns {number}
     */
     function getLength(arr = []) { // 前端已经做了默认值处理
      return arr.length
    }
    getLength([1,2,3]) // 3
    getLength(null) // 但还是导致程序崩溃 Uncaught TypeError: Cannot read property 'length' of null
    
    
    /**
     * 获取数据中两个整数的和
     * @param {object} param0 {data: {a, b}}
     * @param {number} param0.data.a 整数a
     * @param {number} param0.data.b 整数b
     * @returns {number}
     */
    function add({data: {a = 0, b = 0}} = {}) { //
      return parseInt(a) + parseInt(b)
    }
    add({data: {a: 1, b: 2}}) // 3
    add({data: {a: null, b: 2}}) // NaN 不符合预取的 0+2
    
    
    /**
     * 获取两个对象的 key
     * @param {*} param0 {obj1, obj2}
     * @returns {array}
     */
    function getKeys({obj1 = {}, obj2 = {}}) {
      return Object.keys(obj1).concat(Object.keys(obj2))
    }
    getKeys({obj1: {a: 1}, obj2: {b: 2}}) // ["a", "b"]
    getKeys({obj1: {}, obj2: {b: 2}})  // ["b"]
    getKeys({obj1: undefined, obj2: {b: 2}})  // ["b"]
    getKeys({obj1: undefined, obj2: {b: 2}})  // ["b"]
    getKeys({obj2: {b: 2}})  // ["b"]
    getKeys({obj1: null, obj2: {b: 2}})  // Uncaught TypeError: Cannot convert undefined or null to object
    
    
    function getStr(str = ``) {
      return str + `你好`
    }
    getStr(null) // "null你好"
    
    

    参考:

    前端从 json 中过滤掉 null

    JSON.parse(JSON.stringify({
      a: 1,
      b: undefined,
      c: {
        a: null,
        b: [null],
        c: {
          a: null,
          b: 134,
        }
      },
    }), (key, value) => {
      return value === null ? undefined : value
    }
    )
    
  • 相关阅读:
    1-素材库同步:将素材组的素材同步到oss
    MongoDB_2:mongodb高级聚合查询
    关于python:如果键存在,则删除字典项
    Kafka学习-分布式日志系统 / 消息队列
    摘要算法—md5简介
    mac使用pyenv安装和管理多个python版本
    如何mac电脑上查看安装了几个python?
    mac os-Homebrew的安装及使用
    第一次博客
    个人介绍
  • 原文地址:https://www.cnblogs.com/daysme/p/14656888.html
Copyright © 2011-2022 走看看