对axios进行封装:
import axios from "axios";
//** 创建请求实例 */
function createService() {
// 创建一个 Axios 实例
const service = axios.create()
// 请求拦截
service.interceptors.request.use(
(config) => {
return config
},
// 发送失败
(error) => Promise.reject(error)
)
// 响应拦截(可根据具体业务作出相应的调整)
service.interceptors.response.use(
(response) => {
return response.data
}
)
return service
}
/** 创建请求方法 */
function createRequestFunction(service) {
return function(config) {
const configDefault = {
headers: {
Authorization: "Basic TDAxRUFVN0czSjZDTVM2T0dKU1c5WE1SOjRHWklRMDlXUzhXSVlVUUFZRFlPRThCRFdWVpMwQVdQ",
'Content-Type': 'application/json'
},
baseURL: process.env.VUE_APP_BASE_API, // /api
data: {}
}
return (config) => {
return service(
Object.assign(configDefault, config, {headers: {...configDefault.headers, ...config.headers}})
)}
}
}
/** 用于网络请求的实例 */
export const service = createService()
export const request = createRequestFunction(service)
使用这个封装后的方法请求后端接口数据是没有问题的,但如果访问的是第三方接口,就会出现跨域的问题:
// 访问后端接口,可以正常返回数据
request({
url: '/v1/abc',
method: 'get'
})
//访问第三方接口,报跨域问题
request({
url: 'http://abc.com?cid=xxx', //这里只是模拟第三方接口
method: 'get'
})
如果直接用axios发请求,是可以成功访问的,所以就是这个封装的方法出了问题
axios.get('http://abc.com?cid=xxx')
找了很久的原因,最终发现是headers中的Authorization字段的影响,不加这个字段就可以正常访问,可能是第三方接口中对此请求做了拦截,所以访问不成功
PS:当请求是完整路径时,不会拼接上axios中的baseURL,从控制台的Network那里也可以看出来。