為什麼說起介面設計
最近,我改造一箇舊介面時發現,這個介面有 30 多個入參,而事實上並不需要那麼多,而且,這個介面還存在比較大的安全隱患。所以,關於如何設計介面入參,我想談談自己的一些想法。
當然,只是一家之言,不一定就是對的。
給以下需求設計一個介面
我改造的這個介面主要用來儲存單據,單據由商場下單員錄入,單據內容包括:客戶(誰)、門店(在哪裡)、服務時間(什麼時候)、服務內容(做了什麼事)等等。
單據的表設計大致如下。通過對應的 id 關聯了商場、門店和客戶,並且冗餘了部分欄位。這裡暫且不討論表設計的合理性。
欄位 | 描述 |
---|---|
id | 主鍵 |
org_id | 商場id |
org_no | 商場編碼 |
shop_id | 門店id |
shop_no | 門店編碼 |
customer_id | 客戶id |
customer_name | 客戶名 |
customer_tel | 客戶電話 |
······ | 省略 |
前端頁面大致是這樣的。商場、門店和客戶等資訊都是選出來的,而不可以手動編輯。門店是商場的下級,它們的關係有點像部門和科室,所以,當我選擇了門店後,商場自然地也帶出來了。
那麼,針對這個介面,我們該如何設計入參呢?
舊介面的設計--把所有事情交給前端
舊介面的設計非常直接,資料庫表需要什麼欄位,前端就傳什麼欄位。
public class ServiceInfoDTO {
@NotBlank
private String orgId;
@NotBlank
private String orgNo;
@NotBlank
private String shopId;
@NotBlank
private String shopNo;
@NotBlank
private String customerId;
@NotBlank
private String customerName;
@NotBlank
private String customerTel;
// ······
}
這個介面把資料的組裝邏輯全部丟給了前端,而後端幾乎什麼都不需要做,只要把前端的資料直接入庫就行。因為什麼都不需要做,效能肯定很好。還有,這個介面上線至今,暫未出現 bug。
那麼,它就算是一個好介面了嗎?
我認為不是,因為這個介面太過信任呼叫方,即使我隨便入一個商場 id,資料照樣可以入庫。而且,不應該把邏輯都放在前端,也並不需要那麼多的入參。
我也很好奇一點,設計出這樣的介面,前端竟然沒有意見。
新介面的設計--更少更安全的入參
那麼,我們應該如何改造這個介面呢?
首先,我們來解決入參過多的問題,思路就是將資料組裝邏輯轉移到後端。在這個介面中,欄位間是存在關聯關係的,例如,有了門店 id,我們就可以拿到門店編碼、商場 id、商場編碼,客戶資訊也是同理。所以,我們是否可以將入參更改成這樣:
public class ServiceInfoDTO {
// @NotBlank
// private String orgId;
// @NotBlank
// private String orgNo;
@NotBlank
private String shopId;
// @NotBlank
// private String shopNo;
@NotBlank
private String customerId;
// @NotBlank
// private String customerName;
// @NotBlank
// private String customerTel;
// ······
}
接著我們來解決安全問題。我們需要增加校驗,例如,當前下單員能不能選到傳進來的門店和客戶,等等。
通過改造,這個介面效能上不如舊介面,但更加安全。
你怎麼看
我還遇到過其他類似的介面。例如,查詢”我的客戶“的介面讓前端傳建立人 id 進行過濾,後端不做條件設定和校驗,直接將條件轉為 sql 查詢資料庫,查詢”商場客戶“時則讓前端傳商場 id 進行過濾。你覺得合理嗎?
本文為原創文章,轉載請附上原文出處連結:https://www.cnblogs.com/ZhangZiSheng001/p/14968393.html