【Vue】设置请求配置--拦截器&取消请求

本文介绍如何使用Axios库进行请求与响应拦截,包括配置请求和响应拦截器的方法、错误处理策略、自定义HTTP状态码错误范围及使用CancelToken取消请求等高级用法。

在请求或响应被 then 或 catch 处理前拦截它们。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

如果你想在稍后移除拦截器,可以这样:

const myInterceptor = axios.interceptors.request.use(function () {/*...*/});
axios.interceptors.request.eject(myInterceptor);

可以为自定义 axios 实例添加拦截器

const instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

错误处理

axios.get('/user/12345')
  .catch(function (error) {
    if (error.response) {
      // The request was made and the server responded with a status code
      // that falls out of the range of 2xx
      console.log(error.response.data);
      console.log(error.response.status);
      console.log(error.response.headers);
    } else if (error.request) {
      // The request was made but no response was received
      // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
      // http.ClientRequest in node.js
      console.log(error.request);
    } else {
      // Something happened in setting up the request that triggered an Error
      console.log('Error', error.message);
    }
    console.log(error.config);
  });

也可以使用 validateStatus 配置选项定义一个自定义 HTTP 状态码的错误范围。

axios.get('/user/12345', {
  validateStatus: function (status) {
    return status < 500; // Reject only if the status code is greater than or equal to 500
  }
})

取消 使用 cancel token 取消请求

Axios 的 cancel token API 基于cancelable promises proposal,它还处于第一阶段。

可以使用 CancelToken.source 工厂方法创建 cancel token,像这样:

const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function(thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
     // 处理错误
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// 取消请求(message 参数是可选的)
source.cancel('Operation canceled by the user.');

还可以通过传递一个 executor 函数到 CancelToken 的构造函数来创建 cancel token:

const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // executor 函数接收一个 cancel 函数作为参数
    cancel = c;
  })
});

// cancel the request
cancel();

注意: 可以使用同一个 cancel token 取消多个请求

