先從"信封"兩字講起,
┌───────────────────────────┐
│ Backend Envelope │
│ │
│ code: 0 │
│ message: "success" │
│ │
│ data: ┌────────────────┐ │
│ │ Business Data │ │
│ │ UserDto │ │
│ └────────────────┘ │
└───────────────────────────┘
在 API 的回應處理,前端會先需要
1.知道此回應是否成功,或是得到了其他的狀態碼、訊息。這是信封表頭。
2.用來渲染畫面或其他用途的資料。這是被放在信封裡面。
但在公司專案,
Legacy A endpoint API
ApiEnvelope
└── d
Legacy B endpoint
ApiEnvelope
└── data
這樣兩套 wire-format variant, 我只要兩個 key 都接,或是動態根據 endpoint 解析指定的 key, 我也可以順利拿到信封裡面的資料(payload),不是嗎?
但繼續對上面這問題提問,會有以下要考慮的:
| 問題 | 如果答案是 Yes |
|---|---|
d 和 data 都代表主要 response body? |
可以 normalize |
| 成功/失敗規則相同? | 更適合共用 Envelope |
兩者型態都由 endpoint 的 T 決定? |
適合 ApiEnvelope<T> |
有可能同時出現 d、data? |
必須定義規則 |
null 的意義是否相同? |
必須確認 contract |
這邊要聚焦的是:後端的不一致,要不要滲透進 App 內部?要的話要進到哪一層?
Backend JSON
│
│ d / data
▼
Network DTO ← 知道:合理
│
▼
Repository ← 最好不要知道
│
▼
Domain ← 不應該知道
│
▼
ViewModel / UI ← 更不應該知道