为什么用axios封装好的方法发送请求会跨域而直接用axios发请求就可以呢?

本文介绍了如何封装axios以创建请求服务,但在处理第三方接口时遇到跨域问题。问题出在headers的Authorization字段,去掉后能正常访问,提示可能第三方接口对这类请求进行了拦截。
摘要由CSDN通过智能技术生成

对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那里也可以看出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值