&lt;think&gt;我们正在使用vue-admin-template项目,并需要配置axios请求拦截器。根据引用[2],我们知道在vue-admin-template中已经使用了axios进行数据请求(开发环境)。通常,我们会创建一个axios实例,并在该实例上添加拦截器。步骤:1.找到项目中初始化axios的地方。在vue-admin-template中,通常会在`src/utils/request.js`中创建axios实例并配置拦截器。2.如果没有该文件,我们可以创建一个,并在其中配置拦截器,然后在需要的地方引入这个实例。根据引用[3]和[4],项目结构遵守一定的规范。我们会在src目录下进行操作。具体实现:在`src/utils/request.js`中(如果不存在则新建),我们可以编写如下代码:```javascriptimportaxiosfrom&#39;axios&#39;//创建axios实例constservice=axios.create({baseURL:process.env.VUE_APP_BASE_API,//根据环境变量设置基础URL,在.env文件中配置timeout:5000//请求超时时间})//请求拦截器service.interceptors.request.use(config=&gt;{//在发送请求之前可以做些什么//例如,如果项目使用token,则可以从store中获取token并添加到请求头//假设我们将token存储在localStorage中,键为&#39;token&#39;consttoken=localStorage.getItem(&#39;token&#39;)if(token){config.headers[&#39;Authorization&#39;]=`Bearer${token}`}returnconfig},error=&gt;{//对请求错误做些什么console.log(error)//fordebugreturnPromise.reject(error)})//响应拦截器service.interceptors.response.use(response=&gt;{//对响应数据做点什么constres=response.data//这里可以根据后端返回的状态码进行判断,比如状态码不是20000,则认为是错误if(res.code!==20000){//可以弹出一个错误提示console.error(&#39;请求错误:&#39;,res.message||&#39;Error&#39;)returnPromise.reject(newError(res.message||&#39;Error&#39;))}else{returnres}},error=&gt;{//对响应错误做点什么console.log(&#39;err&#39;+error)//fordebugreturnPromise.reject(error)})exportdefaultservice```然后,在项目中需要发起请求的地方,我们不再直接使用axios,而是使用这个封装好的service。例如,在API模块中(通常放在`src/api`目录下):```javascriptimportrequestfrom&#39;@/utils/request&#39;exportfunctiongetInfo(token){returnrequest({url:&#39;/user/info&#39;,method:&#39;get&#39;,params:{token}})}```这样,每次请求都会经过请求拦截器和响应拦截器。另外,根据引用[4],我们注意到项目可能会使用mock数据。在请求拦截器中,我们也可以根据环境变量判断是否使用mock,但通常mock是在开发环境中通过引用mock文件(如引用[4]中的代码)来实现的,所以拦截器中不需要特别处理。注意事项:-请求拦截器中,我们通常添加认证信息(如token)到请求头。-在响应拦截器中,我们根据后端返回的数据结构进行统一处理,例如处理错误状态码。如果vue-admin-template已经有一个`request.js`文件,并且已经配置拦截器,那么我们可以直接修改该文件,添加我们需要的逻辑。最后,确保在`main.js`中引入的axios实例是我们封装好的这个,但通常在api模块中引入,所以不需要在main.js中全局引入。引用:-关于axios的配置和代理设置(引用[2])已经在vue.config.js配置了跨域代理,这与拦截器是独立的,不会冲突。-项目结构规范(引用[3])指导我们在views中写页面,而api模块则放在src/api目录。因此,按照以上步骤即可实现axios请求拦截器&lt;/think&gt; 基于 `vue-admin-template` 实现 Axios 请求拦截器的完整配置步骤如下: ### 1. **定位 Axios 实例文件** 在 `src/utils/` 目录中找到 `request.js` 文件。这是封装 Axios 的核心文件,所有网络请求都通过这个文件发出。 ### 2. **配置请求拦截器** 在 `request.js` 中添加请求拦截逻辑: ```javascript // src/utils/request.js import axios from &#39;axios&#39; // 创建 axios 实例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 基础 URL timeout: 5000 // 超时时间 }) // ========= 请求拦截器 ========= service.interceptors.request.use( config =&gt; { // 在发送请求前统一处理 // 示例1:添加认证 token const token = localStorage.getItem(&#39;token&#39;) if (token) { config.headers[&#39;Authorization&#39;] = `Bearer ${token}` } // 示例2:转换 POST 数据格式 if (config.method === &#39;post&#39;) { config.data = JSON.stringify(config.data) config.headers[&#39;Content-Type&#39;] = &#39;application/json&#39; } return config // 必须返回处理后的配置 }, error =&gt; { return Promise.reject(error) // 处理错误 } ) export default service ``` ### 3. **配置响应拦截器**(可选) 在同一个文件中添加响应拦截逻辑: ```javascript // ========= 响应拦截器 ========= service.interceptors.response.use( response =&gt; { // 对响应数据统一处理 const res = response.data // 示例:根据业务状态码处理 if (res.code !== 20000) { // 20000 是 vue-admin-template 默认的成功码 alert(`请求错误: ${res.message}`) return Promise.reject(new Error(res.message)) } return res }, error =&gt; { // 统一处理 HTTP 错误状态码 if (error.response.status === 401) { router.push(&#39;/login&#39;) // token 过期跳转登录 } return Promise.reject(error) } ) ``` ### 4. **跨域代理配置**(如需要) 在 `vue.config.js` 中配置代理(开发环境)[^2]: ```javascript // vue.config.js module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://your-api-domain.com&#39;, // 后端地址 changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; // 去除请求路径中的 /api } } } } } ``` ### 5. **启用 Mock 数据**(如需要) 在 `main.js` 中添加动态 Mock 支持[^4]: ```javascript // main.js if (process.env.NODE_ENV === &#39;development&#39; &amp;&amp; process.env.MOCK === &#39;true&#39;) { require(&#39;./mock&#39;) // 加载 mock/index.js } ``` ### 使用示例 在 API 模块中直接使用封装好的请求: ```javascript // src/api/user.js import request from &#39;@/utils/request&#39; export function login(data) { return request({ url: &#39;/api/login&#39;, // 会被代理规则处理 method: &#39;post&#39;, data }) } ``` ### 关键说明 1. **拦截器执行顺序**: ```mermaid graph LR A[请求发起] --&gt; B(请求拦截器) --&gt; C[服务器] C --&gt; D(响应拦截器) --&gt; E[业务代码] ``` 2. **内容类型处理**: - 默认使用 `application/x-www-form-urlencoded` - 通过拦截器可自动转换为 `application/json` 3. **环境变量**: - `.env.development` 中设置 `VUE_APP_BASE_API` - `.env.production` 中设置生产环境 API 地址
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DomCode

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值