个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios

这篇具有很好参考价值的文章主要介绍了个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在上文中,我们封装了统一的后端数据返回结果,有了标准化的接口数据,我们就可以针对它,在前端发送接收时,进行预处理。

通常在一个企业级或者个人开源的项目中,Axios会被二次封装。

二次封装的好处有哪些呢?

  1. 统一 url 配置
  2. 统一 api 请求
  3. request (请求)拦截器,例如:带上token等,设置请求头
  4. response (响应)拦截器,例如:统一错误处理,页面重定向等
  5. 统一处理http错误码code错误码

新建axiosUtil.js 文件

话不多说,我们直接开始吧!

创建src\utils\axiosUtil.js

这个文件就是用来封装Axios,我们想要在其他文件中使用Axios,这里我们就需要创建并抛出一个Axios实例。

import axios from 'axios'
import { ElMessage , ElNotification  } from 'element-plus'

let axiosUtil = axios.create({
})

export default axiosUtil;

接下来,我们就开始进行配置。打开http://axios-js.com/zh-cn/docs/index.html#请求配置查看Axios提供的配置项。

基本配置

统一URL

首先,我们需要配置的是统一的请求接口。我们在测试test接口时直接使用AxiosGET请求http://localhost:8080/test,这里的http://localhost:8080/就是一个统一的Url。

个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios

let axiosUtil = axios.create({
    baseURL:'http://localhost:8080',
})

有了这个baseURL在发送post请求的时候,就不需要加上http://localhost:8080/,Axios会自动给我们加上!!!

.env文件与环境变量

但是http://localhost:8080/这个只是本地测试的接口,我们还有服务器测试接口,上线后的接口。针对不同接口,我们每次都需要修改,是一件很麻烦的事情,还好我们使用的是Vite作为的辅助开发工具。

Vite 使用 dotenv 从你的 环境目录 中的下列文件加载额外的环境变量:

.env                # 所有情况下都会加载
.env.local          # 所有情况下都会加载,但会被 git 忽略
.env.[mode]         # 只在指定模式下加载
.env.[mode].local   # 只在指定模式下加载,但会被 git 忽略

这里的模式通常包含:

  • test 测试
  • development 开发
  • production 生产
  • staging 预发布
  • 其他

也就是说我们需要在根目录下新建对应的**.env**文件

  • .env.test
  • .env.development
  • .env.production
  • .env.staging

大家打开package.json文件,会看到以下命令

 "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },

当我们在命令行执行yarn dev yarn run dev,其实是执行vite

默认情况下,dev 命令 运行在 development (开发) 模式,而 build 命令和preview命令则运行在 production (生产) 模式。

 "scripts": {
    "dev": "vite --mode development",
    "build": "vite build --mode production",
    "preview": "vite preview --mode production "
  },

在**.env**文件中,我们可以编写额外的环境变量。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露给经过 vite 处理的代码。

例如:

VITE_APP_TITLE= 个人博客
VITE_APP_BASE_API= 'http://localhost:8080'

当我们执行命令的时候,Vite 暴露环境变量到一个特殊的 import.meta.env 对象上。我们可以通过这个对象来获取编写的环境变量。

个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios

示例

新建.env文件

VITE_APP_TITLE= 个人博客
VITE_APP_BASE_API= 'http://localhost:8080'

我们刚才说了,import.meta.env挂着我们编写的环境变量。

我们修改axiosUtils

let axiosInstance = axios.create({
   baseURL:import.meta.env.VITE_APP_BASE_API,
})

参考资料

https://cn.vitejs.dev/guide/env-and-mode.html#env-variables

请求头

我们后端支持支持什么格式的数据,这里就可以指定具体的Content-type。我们这个项目就指定json即可

import axios from 'axios'
import { ElMessage , ElNotification  } from 'element-plus'

import axios from "axios"
let axiosUtil = axios.create({
    baseURL:import.meta.env.VITE_APP_BASE_API,
    headers:{
        "Content-type":"application/json"
    }
})

超时时间

一个请求超过一段时间自动停止。

import axios from 'axios'
import { ElMessage , ElNotification  } from 'element-plus'

let axiosUtil = axios.create({
    baseURL:import.meta.env.VITE_APP_BASE_API,
    headers:{
        "Content-type":"application/json"
    }
    timeout: 10000,
})

    

request 拦截器

在请求发出之前,抽离出共同的方法。

例如 对于所有的psot请求,我们可能需要去进行序列化参数(后端要求序列化的参数),

又例如,我们发送的请求是错误的,我们要如何处理。

又又例如:我们的请求接口是需要token的,但是登录的接口不需要,此时我们在请求时就需要拦截,给除了登录接口之外的其他接口加上token。

参考官网的写法http://axios-js.com/zh-cn/docs/index.html#%E6%8B%A6%E6%88%AA%E5%99%A8

例如,我们使用的restful风格的接口,我们需要将get请求的参数拼接到URL上,那我们就可以在发送请求之前进行拼接。

