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
  }
)

图片描述

阅读 14.9k
2 个回答

是自动设置的
transformRequestdefaults.transformRequest,判断了URLobject,分别自动设置了application/x-www-form-urlencoded,application/json
这里的自动设置是没有Content-Type的时候才设置,当你在之前已经设置了Content-Type这里是不会自动设置的

multipart/form-data 是 发送ajax之前 xhrAdapter 里, 判断是否是 FormData如果是就删除Content-Type这个 key,因为浏览器会自动的设置
这里的设置是强制的只要你的 dataFormData 就会删掉 Content-Type

至于你再拦截器里看不到是
拦截器request -> 拦截器request -> ... -> dispatchRequest -> 拦截器response -> ...
自动设置是在 dispatchRequest 里的,在拦截器request之后

在 data 是 内置对象的时候会进行一些自动设置,当 data 是 FormData 时自动设置(严格来说是强制删除)content-type 的值,让浏览器自己设置。当 data 为 URLSearchParams 对象时设置为 application/x-www-form-urlencoded;charset=utf-8, 当 data 为普通对象时,会被设置为 application/json;charset=utf-8

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