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

4 天前
 imba97

今天发生一个离谱的问题

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

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

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

争论开始了

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

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

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

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

类似这样

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

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

最后虽然也改成统一的了

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

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

4767 次点击
所在节点    程序员
101 条回复
wangritian
4 天前
“有一个列表接口,本来有数据,后面突然列表没了”
这件事重要的不是定义成什么样,而是后端改了东西不告诉前端
你需要强调以后任何修改都必须先协商,至于改成什么样,建议照顾下没水平又脾气大的那方
imba97
4 天前
@wangritian 好像是误操作之类的改了,后端可能也不知道。但我想如果数据格式一致的话,顶多就是分页失效了,还好发现点。我找半天发现是 key 名字换了这不扯淡么
donaldturinglee
4 天前
@imba97 下次多做点沟通试试, 向下兼容一下. 我习惯做了接口改动都和前端说一下, 让前端记得重新看一下文档
imba97
4 天前
@donaldturinglee 好嘞 👍
pike0002
4 天前
@imba97 嗯嗯,明白你说的意思。如果是统一设计的话确实应该尽量保持数据接口的一致性。这种不一致的管理维护都一定的心智和时间成本。
lefer
4 天前
只有我关心今天是周六,应该是休息的吗。。
RyougiShiki
4 天前
应该统一结构
dcsuibian
4 天前
分两种结构啊,就像这样:
interface ResponseWrapper<T> {
result: T
message: string
code: number
timestamp: number
}

interface PageWrapper<T> {
data: Array<T>
pageNumber: number
pageSize: number
total: number
totalPages: number
}
dcsuibian
4 天前
如果是一个普通的项就是 ResponseWrapper<T>
如果是个列表就 ResponseWrapper<Array<T>>
如果是分页数据就 ResponseWrapper<PageWrapper<T>>
ashing
4 天前
这跟有没有分页其实没有关系吧,统一字段返回即可。例如下面这种:

```json
{
"list": [],
"total": 0
}
```
sgiyy
4 天前
后端真没必要在 response 里多加一个 rows 的字段啊...不过如果是老项目的话可能是之前代码里的约定了,他就这么接着写了,那尽量就不要改了;新项目的话找他重新约定下或者让前后端 leader 谈一下吧
wolfie
4 天前
考虑到你的表述水平,建议你听你们后端的。
heimoshuiyu
4 天前
大家都是草台班子,吵得过就听你的,吵不过就乖乖写判断逻辑
SPACETYPEZERO
4 天前
之前遇到过差不多的情况,后端如果数据为空返回前段 JsonObject ,如果有数据返回 JsonArray ,很难评哇,本来是分装好的网络请求库的,现在要手动 Json 解析了。
demonzoo
4 天前
我们是前后端都用 typescript ,用统一的 schema types 管理数据类型,很安逸。。。后端如果 api 接口变了的话,build 的 CI 也会挂,PR 根本 merge 不了

话说像你说的这种后端改动已经属于 breaking change 了,既没有做兼容又没有通知前端更新,属实草台班子
MarsCloud
4 天前
不管数据是什么,一般默认都会要求服务端直接统一格式以及统一字段名处理;
统一字段名,泛型比较方便处理,多个字段命名,那么就得定义多一个字段来处理
aiqinxuancai
4 天前
你们怎么周六还上班
XCFOX
4 天前
接口格式一般听后端的,但是文档一定要写清楚。
最好是加上 OpenAPI/tRPC/GraphQL 确保端对端类型安全,能避免很多接口对接的问题。
imba97
4 天前
@lefer 别骂了别骂了,之前接的兼职 😂
klzy
4 天前
插一句题外话,是不是直接拿 ruoyi 或者其他基于 ruoyi 修改的框架做的系统,因为我对这个操蛋的地方有一点点印象....

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

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

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

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

© 2021 V2EX