前端axios全局配置 请求拦截器 响应拦截器 封装各种请求方式

axios全局配置 请求拦截器和响应拦截器 封装各种请求方式

在Vue项目中使用axios时,封装请求方式、请求拦截器和响应拦截器是一个良好的实践。以下是一个简单的axios封装的例子,包括GET、POST请求,以及请求拦截器和响应拦截器。

一、封装axios文件

1.封装axios文件,请求头和响应头做不同处理

安装了axios

npm install axios

封装axios

import axios from 'axios'     //引入
import { Message } from 'element-ui';

let baseURL = ''  //线下
// let baseURL = '/admin'  //线上

let config = {
  baseURL: baseURL,
  withCredentials: true, // 跨域
  timeout: 30000       //设置最大请求时间
}
const _axios = axios.create(config)
/* 请求拦截器(请求之前的操作) */
_axios.interceptors.request.use(
  config => {
      //如果有需要在这里开启请求时的loading动画效果
      config.headers.token = window.localStorage.getItem('token') //添加token,需要结合自己的实际情况添加,
    return config;
  },
  err => Promise.reject(err)
);

/* 响应拦截器即异常处理 */
_axios.interceptors.response.use(
  response => {
      // 如果返回的状态码为200,说明接口请求成功,可以正常拿到数据     
        // 否则的话抛出错误
        if (response.status === 200) {            
          return Promise.resolve(response);        
      } else {            
          return Promise.reject(response);        
      }    
  },
  error => {
    // 状态码判断处理
    if(error.response.status == 500){
        Message('请求服务器错误')
    }else if(error.response.status == 401){
        Message('token过期,请重新登录')
        // router.replace({                        
        //     path: '/login',                        
        // });
        setTimeout(()=>{
          window.location.href= 'https://sys.ycyd777.com/login'
        },1500)
        // this.$router.path("/login");

    }else{
        Message(`'连接错误'${error.response.status}`);
    }
    return Promise.reject(error);
    
  }
);

//封装post,get方法
const http = {
  get(url='',params={}){
    return new Promise((resolve, reject) => {
      _axios({
        url,
        params,
        headers:{'Content-Type': 'application/json;charset=UTF-8'},
        method: 'GET'
      }).then(res => {
        resolve(res.data)
        return res
      }).catch(error => {
        reject(error)
      })
    })
  },
  post(url='',params={}){
    return new Promise((resolve, reject) => {
      _axios({
        url,
        data:params,
        headers:{'Content-Type': 'application/json;charset=UTF-8'},
        method: 'POST'
      }).then(res => {
        resolve(res.data)
        return res
      }).catch(error => {
        reject(error)
      })
    })
  }
}

export default http

2.封装不同请求方法,包括请求头部content-type。包括get post请求方式

二、请求后台接口api

在写具体接口api时候,直接定义不同method,即可对应不同request请求方法和请求头部content-type


import axios from '../axios/axios'

//设置个对象,就不用一个个暴露了,直接暴露对象
let serverApi = {};

/* 获取列表 */
//查询列表,详情就是get
/* /api/getlist是请求接口地址,有http.js里面的Ip加上,如:http:192.168.0.111:9090//api/getlist  */
// apiFun.getlist = function(params) {
let api = 'api/'   

serverApi.getAdmin = function(params) {
  return axios.post(api+'/api.sys.Company_user_read_lz/login', params)
}

// serverApi.getBaiduToken = function(params) {
//   return axios.post(api+'/api/rest/2.0/ocr/v1/vehicle_license', params)
// }

// 菜单列表
serverApi.companyModuleFindTree = function(params) {
  return axios.post(api+'/api.sys.Company_module_read_lz/findTree', params)
}
serverApi.companyModuleList = function(params) {
  return axios.post(api+'/api.sys.Company_module_read_lz/getTree', params)
}

// 角色管理--设置权限
serverApi.roleSetPower = function(params) {
  return axios.post(api+'/api.sys.Company_role_lz/setPower', params)
}

总结:封装其实是非常简单的,往往在做一个新的项目都会用到这一步,希望都能去手写一遍,这样在以后的项目中就能得心应手的使用啦!

七牛云、阿里云和腾讯云云存储基础环境搭建教程

史上最全CSS命名规则总结及公用常见的CSS前端整理小知识

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对你的问题,可以在请求拦截器中设置一个定时器,用来控制toast的显示时间。 具体的实现方法如下: ```javascript import axios from 'axios'; import { Toast } from 'vant'; // 创建axios实例 const instance = axios.create({ baseURL: 'http://api.example.com', timeout: 5000 }); // 请求拦截器 instance.interceptors.request.use(config => { // 显示toast Toast.loading({ message: '加载中...', duration: 0 // duration 为 0 时,toast 不会消失 }); // 返回请求配置 return config; }, error => { // 请求错误处理 return Promise.reject(error); }); // 响应拦截器 instance.interceptors.response.use(response => { // 清除toast Toast.clear(); // 返回响应结果 return response; }, error => { // 响应错误处理 Toast.clear(); return Promise.reject(error); }); export default instance; ``` 在请求拦截器中,我们使用vant的`Toast`组件显示了一个正在加载中的提示,同时设置了duration为0,使得toast不会自动消失。在响应拦截器中,我们清除了toast。 如果你想要控制toast的显示时间,可以在页面中使用`setTimeout`函数,手动控制toast的消失时间,例如: ```javascript import request from '@/utils/request'; export default { async getUserInfo() { try { const res = await request.get('/user/info'); setTimeout(() => { Toast.clear(); }, 2000); // 2秒后消失 return res.data; } catch (error) { console.error(error); } } }; ``` 以上是一种简单的实现方式,如果你想要实现更复杂的需求,可以参考vant官方文档中的toast组件说明进行自定义的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值