// request拦截器
axiosUtil.interceptors.request.use(config => {

    // get请求映射params参数
    if (config.method === 'get' && config.params) {
        let url = config.url + '?';
        for (const propName of Object.keys(config.params)) {
            const value = config.params[propName];
            const part = encodeURIComponent(propName) + '='
            if (value !== null && typeof (value) !== "undefined") {
                if (typeof value === 'object') {
                    for (const key of Object.keys(value)) {
                        let params = propName + '[' + key + ']';
                        const subPart = encodeURIComponent(params) + '='
                        url += subPart + encodeURIComponent(value[key]) + "&";
                    }
                } else {
                    url += part + encodeURIComponent(value) + "&";
                }
            }
        }
        url = url.slice(0, -1);
        config.params = {};
        config.url = url;
    }
    return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

response 拦截器

在接收到请求之后,抽离出共同的方法。

例如: 接口400怎么办,接口500怎么办!

又例如 :接收到的数据怎么办!

axiosUtil.interceptors.response.use(async res => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const msg = res.data.msg 
    if (code === 500) {
        ElMessage ({
            message: msg,
            type: 'error'
        })
        return Promise.reject(new Error(msg))
    } else if (code = 401) {
        // TODO 
        console.log("重新登录,重定向登录页面")
        return Promise.reject('error')
    } else if (code !== 200) {

        ElNotification .error({
            title: msg
        })

        return Promise.reject('error')
    } else {
        return res.data
    }
}, error => {
    console.log('err' + error)
    let { message } = error;
    if (message === "Network Error") {
        message = "后端接口连接异常";
    } else if (message.includes("timeout")) {
        message = "系统接口请求超时";
    } else if (message.includes("Request failed with status code")) {
        message = "系统接口" + message.substr(message.length - 3) + "异常";
    }
    ElMessage ({
        message: message,
        type: 'error',
        duration: 5 * 1000
    })
    return Promise.reject(error)
}
)

统一Api管理

对于同一个模块的请求我们通常是放在封装在一个文件夹里。例如这里的测试,我会新建src\api\test.js文件。

在这个文件里,编写涉及到测试的增删改查接口。

import axiosUtil from '../utils/axiosUtil.js'

class TestApi{
    create(data){
        console.log(data)
        return axiosUtil.get('/test')
    }
    delete(data){
        // 方法体内
	}
    
}
export default new TestApi();

测试

src/App.vue我们重写reqTest方法。

 import TestApi from './api/test'
 
const reqTest = () => {
  TestApi.create().then(function (response) {
      console.log(response);
    })
    .catch(function (error) {
      console.log(error);
    });
}

不启动后端,直接在前后发送请求,10000毫秒之后会弹出后端接口连接异常的消息

个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios文章来源地址https://www.toymoban.com/news/detail-462796.html

到了这里,关于个人博客-SpringBoot+Vue3项目实战(6)- 二次封装Axios的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3组件二次封装Ui处理

    在Vue开发中,我们常常需要使用UI框架提供的组件。但是UI框架的组件可能并不符合我们的需求,这时候就需要进行二次封装。下面是一些关于Vue组件二次封装Ui处理的技巧: 子组件代码: 父组件使用: 如果使用props接收弊端: 基本上组件不会只有一两个属性,属性多的话接

    2023年04月14日
    浏览(82)
  • 自动化项目实战 [个人博客系统]

    效验第一篇博客 不是 “自动化测试” 退出到登录页面,用户名密码为空

    2024年02月08日
    浏览(52)
  • Vue3和TypeScript下基于Axios的二次封装教程

    学习如何在Vue3项目中使用TypeScript和Axios进行二次封装,实现更灵活的网络请求处理。详细教程包括拦截器设置和类型扩展。

    2024年02月05日
    浏览(136)
  • vue3富文本编辑器的二次封装开发-Tinymce

    欢迎点击领取 -《前端开发面试题进阶秘籍》:前端登顶之巅-最全面的前端知识点梳理总结 专享链接 简介 1、安装:pnpm add tinymce @tinymce/tinymce-vue === Vue3 + tinymce + @tinymce/tinymce-vue 2、功能实现图片上传、基金卡片插入、收益卡片插入、源代码复用、最大长度限制、自定义表情包

    2024年02月07日
    浏览(68)
  • vue3+ts+elementui-plus二次封装树形表格

    复制粘贴即可: 一、定义table组件

    2024年02月15日
    浏览(41)
  • vue3+ts+elementui-plus二次封装弹框

    一、弹框组件BaseDialog

    2024年02月15日
    浏览(49)
  • 基于Vant组件库二次封装组件(TS+Vue3.x环境)

    1. 今天的需求是封装一个 Navigation Bar 导航栏组件,目的是给到App几乎所有的页面复用:      2. 因为之前的项目里使用过Vant组件库,笔者第一时间想到了Vant组件库中的 NavBar 组件,和当前App的需求匹配度很高。Vant组件库的 NavBar 组件: 3. 相信你也发现了,Vant组件库默认主题

    2023年04月18日
    浏览(53)
  • Vue电商项目--axios二次封装

    刚刚经过postman工具测试,发现接口果然发生了改变。 新的接口为 http://gmall-h5-api.atguigu.cn   如果服务器返回的数据code字段200,代表服务器返回数据成功 整个项目,接口前缀都有/api字样 XmlHttpRequest,fetch,JQ,Axios这些都是很优秀的网络请求库 为什么需要进行二次封装axios? 请

    2024年02月01日
    浏览(50)
  • vue3 element-plus el-form的二次封装

    form表单的二次封装 vue3 element-plus el-form的二次封装 属性名 类型 默认值 说明 data Array [] 页面展示数据内容 onChange Function false 表单事件 bindProps Object {} 表单属性 formRef Object {} 表单ref ruleForm Object {} 数据

    2024年02月13日
    浏览(73)
  • Vue项目中axios的二次封装

    Vue 项目使用过程中一般会对 axios 进行二次封装, 以期在合适的时机处理一些全局的需求, 比如常见的 请求拦截器 和 响应拦截器. 接下来简单聊聊具体的操作步骤. 执行以下指令: 在 src 文件夹下创建 api 文件夹, 并创建 index.js、axios.js 和 users.js 文件. index.js 文件的作用的将当前

    2024年01月19日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包