介面寫出來之後,想要測試其正確性。最快速的方法莫過於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-type
為application/json
時
- 程式碼裡可以
axios.post('/api/user',{a:1,b:2})
,axios會將物件自動變成json物件之後,傳送出去,content-type也會因為第二個引數是物件,而自動變成application/json
,無需額外設定。如果用的別的庫,根據庫看看是否需要設定請求頭Content-Type = application/json
- postman裡,使用的時候,如下圖:,這裡postman也會因為你選擇
JSON
,而自動設定Content-Type = application/json
這裡弱弱的說下後臺app.use(bodyParser.json())
然後拿到的let {a,b} = req.body
application/x-www-form-urlencoded
當介面規定需要的content-type
為application/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也會因為你選擇
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-type
為multipart/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也會因為你選擇
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也會因為你選擇
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的具體用法