问题概述 周末与同事联调上传文件时发现使用新版本使用fetch跟老版本使用axios发出的文件上传请求不一致。axios上传的代码body使用formdata形式上传文件而我使用的fetch的内容被包裹在requestpayload中。
1.axios
注意两点
a.content-type
b.requestbody类型
2.fetch
两处内容一致,不一致的地方有两处1content-type. 2.requestbody
此处发出一个疑问,为什么导致两处不一致?
我们从两边分析
1.axios
我们查看原码得知
defaultcontenttype为application/x-www-form-urlencoded
我们上传文件时,网上99%的教程都是叫我们设置axios的headers,把content-type做如下设置
我的同事就是做了如下设置,并且确实实现了我们上述formdata的效果。
不过我们知道设置后multipart/form-data后参数会放在requestbody中,并且我们实际的content-type比我么设置的contenttype多了一个boundary。由此我产生一个疑惑,是不是我们设置的content-type压根没有生效,
由此我做了以下实验 1.删除content-type重复发送以上请求,发现结果一致。请求成功 2.查看源码,发现通篇没有关于multipart/form-data的内容
由此我们得出结论,axios发送内容为formdata的数据时,设置的content-type无效,并且浏览器会自动生成报文
2.fetch 如法炮制,我们查看网上教程,需要上传文件时,教程都要求我们修改contenttype 我们做了如下测试 1.contenttype设置为我们修改的内容,请求失败,缺少boundary 2.手动设置boundary, 数据体依然在requestpayload中 3.删除headers的contenttype,数据在formdata中,并且contenttype为content-type: multipart/form-data; boundary=——WebKitFormBoundaryDubm7ZyfULiXCQBV
总结 1.axios当数据格式为formdata时,无法手动修改,默认content-type: multipart/form-data; boundary=——WebKitFormBoundaryDubm7ZyfULiXCQBV,其他情况可设置contenttype
2.fetch当数据格式为formdata时,依然可以手动设置contenttype。
3.因此当我们需要上传文件时,使用axios可以直接上传,不做任何设置。此时requestbody为formdata。当我们使用fetch上传文件时,可以手动设置contenttype和buondary,并且requestbody为requestpayload,当我们删除contenttype时,浏览器会自动添加报文。