怎麼測試一個介面,postman?form?axios?

顏醬發表於2019-10-30

介面寫出來之後,想要測試其正確性。最快速的方法莫過於postman,能脫離程式碼。當然前端還可以form表單提交或者利用axios。這裡想說,當一個介面出來以後,根據其不同的content-type,三種測試方式也有很大不同。

先說說content-type

請求頭和響應頭總會有content-type,正如翻譯內容型別,請求的時候表示body裡的內容型別,響應的時候表示返回體裡的內容型別。

get請求的時候沒有body,引數是拼接在介面地址後面的,所以get請求的時候,沒有content-type

post請求的時候,如果有body,介面肯定有content-type的值,而前端必須將請求頭設定成相應的值,這樣介面拿到正確的資料,不同的content-type,前後端處理的方法很多時候也是不同的。當然如果後端相容處理這幾種方式,那麼測試更加隨意了~~

content-type有很多型別,但是介面常用的是三種型別如下(如果有上傳檔案則只能用multipart/form-data):

  • application/json,此時前端傳的body格式是{"a":1,"b":2}
  • application/x-www-form-urlencoded,此時前端傳的body格式是a=1&b=2
  • multipart/form-data,此時前端傳的body格式如下,每個表單項使用 --[boundary] 分割開來,最後一行使用 --[boundary]-- 結尾,下面對應的就是{name:'huahua',file:檔案流,}
------WebKitFormBoundary6VWyGefevm60vjtn
Content-Disposition: form-data; name="name"

huahua
------WebKitFormBoundary6VWyGefevm60vjtn
Content-Disposition: form-data; name="file"; filename="study.md"
Content-Type: text/markdown

------WebKitFormBoundary6VWyGefevm60vjtn--
複製程式碼

application/json

當介面規定需要的content-typeapplication/json

  • 程式碼裡可以axios.post('/api/user',{a:1,b:2}),axios會將物件自動變成json物件之後,傳送出去,content-type也會因為第二個引數是物件,而自動變成application/json,無需額外設定。如果用的別的庫,根據庫看看是否需要設定請求頭Content-Type = application/json
  • postman裡,使用的時候,如下圖:
    postman
    ,這裡postman也會因為你選擇JSON,而自動設定Content-Type = application/json

這裡弱弱的說下後臺app.use(bodyParser.json())然後拿到的let {a,b} = req.body

application/x-www-form-urlencoded

當介面規定需要的content-typeapplication/x-www-form-urlencoded

  • 程式碼裡可以axios.post('/api/user',Qs.stringify({a:1,b:2})),stringify會將其變成a=1&b=2,content-type也會因為第二個引數是字串,而自動變成application/application/x-www-form-urlencoded,無需額外設定。如果用的別的庫,根據庫看看是否需要設定請求頭Content-Type = application/x-www-form-urlencoded,備註axios還可以在transformRequest處理,不細說了
  • 程式碼裡還可以form元素自動提交<form method="post" action="/api/user"><input type="text" name="a"><input type="text" name="b"><button type="submit">提交</button></form>,這裡不需要設定enctype,因為其預設值就是application/application/x-www-form-urlencoded
  • postman裡,使用的時候,如下圖:
    postman
    ,這裡postman也會因為你選擇x-www-form-urlencoded,而自動設定Content-Type = application/x-www-form-urlencoded

這裡弱弱的說下後臺app.use(bodyParser.urlencoded({ extended: false }))然後拿到的let {a,b} = req.body

multipart/form-data

當介面規定需要的content-typemultipart/form-data時,分為兩種情況:沒有上傳檔案和有上傳檔案

沒有上傳檔案的時候

  • 程式碼裡可以let formData = new FormData();formData.append('a',1);formData.append('b',2);axios.post('/api/user',formData),axios會自動將其變成加邊界的形式,content-type也會因為第二個引數是formData,而自動變成application/multipart/form-data,無需額外設定。如果用的別的庫,根據庫看看是否需要設定請求頭Content-Type = multipart/form-data,備註axios還可以在transformRequest處理,不細說了
  • 程式碼裡還可以form元素自動提交<form method="post" action="/api/user" enctype="multipart/form-data"><input type="text" name="a"><input type="text" name="b"><button type="submit">提交</button></form>,這裡必須設定enctype
  • postman裡,使用的時候,如下圖:
    postman
    ,這裡postman也會因為你選擇multipart/form-data,而自動設定Content-Type = application/multipart/form-data

這裡弱弱的說下後臺let upload = multer();app.post('/formdata', upload.none(), (req, res)=> { let {a,b} = req.body;... }),沒有檔案加上upload.none()

有上傳檔案的時候

  • 程式碼裡可以let formData = new FormData();formData.append('a',1);formData.append('avatar',xx.files[0]);axios.post('/api/user',formData),axios會自動將其變成加邊界的形式,content-type也會因為第二個引數是formData,而自動變成application/multipart/form-data,無需額外設定。如果用的別的庫,根據庫看看是否需要設定請求頭Content-Type = multipart/form-data,備註axios還可以在transformRequest處理,不細說了
  • 程式碼裡還可以form元素自動提交<form method="post" action="/api/user" enctype="multipart/form-data"><input type="text" name="a"><input type="file" name="avatar"><button type="submit">提交</button></form>,這裡必須設定enctype
  • postman裡,使用的時候,如下圖:
    postman
    ,這裡postman也會因為你選擇multipart/form-data,而自動設定Content-Type = application/multipart/form-data

這裡弱弱的說下後臺let upload = multer({ dest: 'uploads/' });app.post('/formdata', upload.single('avatar'), (req, res)=> { let file= req.avatar;let {a,b} = req.body;... }),檔案暫存在uploads/multer的具體用法

參考文獻

相關文章