返回顶部
首页 > 资讯 > 前端开发 > JavaScript >在项目中封装axios的实战过程
  • 510
分享到

在项目中封装axios的实战过程

2024-04-02 19:04:59 510人浏览 泡泡鱼
摘要

目录前言axiOS封装的好处封装思路配置的优先顺序axios实例配置1、定义一些常规的配置2、请求前加一些我们需要的操作,3、请求返回后,添加拦截操作,请求接口方法统一管理最后放一下

前言

学习和做项目的时候经常会碰到axios,之前做的项目一般都是配置好axios,所以自己一直有个大概印象,最近有个机会自己可以手动配置axios,顺便记录分享一下~

axios封装的好处

axios封装的好处是统一处理,提高效率,便于维护。

你可以像下面一样这么使用axios请求接口


axios.get('Http://localhost:10086/user?ID=12345')
  .then(response => {
    //成功后的操作...
  })
  .catch(error => {
    //失败后的操作...
  });

但是当接口请求多起来,需求多起来的时候,在项目中每个需要接口请求的地方写一遍这样的代码,这样就会产生很多重复性的代码,降低我们的开发效率和提高维护成本。

封装思路

我们需要一次性集中配置axios,让配置适应我们项目的大部分场景。我们可以新建一个js文件,使用自定义配置新建一个 axios 实例,然后对实例进行基本配置,在请求前(请求体处理),请求后(返回的结果处理)等这些阶段添加一些我们需要的处理,然后将其导出使用。

配置的优先顺序

配置会以一个优先顺序进行合并。这个顺序是:在 lib/defaults.js 找到的库的默认值,然后是实例的 defaults 属性,最后是请求的 config 参数。(这样有些特殊的场景我们也可以单独处理)

node_modules文件夹下axios库文件下的lib/defaults.js。

自定义实例默认值


const instance = axios.create({
  baseURL: 'https://api.example.com'
});

请求的config参数


axios({   
method:'get',   
url:'http://bit.ly/2mTM3nY',   
responseType:'stream' }).then(function(response) {   response.data.pipe(fs.createWriteStream('ada_lovelace.jpg')) });

axios实例配置

1、定义一些常规的配置

设置BaseUrl

baseUrl一般有分为生产、开发、测试等多个地址,我们可以弄一个config.js进行存放,如果是VueReact我们可以新建env等文件进行存放,下面的baseUrl是使用react的环境变量的。

  • 设置timeout请求超时的时间
  • 设置数据请求的格式Content-Type(有 application/x-www-fORM-urlencoded、multipart/form-data、application/JSON...)等等

import axios from 'axios'

export const request = createAxiosInstance()

function createAxiosInstance () {
  const instance = axios.create({
    baseURL: process.env.REACT_APP_BASE_URL,
    timeout: 5000,
    headers: {
      // 可定义统一的请求头部
      post: {
        'Content-Type': 'application/json'
      }
      ...
    }
  })
  return instance
}

2、请求前加一些我们需要的操作,

比如需要在请求头里添加token

请求参数判空处理

(下图的例子传了空的name和personId,这种会引起歧义,究竟是要获取参数值为空还是忽略这些参数呢,有一些后端会进行一些处理,但前端还是尽量避免~)

每次接口请求时开启loading动画效果等等


  // 添加请求拦截器(在发送请求之前做些什么)
  instance.interceptors.request.use((config) => {
      //可添加开启loading效果的函数
      loading.open()  
      //token 存在就添加到请求头里
      token && (config.headers.Authorization = token)
     // 过滤请求参数中的 null undefined ''的函数
      cleanObject()
      return config
  })

3、请求返回后,添加拦截操作,

  • 处理成功返回的数据

比如后端返回的data数据可能嵌套了很多层,你可以直接返回你需要的data数据,这样业务代码就可以直接拿到最终的数据,而不用每次去解构之类的。

  • 统一处理失败后的异常报错

接口请求有成功也有失败,如果你不想在每写一个接口请求的时候都需要去写一遍失败的逻辑代码,并且几乎都是重复的时候,那你可以在这里集中进行接口的统一的异常处理。如判断状态码或后端自定义的code,并把后端返回的错误提示显示出来。


 // 添加响应拦截器(对响应数据做点什么)
  instance.interceptors.response.use((response) => {
   //可添加关闭loading效果的函数
      loading.close()  
      //解构出返回结果的数据
      const res = response.data
      //对自定义code码进行判断,将成功的数据返回出去
      const validateStatus = /^(2|3)\d{2}$/ //code为2或3开头的视作请求成功
      if (validateStatus.test(res.code)) {
        return res      //直接return出去我们需要的data
      }
      //判断失败的code码并作出提示等操作
      if (res.code === 401) {
        message.error(res.msg)
      } else {
        message.warning(res.msg)
      }
      return Promise.reject(res)
      },
      (error) => {
      loading.close() 
      if (error.response.status === 401) {
        message.error('token失效,请重新登录!')
        removeStorageToken()
        setTimeout(() => {
          window.location.href = '/login'
        }, 2000)
      } else {
        if (!window.navigator.onLine) {
          message.warning('网络异常,请检查网络是否正常连接')
        } else if (error.code === 'ECONNABORTED') {
          message.warning('请求超时')
        } else {
          message.warning('服务器异常,请联系管理员')
        }
      }
      return Promise.reject(error) // 将错误继续返回给到具体页面
    }
      )

