「額外字段」指的是那些未在接口文檔中明確定義的字段。出現「額外字段」的場景可能是因為業務進行了升級,導致接口返回的數據在原來的基礎上增加了一些新的字段,但是接口文檔中定義的數據結構尚未做相應的更新,這就出現了接口返回數據與文檔定義之間的不匹配問題。
針對這種情況,Apifox 最新版本提供了一項功能,允許用户自定義設置對「額外字段」的校驗響應。這意味着你可以選擇在遇到「額外字段」時是否接收提示,從而更靈活地處理接口返回數據與文檔定義不一致的問題。
舉個例子,假設接口文檔中定義的數據結構如下所示,這裏面並未包含 email 字段:
{
"code": "0",
"message": "ok",
"data": {
"id": "1001",
"name": "張三",
"age": 33
}
}
在實際發送請求後,響應數據中卻出現了額外未定義的 email 字段,但是這個時候你會發現,校驗響應的控制枱裏並沒有產生預期的錯誤提示,這是因為 Apifox 在默認設置中允許響應數據包含「額外字段」,並不會對這些未預定義的字段進行校驗。
但在某些情況下,我們可能對開發有着更為嚴格的要求。像上面的例子那樣,如果接口響應中新增了「額外字段」,我們可能希望在校驗響應的控制枱中接收到錯誤提示,以確保數據結構的完整性和一致性。這時,要怎麼實現呢?
觸發對「額外字段」的校驗非常簡單!有兩種方法:
- 通過全局設置
- 對特定接口進行設置
注意,要使用此功能,你需要將 Apifox 的版本升級到 2.5.15 以上。
「額外字段」校驗設置
方法 1 全局設置
你可以在「項目設置 - 功能設置 - 響應校驗設置」裏,對“Object 對象允許額外字段”的選項進行開啓或關閉,該全局設置將對項目內所有接口生效。
具體來説,該功能默認處於啓用狀態,它確保即便響應數據中出現了文檔未定義的字段,也不會觸發校驗錯誤提示。
相反,關閉此選項意味着返回的接口數據必須與 接口文檔 的定義嚴格一致,任何額外的未定義字段都將引起校驗錯誤,控制枱裏會提示“不允許有額外的屬性” 。
方法 2 接口級別的設置
除了全局設置之外,你還可以針對單個接口進行細化設置。通過訪問「修改文檔」下的「返回響應」部分,進而選擇 object 對象的「高級設置」來實現。在彈出的配置界面中,你將能夠對額外字段(HashMap)進行特定配置。
這裏設置的「額外字段」其實是 HashMap 的概念,什麼是 HashMap?簡單講就是一組鍵值對的集合,也可以稱為 Map、字典或關聯數組,各種編程語言中可能採用不同的術語,但基本概念相同。
在接口中配置額外字段共有三個選項,分別是「未配置」、「允許」和「禁止」。默認選擇「未配置」。如果選擇「允許」,那麼你還可以進一步設置字段值的類型,並根據不同的字段值類型設置屬性。
在 OpenAPI 規範中,你可以定義一個鍵為字符串類型的 HashMap,並且你還可以明確規定這些字符串鍵所對應的值的數據類型,這樣做可以讓你靈活定義接口期望接收的「額外字段」。
舉個例子,假設我們需要設計一個字段,該字段可以包含任意數量的鍵值對,其中每個鍵值對的值都為字符串類型。在 Apifox 中,我們可以將額外字段值的類型設置為 string 來實現。
保存後,你可以在接口文檔內的返回響應示例中看到符合定義的數據結構和示例值。
💡 更專業的解釋
在 OpenAPI 規範中,你可以定義一個鍵為字符串類型的 HashMap,這是通過將一個對象(object)的元素類型標記為 additionalProperties ,並指定鍵值對中值的類型來實現的。
additionalProperties 是 OpenAPI 規範中的一個關鍵字,它用於描述對象中那些沒有明確聲明的屬性,這個關鍵字用於指定對象中的“額外屬性”,即除了在對象定義中已經明確説明的屬性之外的所有屬性。
在標記了 additionalProperties 的情況下,我們需要進一步定義這些“額外屬性”的值應當是什麼類型。值的類型可以是任何有效的數據類型,如字符串(string)、數字(number)、布爾值(boolean)或其他對象(object)等。
需要注意的是,「接口級別的設置」擁有比「全局設置」更高的優先級,也就是説,你在接口中設置的操作都會默認覆蓋全局的。
其它響應校驗設置
除此之外,最新版的 Apifox 還支持其它響應校驗的設置,還是在「項目設置 -> 功能設置 ->響應校驗設置」中選擇。
你可以把“自動化測試”的校驗響應選項給關了,這樣在調試時,“自動化測試”的“測試步驟”詳情頁裏就不會再顯示“校驗響應”功能。
你也可以選擇只校驗響應 HTTP 狀態碼,或者只校驗響應 Body 的數據結構,關鍵取決於你的業務需求。
新版的 Apifox 提供了靈活的數據校驗選項,你可以通過全局或接口級設置來控制是否允許響應數據包含未定義的額外字段。