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

261 天前
 imba97

今天发生一个离谱的问题

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

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

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

争论开始了

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

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

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

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

类似这样

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

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

最后虽然也改成统一的了

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

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

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

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

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

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

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

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

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

© 2021 V2EX