后端传过来的某些属性不固定,有时候有,有时候没有,这样合理吗?

2021-01-26 14:49:31 +08:00
 darknoll

比如和后端商定好了,返回的接口格式是: { "A": "", "B": [{}, {}] } 这时候后端说了,B 的数据有时候没有,如果没有的话就直接返回{A:""} 我让他返回{"A":"***", "B":[]}

哪种方案好?

16122 次点击
所在节点    程序员
187 条回复
caiqichang
2021-01-26 16:09:26 +08:00
@dengjscn 所以说返回 null 前端取 B.C 不用再先判断 B 是否为 undefined,方便前端
iugo
2021-01-26 16:10:28 +08:00
根据具体业务分析, 前端可能需要额外操作, 比如 `if (res.B.length === 0) {}`.

但如果是 B 算主业务, 则无论如何都传. 但上文的 B 应该不是主业务.
iugo
2021-01-26 16:12:40 +08:00
其实前端 `res.B ?? []` 直接解决问题. 兼容后端目前的两种可能.
ElmerZhang
2021-01-26 16:16:53 +08:00
两种方式都可以,看哪种语义上更合理一些,因为不返回 B 和返回 B:[] 是不一样的意思,不返回 B 相当于 B:null,null 值和空值的含义是不一样的。
trlove
2021-01-26 16:18:32 +08:00
个人觉得没有就直接字段都不返回。理由是:首先没有也返回,前端返回大量字段为 null 或者为空字符,不觉得难看吗 其次有些人可能有某些字段 有些人没有某些字段 但因为是一张表 全字段返回,就容易让人猜到一些关键信息字段。最后就是 难道前端展示信息的时候 对于不是必然有的字段 进行展示的时候 都不 if 一下吗 就直接用?不管数据介凡辉结构啥样,我觉得对参数要判断下是基本操作吧,万一碰上个辣鸡后端骚操作,你不判断数据直接展示,哪天突然来个字段没了啥的,然后页面报错或者啥的,直接影响用户,严重的到时候背锅的可是自己。 所以我是认为没必要返回,前端对于不是必然出现的字段进行判断,保命要紧,不能把命运交在别人手上
killergun
2021-01-26 16:22:54 +08:00
前后端可以约定好,怎么返回。
darknoll
2021-01-26 16:23:12 +08:00
@trlove if 还是会 if 的,只是讨论接口设计
trlove
2021-01-26 16:29:40 +08:00
@darknoll 嗯嗯 我是认为没有就不返回。返回的太全,容易被人猜到核心设计。很多产品能够存活就是设计的好。全字段返回,基本一个表的字段差不多都被猜个七七八八了,有了表结构和流程原样复制产品就太简单了。再一个就是你是没碰到那种上百字段的,如果没有信息的也展示,真的吧后端搞死……还存在嵌套的问题。而前端只需要一个 if 就可解决所有字段不存在的问题……而且本身前端也得校验数据,所以相比之下我觉得不返回字段更好
nigelvon
2021-01-26 16:33:14 +08:00
一般来说空数组和 null 并不相等,不建议强行转换。
jiangshanmeta
2021-01-26 16:33:22 +08:00
b 是数组 则后端应该返回空数组 b 是对象 则应返回 null 没有和 null 是两个语义
dengjscn
2021-01-26 16:40:55 +08:00
@caiqichang 要不你控制台试试?
darknoll
2021-01-26 16:43:01 +08:00
@trlove 你说的也有道理,但是这样接口文档就要写仔细了,要不然原来做的人离职了,后面接手的就懵了
Rhonin
2021-01-26 16:48:55 +08:00
看来这个站还是后端多啊,这么奇葩的数据格式都在说合理?你们公司没有接口测试的吗?
YouLMAO
2021-01-26 16:59:22 +08:00
vue 的话一般使用 protobuf, 你的 json sjb 问题不存在
h82258652
2021-01-26 17:06:34 +08:00
要不就{"A":""},要不就{"A":"","B":null}
反正不可能是{"A":"","B":[]}
null 和空数组本质上就是两个不同的东西,就像空字符串和 null,存数据库表现出来的就是不一样的
SkyLine7
2021-01-26 17:07:14 +08:00
第二种吧
jzmws
2021-01-26 17:08:35 +08:00
典型的 map
rabbbit
2021-01-26 17:09:26 +08:00
无所谓, 反正现在可以这么写
```
const a = {}
console.log(a?.b?.c?.d || []) // []
```
maemual
2021-01-26 17:10:57 +08:00
支持第一种。
不返回,或者返回 null,和返回空列表 /空字符串,语义上是不一样的。
maemual
2021-01-26 17:13:07 +08:00
@maemual #39 还有一种情况,比如产品要求上线一个功能,最后实现这个功能的数据就是 B 。如果前端、客户端一开始就支持不返回 B 就不展示这个功能的逻辑的话,未来哪一天,这个产品功能下线了,那么后端直接把字段一删,就再也不用管了。如果要求必须返回一个空列表或者空字符串,那么后端接口返回值里,始终得维护一个恶心的没用的字段。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/748527

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX