2016-04-02 80 views
0

我使用抓取API從瀏覽器發送了一個post請求。這是我的代碼:瀏覽器強制發送multipart/formdata

const headers = new Headers(); 
headers.append("Content-Type", "application/x-www-form-urlencoded"); 

fetch('/signup', { 
    method: 'POST', 
    body: new FormData(document.querySelector('form')), 
    credentials: 'same-origin', 
    headers 
}).then(
    response => response.text() 
).then(
    text => console.log(text) 
); 

我的表單只包含文本,電子郵件和密碼輸入類型。我期待表單數據與內容類型的應用程序/ x-www-form-urlencoded一起發送,但是它會作爲multipart/formdata發送。

我已經嘗試手動設置提取請求上的標題,並明確指定表單的encType屬性(即使它應該默認爲網址編碼),但它不工作。

Chrome和Safari都會發生這種情況。我可以通過使用JSON輕鬆解決這個問題,但我真的想知道爲什麼會發生這種情況!

+0

你可以發佈你試圖設置請求頭的代碼嗎?另一件事是它在很多主流瀏覽器中都不被支持。所以它可能仍然是越野車。請參閱此表以瞭解兼容性:https://developer.mozilla.org/en/docs/Web/API/Fetch_API#Browser_compatibility –

回答

1

the spec

交換機上對象的類型:

FORMDATA

設置動作到運行的multipart/form-data編碼算法中,採用對象作爲設定表格數據和動作用utf-8作爲顯式字符編碼。

將內容類型設置爲multipart/form-data;boundary=,後面是由多部分/表格數據編碼算法生成的多部分/表格數據邊界字符串。

它使用多部分,因爲您傳遞一個FormData對象,這就是使用FormData對象執行的操作。


如果你想手動發送application/x-www-form-urlencoded數據,則編碼它的方式或使用實現URLSearchParams接口的對象。

雖然你不需要。 multipart/form-data是一個標準,我從來沒有遇到過無法處理它的表單數據解析庫。唯一的缺點是它使請求佔用更多的字節。

+0

謝謝!實際上,表達'[body-parser](https://github.com/expressjs/body-parser)不支持多部分表單。 –

+1

@ AhmedA.Ghoneim - 但它推薦4個解析器。 – Quentin