首页 > 其他分享 >封装axios请求

封装axios请求

时间:2024-09-29 10:21:47浏览次数:11  
标签:case axios 封装 请求 request break error message config

1、为什么要封装axios

封装axios,对错误信息进行统一处理,能提高代码简洁性,规范代码

2、封装步骤

2.1 创建文件

首先在utils文件夹下新建request.js文件,内容如下。要确保项目已经安装了axios,和element-ui

import store from '@/store'
import { getToken } from '@/utils/local'
import axios from 'axios'
import { Message } from 'element-ui'

//生产环境请求接口地址
if (process.env.NODE_ENV === 'production') {
  // window.config.userCenter = `${window.location.origin}:8080`
  window.config.serveIp = `${window.location.origin}/api`
  window.config.serveUrl = `${window.location.origin}/api`
}
// create an axios instance
const service = axios.create({
  // baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  // withCredentials: true, // send cookies when cross-domain requests
  baseURL: window.config.serveUrl,
  timeout: 60000 // request timeout
})
const pending = []
const cancelToekn = axios.CancelToken
let removeP = false
const removePending = (config, isAll) => {
  for (let i = 0; i < pending.length; i++) {
    if (isAll) {
      pending[i].fun()
      pending.splice(i, 1)
      i--
    } else {
      if (pending[i].name === config.url + JSON.stringify(config.data) + '&' + config.method) {
        pending[i].fun()
        pending.splice(i, 1)
        break
      }
    }
  }
}
// request interceptor
service.interceptors.request.use(
  config => {
    // 在HTTP请求前取消前面的所有请求
    removeP = config.removeP
    if (config.removeP) removePending(config, true)

    // 记录本次HTTP请求
    // eslint-disable-next-line new-cap
    config.cancelToken = new cancelToekn((c) => {
      pending.push({
        name: config.url + JSON.stringify(config.data) + '&' + config.method,
        fun: c
      })
    })
    // do something before request is sent
    // 请求头添加token
    if (getToken()) {
      config.headers['Token'] = getToken()
    }
    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)
// response interceptor
service.interceptors.response.use(
  /**
   * If you want to get http information such as headers or status
   * Please return  response => response
  */

  /**
   * Determine the request status by custom code
   * Here is just an example
   * You can also judge the status by HTTP Status Code
   */
  response => {
    if (response.status !== 200) {
      Message.error(response.data.message)
    } else {
      return response.data
    }
  },
  error => {
    if (error.response) {
      const { response: { status, data: { msg, code }}} = error
      const reloadCode = [1106, 1107, 1108]
      const waringCode =[1408]
      switch (status) {
        case 400:
          Message.error(msg)
          break
        case 401:
          // 返回 401 清除token信息并跳转到登录页面
          if (reloadCode.includes(code)) {
            setTimeout(() => {
              store.dispatch('user/resetToken').then(() => {
                location.reload()
              })
            }, 1000)
          }
          Message.error(msg)
          break
        case 403:
          Message.error(msg)
          break
        case 404:
          if(waringCode.includes(code)){
            Message.warning(msg)
            break
          }
          Message.error(msg)
          break
        case 408:
          error.message = '请求超时'
          break
        case 422:
          Message.error('参数错误')
          break
        case 500:
          error.message = '服务器内部错误'
          break
        case 501:
          error.message = '服务未实现'
          break
        case 502:
          // 连接服务器失败
          Message.error('服务器内部错误')
          setTimeout(() => {
            store.dispatch('user/resetToken').then(() => {
              location.reload()
            })
          }, 500)
          Message.error('服务器内部错误')
          error.message = '网关错误'
          break
        case 503:
          error.message = '服务不可用'
          break
        case 504:
          error.message = '网关超时'
          break
        case 505:
          error.message = 'HTTP版本不受支持'
          break
        default:
          error.message = '连接服务器异常'
      }
      return error
    } else {
      if (removeP) {
        return
      }
      error.message = '连接服务器失败'
      Message.error('连接服务器失败')
      console.log(error.message)
    }
  }
)

export default service

2.2 使用封装的request

首先对接口进行分类,例如商品接口,src下新建api文件夹,新建goods.js
首先要引入封装的request,然后导出

// 引入封装的request
import request from '@/utils/request'

// 获取商品列表
export function getGoodsList(data) {
  return request({
    url: '/goods/list',
    method: 'get',
    data
  })
}

2.3 在组件中使用

// 首先按需引入使用的接口
import { getGoodsList } from "@/api/goods.js"

接口返回的是promise格式,可以用async await 或者.then.catch解析

// 然后在方法中直接使用
created() {
   this.getTableList()
},
methods: {
   getTableList() {
      let data= {
          page: 1,
          pagesize: 20
      }
      // 接口返回的时promise
      getGoodsList(data).then(res=>{
          if(res.code == 200) {
              this.tableData = res.data
          }
      }).catch(error => {
        console.log(error);
      })
   }

标签:case,axios,封装,请求,request,break,error,message,config
From: https://blog.csdn.net/qq_44401371/article/details/142599161

相关文章

  • Codesys3.5 封装库 和 库的调用
    1、库的建立第一步。 2、新建个文件夹,方便管理哦 3、然后在文件右键》添加对象中添加几个pou   4、随便建立几个。 4、设置工程信息,也就库信息哦双击工程信息弹出 5、最后就是生成库文件哦。   6、调用刚才的库,要新建一个工程哦。   7......
  • Selenium + Titanium代理获取请求的接口数据
    有一个采集数据的需求,分析了页面数据后发现列表有一个id,但是没有其他数据,打开详情并不是通过id,而是其他一个字段,这就说明通过selenium抓取页面数据还不行,还要接口返回的数据。这个时候就需要用到代理了,在代理层面把数据拦截下来,把自己想要的接口数据保存起来,然后通过页面找到的id......
  • 【CTF Web】Pikachu 反射型xss(get) Writeup(反射型XSS+GET请求)
    XSS(跨站脚本)概述Cross-SiteScripting简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:1.反射性XSS;2.存储型XSS;3.DOM型XSS;XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASPTOP10的排名中一直属于前三的江湖地位......
  • 【CTF Web】BUUCTF SQLi-LABS Page-1(Basic Challenges) Less-12 Writeup(SQL注入+POST
    sqli-labs1点击启动靶机。SQLi-LABSPage-1(BasicChallenges)解法随便提交一些数据。审查元素。<formaction=""name="form1"method="post"> <divstyle="margin-top:15px;height:30px;">Username:&nbsp;&nbsp;&......
  • C++ day02(函数、类和对象、封装、构造函数、析构函数)
    目录【1】函数1》内联函数inline 2》函数重载overload  3》函数的参数默认(缺省)值 4》哑元函数【2】类和对象1》类的定义 2》创建对象 【3】封装 【4】构造函数constructor1》基础使用2》构造初始化列表 3》构造函数的调用方式 4》拷贝构造函数1>概......
  • nginx转发请求后得到客户端真实IP地址
    Nginx和应用(springboot程序)部署到了同一个公网服务器。在访问应用时,需要得到客户端真实IP地址,需要配置nginx。server.location下配置:proxy_set_header X-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_heade......
  • 8、集成SpringSecurity安全框架---登录请求放行配置
    @ConfigurationpublicclassSecurityConfig{//创建BCryptPasswordEncoder注入容器,密码加密@BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}//登录时调用一次AuthenticationManager.authenticat......
  • [计算机网络]HTTP请求
    HTTP协议,建立在TCP连接基础之上的。HTTP是一种允许浏览器向服务器获取资源的协议,是Web的基础,通常由浏览器发起请求,用来获取不同类型的文件,例如HTML文件、CSS文件、JavaScript文件、图片、视频等。此外,HTTP也是浏览器使用最广的协议。HTTP请求发起流程当我们在浏览器......
  • 【可用】【一眼就会】Access-Control-Allow-Origin (CORS 头缺少 'Access-Control-Allo
    解决跨域问题有多种方式,很多文章都是千篇一律。没有实质性,没有给出具体解决方法。更可悲的是,官方给出的解决方案就是提示,解释是:“对于允许所有源的情况,可以设置Access-Control-Allow-Origin:*。如果要限制到特定的源,可以设置具体的域名,例如Access-Control-Allow-Origin:https:......
  • Echarts图表知识点汇总及请求django服务器后端跨域问题解决
    1.引入echartsvue3中通过npm引入:npminstallecharts--saveimport*asechartsfrom'echarts';//基于准备好的dom,初始化echarts实例varmyChart=echarts.init(document.getElementById('main'));//绘制图表myChart.setOption({title:{text:'ECha......