2016-04-02 61 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