上面有根据HTTP状态码和自定义code做的一些错误处理,这里进行了错误拦截后,页面进行业务接口调用的时候就不用再每次进行错误提示处理。当然要根据不同项目需求进行配置。

请求接口方法统一管理

一般我们会把所有的接口请求方法写在一起进行统一管理,后期更改的时候也方便查找维护。

我们可以新建一个管理api请求的文件夹(如apiList),里面放我们各种请求文件(这里按功能分)。如user.js就存放用户相关的请求,其他类推。然后页面就可以直接引用方法进行接口调用。


import { request } from '../axios'

// 获取用户信息
export function getUserInfo (userId) {
  return request.get(`/sys/user/info/${userId}`)
}

在组件或页面直接调用方法就可以了~

最后放一下完整的示例!大家可以参考一下~

这个示例配置适用于vue或react,当然每个项目的配置都会有些不同,小伙伴要根据自己项目进行修改配置和扩充~


import axios from 'axios'

export const request = createAxiosInstance()

function createAxiosInstance () {
  const instance = axios.create({
    baseURL: process.env.REACT_APP_BASE_URL,
    timeout: 5000,
    headers: {
      // 可定义统一的请求头部
      post: {
        'Content-Type': 'application/json'
      }
      ...
    }
  })
   // 添加请求拦截器(在发送请求之前做些什么)
  instance.interceptors.request.use((config) => {
      //可添加开启loading效果的函数
      loading.open()  
      //token 存在就添加到请求头里
      token && (config.headers.Authorization = token)
     // 过滤请求参数中的 null undefined ''的函数
      cleanObject()
      return config
  })
  // 添加响应拦截器(对响应数据做点什么)
  instance.interceptors.response.use((response) => {
   //可添加关闭loading效果的函数
      loading.close()  
      //解构出返回结果的数据
      const res = response.data
      //对自定义code码进行判断,将成功的数据返回出去
      const validateStatus = /^(2|3)\d{2}$/ //code为2或3开头的视作请求成功
      if (validateStatus.test(res.code)) {
        return res
      }
      //判断失败的code码并作出提示等操作
      if (res.code === 401) {
        message.error(res.msg)
      } else {
        message.warning(res.msg)
      }
      return Promise.reject(res)
      },
      (error) => {
      loading.close()  //可添加关闭loading效果的函数
      if (error.response.status === 401) {
        message.error('token失效,请重新登录!')
        removeStorageToken()
        setTimeout(() => {
          window.location.href = '/login'
        }, 2000)
      } else {
        if (!window.navigator.onLine) {
          message.warning('网络异常,请检查网络是否正常连接')
        } else if (error.code === 'ECONNABORTED') {
          message.warning('请求超时')
        } else {
          message.warning('服务器异常,请联系管理员')
        }
      }
      return Promise.reject(error) // 将错误继续返回给到具体页面
    }
      )
  
  return instance
}

总结

到此这篇关于在项目中封装axios的文章就介绍到这了,更多相关项目中封装axios内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 在项目中封装axios的实战过程

