在使用axios设置请求头是遇到的问题
axios.request({
url: 'xxx',
headers: {
'Content-Type': 'application/text',
Authorization: getUserInfo('token'),
},
params: {
status: 1
}
}).then(res => {
})
这样设置后发现无效,Authorization有效。但是Content-Type怎么都出不来。
后面尝试了各种方法,创建axios实例。在实例上设置请求头。发现不行
然后又尝试将headers改成header,发现依旧不行。
给axios设置默认请求头,还还还是不行。
心态崩了。
后面以为是没有指定请求方式,所以导致请求头失效。结果设置了method之后,发现还是没有用。
最后瞎搞发现将params换成data。请求头就设置上去了。
后面百度了解到 axios内部做了个判断,如果是get请求。是不让你设置请求头的。而他的判断就是依据data是否存在,如果data存在则默认你是post请求。允许设置请求头。
但是后端要求这个接口必须是get的。
最后解决办法如下
axios.interceptors.request.use(config => {
if (config.method === 'get') {
// 给data赋值以绕过if判断
config.data = true
}
config.headers['Content-Type'] = 'application/text'
return config
}, err => Promise.reject(err))
通过拦截器给这个请求添加data。然后再去设置请求头。即可成功
最后记录一下百度过程中收货到的知识
HTTP协议中的Accept与Content-Type的区别
- 类型不同
类型不同Accept属于请求头, Content-Type属于实体头。
Http报头分为通用报头,请求报头,响应报头和实体报头。
请求方的HTTP报头结构:通用报头|请求报头|实体报头
响应方的HTTP报头结构:通用报头|响应报头|实体报头
- 作用不同
Accept代表发送端(客户端)希望接受的数据类型。 比如:Accept:text/xml; 代表客户端希望接受的数据类型是xml类型。
Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。 比如:Content-Type:text/html; 代表发送端发送的数据格式是html。
二者合起来, Accept:text/xml; Content-Type:text/html ,即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。