關於接口設計的思考–我們真的需要這麼多入參嗎

為什麼說起接口設計

最近,我改造一個舊接口時發現,這個接口有 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 進行過濾。你覺得合理嗎?

本文為原創文章,轉載請附上原文出處鏈接://www.cnblogs.com/ZhangZiSheng001/p/14968393.html