本文链接: https://lsjlt.com/news/136241.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 在项目中封装axios的实战过程
    目录前言axios封装的好处封装思路配置的优先顺序axios实例配置1、定义一些常规的配置2、请求前加一些我们需要的操作,3、请求返回后,添加拦截操作,请求接口方法统一管理最后放一下...
    99+
    2024-04-02
  • Axios在vue项目中的封装步骤
    目录1. 什么是Axios?2. 回顾Ajax3. 回顾Promise4. Vue封装Axios1. 什么是Axios? Axios 是一个基于 promise 的网络请求库,可以用...
    99+
    2024-04-02
  • vue项目使用axios封装request请求的过程
    目录一、封装axios二、封装api 函数三、页面中使用一、封装axios 1.src 目录中新建utils文件夹2.utils文件中建立request.js文件 request....
    99+
    2023-05-17
    vue axios封装request请求 vue axios封装请求
  • 项目中Axios二次封装实例Demo
    1.为什么做封装? 方便代码整体调用、对请求做公共处理、个性化定制 2.别人已经封装了很多,为什么不直接修改使用? 封装思路不适合自身项目 封装后调用不方便 3....
    99+
    2024-04-02
  • vue项目中axios的封装请求
    目录一、简介二、封装后1.封装步骤2.封装目标3. 使用新的 axios 封装API4.使用封装后的axios一、简介 axios 是一个轻量的HTTP客户端,它基于 XMLHttp...
    99+
    2024-04-02
  • Vue项目中封装axios的方法
    目录一、axios是什么特性基本使用二、为什么要封装三、如何封装设置接口请求前缀设置请求头与超时时间封装请求方法请求拦截器响应拦截器小结参考文献一、axios是什么 axios 是...
    99+
    2024-04-02
  • 项目中使用Typescript封装axios
    目录写在前面基础封装拦截器封装类拦截器实例拦截器接口拦截封装请求方法取消请求准备工作取消请求方法的添加与删除取消请求方法测试测试请求方法测试取消请求写在最后写在前面 虽然说Fetch...
    99+
    2024-04-02
  • Vue项目中如何封装axios
    本文小编为大家详细介绍“Vue项目中如何封装axios”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue项目中如何封装axios”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、axios是什么axios 是...
    99+
    2023-06-30
  • 如何在vue项目中使用封装后的axios
    这篇文章给大家介绍如何在vue项目中使用封装后的axios,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。为什么要使用VueVue是一款友好的、多用途且高性能的JavaScript框架,使用vue可以创建可维护性和可测试...
    99+
    2023-06-06
  • vue3项目中封装axios的示例代码
    目录axios的基本使用axios.all()方法axios一些基本配置axios的拦截器封装axios-封装基础属性封装拦截器封装公用的拦截器对单个请求传入拦截器对request请...
    99+
    2022-12-19
    vue3封装axios vue3项目中封装axios vue封装axios
  • 项目中Axios二次封装的示例分析
    这篇文章主要介绍项目中Axios二次封装的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.为什么做封装?方便代码整体调用、对请求做公共处理、个性化定制2.别人已经封装了很多,为什么不直接修改使用?封装思路不...
    99+
    2023-06-15
  • vue项目中axios封装请求的示例分析
    小编给大家分享一下vue项目中axios封装请求的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、简介axios 是一个轻量的HTTP客户端,它基于 XMLHttpRequest 服务来执行 HTTP 请求,支持...
    99+
    2023-06-29
  • vue开发中关于axios的封装过程
    目录关于axios的封装vue中axios全局封装axios封装api的统一管理关于axios的封装 下面代码参考了 vue-element-admin 中的封装方式,request...
    99+
    2022-11-13
    vue axios封装 关于axios的封装 axios的封装
  • vue3实战教程之axios的封装和环境变量
    目录axios基本使用配置封装请求时添加loading环境变量总结axios axios: ajax i/o system. 一个可以同时在浏览器和node环境进行网络请求的第三方库...
    99+
    2024-04-02
  • Vue项目之ES6装饰器在项目实战中的应用
    目录前言装饰模式(Decorator)ES6 装饰器装饰器应用ValidateCatchErrorConfirmation总结参考前言 在面向对象(OOP)的设计模式中,装饰器的应用...
    99+
    2024-04-02
  • React项目中axios的封装与API接口的管理详解
    目录前言 安装 引入 环境的切换 请求拦截 响应拦截 api的统一管理 总结前言 在react项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的...
    99+
    2024-04-02
  • Vue项目中如何封装axios(统一管理http请求)
    1、需求说明 在使用Vue.js框架开发前端项目时,会经常发送ajax请求服务端接口,在开发过程中,需要对axios进一步封装,方便在项目中的使用。 2、Vue项目结构 在本地创...
    99+
    2024-04-02
  • ts封装axios并处理返回值的实战案例
    目录src下新建所需文件夹及对应文件,如下图设置api.ts,假设如下设置http.ts设置axios.ts最终效果结束本项目的案例是针对vue3 准备vue3+ts+axios的项...
    99+
    2022-11-13
    axios ts封装 封装axios及使用
  • Node.js+Express+Vue+MySQL+axios的项目搭建全过程
    目录1 基本搭建1.1 vue脚手架安装1.2 在创建好的项目中创建server文件夹1.3 编写前端界面1.4 启动服务测试2 axios的使用axios安装和使用配置proxy进...
    99+
    2022-12-08
    Node.js项目搭建 Vue项目搭建 Express项目搭建
  • 如何在java项目组中进行封装
    今天就跟大家聊聊有关如何在java项目组中进行封装,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。java 中的封装介绍及使用方法在面向对象程式设计方法中,封装(英语:Encapsul...
    99+
    2023-05-31
    java ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作