axios的content-type是自动设置的吗?
比如我这样发送一个数据到后台 我发现请求头的content-type是application/json;charset=UTF-8
axios({
url: '/login',
method: 'post',
data: {email: '666@qq.com', password: 123123}
})
如果发送下面这条数据 请求头的content-type就会变成multipart/form-data
我想问一下是axios根据发送内容自动设置的content-type吗?不用自己设置吗?
let formData = new FormData()
formData.append('name', 'aaa')
axios({
url: '/login',
method: 'post',
data: formData
})
还有一个问题我想在axios拦截器里面查看当前请求头的content-type类型?我发现下面这样输出的是undefined
这是为什么?
如果打印config.headers就下面图片中的样子
axios.interceptors.request.use(
config => {
console.log(config.headers['Content-Type']) //提示undefined
}
)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 data 是 内置对象的时候会进行一些自动设置,当 data 是
FormData
时自动设置(严格来说是强制删除)content-type
的值,让浏览器自己设置。当 data 为URLSearchParams
对象时设置为application/x-www-form-urlencoded;charset=utf-8
, 当 data 为普通对象时,会被设置为application/json;charset=utf-8
是自动设置的
在
transformRequest
里 defaults.transformRequest,判断了URL
和object
,分别自动设置了application/x-www-form-urlencoded
,application/json
这里的自动设置是没有
Content-Type
的时候才设置,当你在之前已经设置了Content-Type
这里是不会自动设置的而
multipart/form-data
是 发送ajax
之前 xhrAdapter 里, 判断是否是FormData
如果是就删除Content-Type
这个key
,因为浏览器会自动的设置这里的设置是强制的只要你的
data
是FormData
就会删掉Content-Type
至于你再拦截器里看不到是
拦截器request -> 拦截器request -> ... -> dispatchRequest -> 拦截器response -> ...
自动设置是在
dispatchRequest
里的,在拦截器request
之后