今天使用node got模塊遇到了content-type=form-data 發送不了數據到後端的問題,看看我原來的代碼。
var gotSend = require('got').
var FormData = require('form-data');
try {
let form = new FormData();
form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
form.append('a', "123");
var got = gotSend({
"url": "https://echo.apipost.cn/get.php",
"method": "POST",
"headers": {
"Accept": "*/*",
"Accept-Language": "zh-CN",
"Origin": "https://echo.apipost.cn",
"content-type": "multipart/form-data",
"cookie": "a=1"
},
"responseType": "buffer",
"timeout": 25000,
"https": {
"rejectUnauthorized": false
},
"decompress": true,
"body": form
})
let res = await got // res response 對象
} catch (error) {
//請求發送錯誤
}
結果這樣發送到後端,後端接收不到FormData的數據。
那就很奇怪了,我明明是按照官方給的例子發的FormData數據,怎麼後端會接收不到呢。官方例子如下:
難道我哪裏參數傳的有問題?
於是在我不懈努力一個一個參數去掉與後端聯調的情況下,終於讓我發現了問題。居然是在headers裏content-type導致的。
"content-type" : “multipart/form-data”, 這個參數去掉就可以正常發送數據了,
我之前用request的時候,也是這樣傳請求頭的,可爲什麼got就不行了呢,我不填content-type到後端的請求頭到底是怎麼樣的呢 ?
於是我帶着疑問偷偷去看了一眼後臺接收到的請求數據。
嗯? 加了boundary,這下明白了,原來用request請求的時候reqeust包會在我寫的content-type後面自動拼上boundary,可是got在我寫了content-type的情況下不會覆蓋我自己寫的content-type。這樣導致沒有參數分隔符,所以後端接收不到數據。
所以在got不更新這一塊邏輯的情況下的結論是:
got使用form-data傳參的時候
1.不要自己在headers里加content-type got會給我們加好
2.自己動手,在content-type後面拼上正常的boundary