关于今天给前端返回数据的结构的争论

5 天前
 imba97

今天发生一个离谱的问题

我是个前端开发,有一个列表接口,本来有数据,后面突然列表没了,前端逻辑没动过

我看了看接口,发现接口正常,里面列表数据都在,在控制台打印数据也都正常

最后打印列表字段 rows 发现是 undefined,这才发现列表数据的 key 变成了 data

争论开始了

后端反馈是有两种数据结构,一种是有分页一种是无分页

有分页的接口返回 rows,无分页的接口返回 data

后面甚至提出前端在响应拦截器判断一下,有 rows 的话拿 rows,没有的话拿 data

我觉得很离谱,在我的认知中,我认为后端返回的数据要保持一致性

类似这样

interface ResponseData {
    code: number
    data: Array | Object // 这里就大概表示一下可以是列表数组可以是对象
    total?: number // 需要的话返回
    message: string
}

争论半天后端大概意思是:“一般都是这样的,分页和其他查询结果有差异”、“没有必要改 不然看不出来 分页和部分也的区别了”、“你现在没数据了你能第一时间知道是接口改成不分页的了”、“这个框架都几十年了一直都是这样” ...

最后虽然也改成统一的了

但我我对这套说辞是:???

想请教一下大家,你们对接的数据结构也是不统一的吗?哪种方式更好呢?

4891 次点击
所在节点    程序员
101 条回复
imba97
4 天前
@JayLin5 确实,最后只能还是叼过
imba97
4 天前
@november 没有,后端发现改错了,我感觉失误改错了不是什么很大的问题,我是更在意这个返回结构一致性的问题
imba97
4 天前
@jianghu52 好嘞,感谢 👍
imba97
4 天前
@cuberlzy 那倒也是,但至少我还是想,不管在哪我自己的开发体验都要尽量高一点的
jiangzm
4 天前
分页和列表肯定都要存在不能为了结构相同而直接简单粗暴统一返回结构。要统一的时候不同数据分页接口的结构和不同数据列表接口的结构。

如果后端是不小心改了原接口的返回结构, 那 100%是后端的锅,哪怕原来的接口不合理是代码逻辑很糟糕也不能随便改。

如果是新接口前端通用请求预期的结构和后端返回的不一致, 那属于前期沟通和前端自测有问题。

另外不建议把分页和列表结构放到一个类型定义中,定义 PageData 和 ListData 即可, 通用接口请求方法根据入参(有无分页参数)很容易区别响应类型。
ooo4
4 天前
以前我也觉得后端返回的数据结构应该保持一致,直到后面被安排到其他项目组,里面的后端都是公司呆了 10 多年那种,接口写的十分的丑陋,什么拼音啊,额外字段用什么 xxx1 ,xxxx2 ,xxxx3 前端根本用不上,虽然代码很恶心,但管他的,说不定明年你就跑路了
demonzoo
4 天前
@imba97 好像是不小心改错了之类的,所以没通知前端,这个倒是可以理解
==============
听起来似乎完全没有自动化测试的样子,这种真的无语
wangtian2020
4 天前
关于页面需不需要分页这个问题我已经找到真理了,就是统一只提供一个分页接口。想要不分页? pageSize:9999 了解一下,一个接口按你需要随你掉
对接后端接口最怕的就是对象结构会变的,这是对后端最基本的要求,接口对象的结构不能变,而且要统一。别信他瞎几把扯,设计混乱的接口能不能用,能用也能跑,代码和人有一个能跑就行,代码可以是屎山不是我接手就没意见。
不,我也是有意见的,我这个人就是见不得设计的屎的接口。
直接怼后端,别惯着这种菜逼
imba97
4 天前
@ooo4 是个兼职,时间上来说公司这边年底贼忙,已经提了要跑路了
imba97
4 天前
@demonzoo 看起来是没有的,虽然前端也没有
fenglangjuxu
4 天前
盲猜后端用的是 ruoyi
nanpu
4 天前
ruoyi 分页和不分页返回结构是不一样的,后端改错了
Yanlongli
3 天前
不管是统一还是不统一其实都无所谓,但是前提要提前沟通,不能直接就换了不通知。
今天还是 rows ,第二天变成了 data ,第三天变成了 list ,第四天换成 records ,第五天换成 elements, [🐶]
BG7ZAG
3 天前
如果是 app 端强类型语言的话,这种动态相应类型直接爆炸
mark2025
3 天前
@wangtian2020 统一用分页的类型,不分页就当是 LIMIT 1 OFFSET 0 的特例嘛。
imba97
3 天前
@jiangzm 其实也不是找谁的责任,主要是统一一下的话会减少一些心智负担
imba97
3 天前
@fenglangjuxu 确实是 ruoyi
imba97
3 天前
@BG7ZAG 最开始用的 TS ,中间我退出了一阵,回来发现成了 any script ,天塌了。我还配了 eslint + git hooks ,结果直接给我绕过去
BG7ZAG
3 天前
@imba97 哈哈,碰到这种动态类型的接口返回 ts 还真是累啊。或者在接口的 function 上写多个重载类型根据 total 为 null 来使用哪个类型,不过接口请求回来使用还是得 as 类型
fenglangjuxu
3 天前
@laminux29 深表赞同 这点逻辑后端都实现不了 那真是菜到家了

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

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

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

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

© 2021 V2EX