写 api 文档时,对于请求协议 Content-Type 的值,纠结了好久,就研究一下。发现团队之前的接口文档,貌似写错了。
通过打印 axios 实例对象,发现 Get, Delete, Head 方法默认没有 Content-Type 这一参数,而 Post, Put, Patch 方法,Content-Type 默认值为 application/x-www-form-urlencoded。
查看之前项目调用的 Post, Put 方法,发现它们的 Content-Type 都为 application/json,但是在项目中我并没有对 Post, Put 方法的 Content-Type 进行重写,为什么会从默认的 application/x-www-urlencoded -----> application/json 呢?
然后看了大佬们对 axios 的封装,发现有些人会对 post 方法的 Content-Type 赋值为 application/json 来覆盖默认设置。
可是,我就是没有重写喔?发生了什么事!!!
然后去看 axios 的文档,没有看到相关的说明。
最后看了一下 axios 的源码,终于得到了答案。通过对部分源码进行粗陋分析(瞄了一眼而已。。。),发现 Content-Type 默认配置的确为 application/x-www-from-urlencoded。但是,如果开发中:
- 请求体数据为 undefined,如 Get, Head 方法,axios 会删除默认的 Content-Type 字段;
- 请求体数据不为空,且没有手动修改默认 Content-Type 设置
① 若请求体数据为 Object,application/x-www-from-urlencoded 被自动修改为 application/json;
② 其他各类情况(如 isArraryBufferView、isURLSearchParams),就进行其他处理,我就不展开说了。
否则就继续沿用默认值
3) 请求体数据不为空,手动设置 Content-Type 的值,将覆盖默认设置。axios 不再对请求体数据类型判断而进行 Content-Type 自动转换,即使用手动设置的 Content-Type 值。