我們經常使用 postman 來做介面校驗,在 postman 中,post 請求分為以下幾種型別:
這裡簡單講解幾種 content-type 型別的區別:
form-data:
表單上傳,當表單中包含檔案時可以使用該型別。
前端如果使用 axios 作為請求框架的話,需要傳送 FormData 物件。程式碼如下所示:
let params = new FormData();
params.append("publicCode",this.publicCode);
params.append("kfAccount", this.kefuFormValidate.inputAccount);
params.append("nickName", this.kefuFormValidate.inputNickname);
params.append("inviteWx", this.kefuFormValidate.inputWechart);
params.append("headImg", this.headFile);
this.axios.post("/weixin/kefu/add", params).then(res => {
...
})
複製程式碼
x-www-form-urlencoded:
跟 form-data 類似,區別在於不能上傳檔案。
raw
文字格式,一般我們會設定其 content-type 為 application/json。
這裡需要注意的是,前面兩種 content-type 型別在 spring 中都能用 HttpServletRequest 獲取,而 application/json 型別的資料是儲存在 HttpEntity 中,所以在 spring 中不能用 HttpServletRequest 獲取。
一般在後臺專案中,我們會實時列印出使用者請求的引數,方法等資訊。通常做法是用 AOP 攔截請求後列印出來。 我在實踐的時候就遇到一個問題:
列印的引數應該從 JoinPoint 的物件獲取,而不是從 HttpServletRequest 獲取,因為 application/json 格式的資料不會儲存到 HttpServletRequest 中。
由於業務需求,我每條介面都需要傳遞一個 checkCode 欄位,但由於Controller 中形參的 bean 是使用第三方,所以我這邊不好改,因此我這邊有以下2種解決方法:
- 自定義 bean 繼承第三方的 bean,新增 checkCode 屬性
- 由於 spring 使用 HttpMessageConverter 來幫我們轉化請求響應資料,因此可以實現該介面來修改我們的引數,相較於第一種會麻煩點。