接口里的复杂对象让人头疼
做前后端联调时,最怕接到一个字段嵌套三层的 JSON 对象。前端说字段看不懂,后端说结构很清晰,其实问题往往出在接口定义上——不是数据不对,而是复杂对象没处理好。
比如订单详情接口,返回一个包含用户信息、商品列表、优惠券、物流进度的对象。如果直接甩一个大而全的结构出去,调用方就得层层解包,写一堆 user.profile.address 这样的代码,一不小心就报 undefined。
拆解比硬扛更高效
与其让调用方自己拼装,不如在接口层面就把结构理清楚。用 TypeScript 的 interface 或者 JSON Schema 明确定义每一层的含义:
interface OrderDetail {
orderId: string;
userInfo: {
name: string;
phone: string;
address: string;
};
items: Array<{
productId: string;
count: number;
price: number;
}>;
logistics: {
status: 'pending' | 'shipped' | 'delivered';
steps: Array<{ time: string; desc: string; }>;
};
}这样前端拿到结构后,编辑器能自动提示字段,减少手误。后端也能用 schema 做校验,避免传错类型。
别把数据库结构直接暴露出去
有些接口直接把 ORM 查出来的对象序列化返回,连 __v、updatedAt 这种字段都带着。调用方会困惑:这个字段是干嘛的?要处理吗?
更好的做法是做一层 DTO(Data Transfer Object),只保留必要的字段。比如用户信息只需要昵称和头像,就不要把生日、注册 IP 都塞进去。精简后的结构更易理解,传输也更快。
嵌套太深?考虑扁平化或分接口
如果一个对象嵌套超过两层,比如 data.result.items[0].detail.specs.color,使用起来很容易出错。可以考虑两种方案:
一是适当扁平化,把常用字段提升一层:
{
"itemId": "1001",
"itemName": "无线耳机",
"itemColor": "黑色",
"itemPrice": 299
}二是拆成主信息 + 子资源接口。先返回订单概要,再提供 /order/123/items 单独获取商品列表。这样接口职责更清晰,也方便做缓存和权限控制。
文档里多给例子
光有字段说明不够直观,加一个真实响应示例,比写十行注释都管用。比如:
{
"orderId": "ORD20240405001",
"userInfo": {
"name": "张三",
"phone": "138****5678",
"address": "北京市朝阳区xxx"
},
"items": [
{
"productId": "P001",
"count": 2,
"price": 199
}
]
}看到这样的例子,前端同事马上就知道怎么取值了,沟通成本直接降下来。
接口设计不是越全越好,而是让别人用得顺手。把复杂对象处理清楚,省下的调试时间远超前期设计成本。