Vue 封装axios

【一】准备工作

(1)安装必要插件

  • 安装Axios,这是必要的。默认最新版
npm install axios -S
或 
cnpm install axios -S
  • 安装elementui-plus,用于提示信息
npm install element-plus --save
# 或
cnpm install element-plus --save
  • 安装vue-router,用于路由跳转
npm install  vue-router@4 -S
# 或者  
cnpm install  vue-router@4 -S
  • 其他插件,视开发情况自己决定,这是我目前安装的版本

image-20240511191626912

  • 最后在入口文件(main.js)中注册这些插件
import {createApp} from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from "element-plus";
import 'element-plus/dist/index.css'

createApp(App).use(ElementPlus).use(router).mount('#app')

(2)后端返回数据格式统一

  • 后端正常返回信息格式
    • 有一个必要的code:标识响应成功与否,这了规定成功是100,失败是其他的
    • 有一个msg:无论成功与否,返回描述信息
    • results或result:
      • 返回多条信息,那么就是results,一个列表套字典(对前端来说是数组套对象)
      • 返回单条信息,那么就是result,一个字典格式(对前端来说是对象)
      • 当然也可以没有这个字段信息
    • 其他信息字段
{
    "code": 100,
    "msg": "信息",
    "results": [
        {
            "id": 1,
            "name": "bruce"
        },
        {
            "id": 2,
            "name": "lucy"
        }
    ]
}

image-20240511193341608

【二】封装axios

(1)分部分讲解

  • 导入模块,指定基础路由
    • axios是肯定要导入的模块
    • router用于路由跳转
    • ElMessage用于信息提示
import axios from "axios";
import {ElMessage} from 'element-plus'


axios.defaults.baseURL = "http://localhost:8000/"
  • 创建请求对象,指定超时时间,指定编码格式
    • 创建请求对象,叫做request
    • 指定访问超时时间为5s:timeout: 5000
    • 指定请求头中的编码格式:
      • headers: {'Content-Type': "application/json; charset=utf-8"}
const request = axios.create({ 
    timeout: 5000,
    headers: {
        'Content-Type': "application/json; charset=utf-8"
    }
})
  • 请求发出前拦截器
    • 部分信息页面肯定是需要登录才可以查看的,即需要携带token信息
    • 指定请求头携带token信息,
    • 首先从本地会话中获取token,然后拼接指定的格式(这是jwt认证,所以要拼接一下)
request.interceptors.request.use(config => {
    const token = localStorage.getItem("token")
    if (token) {
        config.headers['Authorization'] = "Bearer " + token
    }
    return config
})
  • 请求响应拦截部分

    • 首先后端的返回数据应该是满足一定格式,这个在准备工作中说过了

    • 返回的code如果是100,那么就是成功了,所以正常返回数据信息即可

    • 如果返回code不是100,那么就是失败了

    • 再就是其他错误了,这个都是不正常的返回数据信息格式

request.interceptors.response.use(
    response => {
        let res = response.data
        if (res.code === 100) {
            return response.data
        } else {
            // ElMessage.error(!res.msg ? '请求服务器异常,请联系管理员' : res.msg)
            return Promise.reject(!res.msg ? '请求服务器异常,请联系管理员' : res.msg)
        }
    },
    error => {
        let errorMessage;
        if (error.response && error.response.data.msg) {
            errorMessage = error.response.data.msg
        } else if (error.message) {
            errorMessage = error.message; // 使用axios的默认错误消息
        } else {
            errorMessage = '未知错误'; // 如果以上都不满足,给出默认消息
        }

        ElMessage.error(errorMessage, ); // 显示错误消息
        return Promise.reject(error); // 拒绝这个promise并返回原始错误对象
    }
)

(2)整体代码

  • src目录下创建一个http文件夹,在文件夹内创建一个index.js文件(方便导入)
  • 写入如下代码
import axios from "axios";
import {ElMessage} from 'element-plus'


axios.defaults.baseURL = "http://127.0.0.1:8000/api/v1/"


const request = axios.create({
    timeout: 5000,
    headers: {
        'Content-Type': "application/json; charset=utf-8"
    }
})

request.interceptors.request.use(config => {
    const token = localStorage.getItem("token")
    if (token) {
        config.headers['Authorization'] = "Bearer " + token
    }
    return config
})


request.interceptors.response.use(
    response => {
        let res = response.data
        if (res.code === 100) {
            return response.data
        } else {
            // ElMessage.error(!res.msg ? '请求服务器异常,请联系管理员' : res.msg)
            return Promise.reject(!res.msg ? '请求服务器异常,请联系管理员' : res.msg)
        }
    },
    error => {
        let errorMessage;
        if (error.response && error.response.data.msg) {
            errorMessage = error.response.data.msg
        } else if (error.message) {
            errorMessage = error.message;
        } else {
            errorMessage = '未知错误';
        }

        ElMessage.error(errorMessage);
        return Promise.reject(error);
    }
)

export default request

【三】使用

(1)选项式API风格(很少用)

  • 这种方式是较为少见的,但是还是简单写一下
    • 首先在入口文件(main.js)中,创建一个插件来设置全局的axios的实例
import axios from './http'

const axiosPlugin = {
    install(app, options) {
        app.config.globalProperties.$axios = axios; // 在 Vue 3 中设置全局属性
    }
}

createApp(App).use(ElementPlus).use(axiosPlugin).use(router).mount('#app')

  • 测试代码
    • 随便写一个HomeView.vue
<script>
export default {
  name: "HomeView",
  created() {
    this.testRes()
  },
  methods: {
    testRes() {
      this.$axios({
        method: 'get',
        url: 'user/test_response/'
      }).then((response) => {
        console.log(response)
      })

    },

  }
}
</script>

image-20240512140231775

(2)组合式API风格(推荐)

  • 这个就简单的多
    • 不需要再入口文件(main.js)中创建插件来全局设置
    • 哪里需要在哪里使用即可
    • 同样的在HomeView.vue中测试
<script setup>
import request from "../http/index.js";

request({
  method: "get",
  url: "user/test_response/",
}).then(res => console.log(res))

</script>

image-20240512140653057

  • 测试一下token能否正常携带
    • 在代码中添加一行
      • localStorage.setItem('token','sssss.ssss.sss')
    • 键是token,值无所谓,只是测试而已
<script setup>
import request from "../http/index.js";
localStorage.setItem('token','sssss.ssss.sss')
request({
  method: "get",
  url: "user/test_response/",
}).then(res => console.log(res))

</script>
  • 首先查看LocalStorage中是否添加成功

    • image-20240512141303865
  • 在检查发送的请求中是否携带上了token

    • image-20240512141332499

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/626346.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LangChain 核心模块学习 模型输入 Prompts

模型输入 Prompts 一个语言模型的提示是用户提供的一组指令或输入&#xff0c;用于引导模型的响应&#xff0c;帮助它理解上下文并生成相关和连贯的基于语言的输出&#xff0c;例如回答问题、完成句子或进行对话。 提示模板&#xff08;Prompt Templates&#xff09;&#xf…

洁太司检测试剂盒:肝癌早诊新利器,共筑健康未来

随着科技进步及医疗技术的不断创新&#xff0c;人类对疾病的早期诊断和治疗提出了更高的要求。 先思达生物近期推出的“洁太司-寡糖链检测试剂盒”&#xff0c;在原发性肝细胞癌的诊断领域实现了重大突破&#xff0c;获得了国家药品监督管理局&#xff08;NMPA&#xff09;的三…

JavaScript精粹(一)

JavaScript&#xff08;简称为JS&#xff09;是一种广泛应用于网页开发的脚本语言&#xff0c;具有以下几个主要作用&#xff1a; 网页交互&#xff1a;JavaScript 可以用于创建动态的网页效果&#xff0c;例如响应用户的操作&#xff0c;实现页面内容的动态更新&#xff0c;以…

JAVA云his医院管理系统源码(如何解决传统HIS的弊端、在医院管理中的具体应用场景有哪些)

开发技术&#xff1a; 前端&#xff1a;AngularNginx&#xff1b; 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus等&#xff1b; 数据库&#xff1a;MySQL MyCat&#xff1b; 基于云计算技术…

FreeRTOS事件标志组

目录 一、事件标志组的概念 1、事件标志位 2、事件标志组 二、事件标志组相关API 1、创建事件标志组 2、设置事件标志位 3、清除事件标志位 4、等待事件标志位 三、事件标志组实操 1、实验需求 2、CubeMX配置 3、代码实现 一、事件标志组的概念 1、事件标志位 表…

【Windows】回忆Win98

回忆Win98&#xff0c;又看到了这个Excel界面&#xff0c;上次还是十多年前的计算机课上 1、安装环境 Win11家庭版,23H2,VMware Workstation Pro 16 , 2、安装步骤及参考 虚拟机里的硬盘设置成SATA&#xff08;否则各种错误&#xff09;&#xff0c;安装MSDOS7.1&#xff…

【Java 演示灵活导出数据】

演示灵活导出数据 &#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;&#x1f389;【小吴小吴bug全无开通公众号】关注公众号获取第一时间博客动态 背景今天临时起兴打开稀土掘金导航栏看到页面推广gitee项目恰巧最近也在学习python了解到python爬虫很厉害&…

eNSP PRO全面安装教程来了(文末附下载方式)

华为eNSP PRO已经全面开放了&#xff0c;这意味着用户可以自由地访问和使用这个模拟器&#xff0c;来进行以下活动&#xff1a; 「学习和培训」&#xff1a;对于正在准备华为认证&#xff08;如HCIA、HCIP、HCIE&#xff09;的专业人士来说&#xff0c;eNSP PRO提供了一个实际…

129.哈希表:有效的字母异位词(力扣)

242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码解决以及思路 这个方法的时间复杂度为O(N)&#xff0c;其中N是字符串的长度&#xff0c;空间复杂度为O(1)&#xff08;因为辅助数组的大小是固定的26&#xff09;。 class Solution { public:bo…

MySQL、JDBC复盘及规划

数据库仍有习题尚未做完&#xff0c;策略从一天做完改为每天5到10题&#xff0c;以此达到掌握和复习的效果&#xff0c;JDBC的六部仍需每天练习&#xff0c;从明天开始正式进行JavaWeb的学习&#xff0c;预计持续到七月中旬&#xff0c;还会完成一个书城项目&#xff0c;六月底…

听说SOLIDWORKS科研版可以节约研发成本?

近几年来&#xff0c;政府越来越重视科研带动产业&#xff0c;绩效优良的产业技术研究院对于国家和地区的学术成果转化、技术创新、产业发展等具有不可忽视的促进和带动作用。研究院会承担众多新产业的基础研究工作&#xff0c;而常规的基础研究需要长期的积累&#xff0c;每个…

虚拟化软件栈面临的安全威胁主要涉及几个方面

1.基于虚拟层&#xff08;Hypervisor&#xff09;的攻击&#xff1a;VM Escape&#xff1a;攻击者利用虚拟化软件允许多个操作系统共享单个硬件处理器的漏洞。这使得黑客可以在受控制的虚拟层上攻击宿主机上的每个虚拟机。 VM sprawl&#xff1a;当网络上的虚拟机数量超过管理…

(done) 关于 pytorch 代码里常出现的 batch_first 到底是啥?

参考文章&#xff1a;https://pytorch.org/docs/stable/generated/torch.nn.utils.rnn.pad_sequence.html 首先看参考文章里的解释&#xff0c;如下图 从文章描述来看&#xff0c;当 batch_first True 时&#xff0c;输出的张量的 size 是 B x T x *。当 batch_first False…

Vue实战技巧 —— 企业开发实战中的常见疑难问题

Vue企业开发实战中的常见疑难问题 1. 解决Vue动态路由参数变化&#xff0c;页面数据不更新2. vue组件里定时器销毁问题3. vue实现按需加载组件的两种方式4. 组件之间&#xff0c;父子组件之间的通信方案5. Vue中获取当前父元素&#xff0c;子元素&#xff0c;兄弟元素6. 开发环…

JVM 双亲委派机制详解

文章目录 1. 双亲委派机制2. 证明3. 优势与劣势 1. 双亲委派机制 类加载器用来把类加载到 Java 虚拟机中。从JDK1.2版本开始&#xff0c;类的加载过程采用双亲委派机制&#xff0c;这种机制能更好地保证 Java 平台的安全。 1.定义 如果一个类加载器在接到加载类的请求时&…

最新极空间部署iCloudpd教程,实现自动同步iCloud照片到NAS硬盘

【iPhone福利】最新极空间部署iCloudpd教程&#xff0c;实现自动同步iCloud照片到NAS硬盘 哈喽小伙伴们好&#xff0c;我是Stark-C~ 我记得我前年的时候发过一篇群晖使用Docker部署iCloudpd容器来实现自动同步iCloud照片的教程&#xff0c;当时热度还很高&#xff0c;可见大家…

MySQL旧表做分区流程

1. 为什么做分区 数据库分区是将数据库中的数据划分成独立的部分&#xff0c;每个部分称为一个分区。分区可以根据特定的标准&#xff0c;如范围、列表或哈希值&#xff0c;将数据分隔到不同的物理存储位置中。数据库表分区可以在多种情况下提供显著的好处。以下是一些应该考虑…

如何对基本公共服务均等化进行统计监测

党的十九大指出“履行好政府再分配调节职能&#xff0c;加快推进基本公共服务均等化&#xff0c;缩小收入分配差距”&#xff0c;提出到2035年基本公共服务均等化基本实现。国务院相继于2012年和2017年发布了《国家基本公共服务体系“十二五”规划》和《“十三五”推进基本公共…

Windows里使用ollama本地大模型部署

下载 ollama官网进行下载 下载完后下一步下一步即可 安装完成后验证是否成功&#xff0c;打开命令行输入ollama&#xff0c;有该指令即安装成功 环境变量配置 配置模型下载位置 看自己电脑硬盘情况配置 打开所有ip接口访问权限 如果想要远程调用ollama接口&#xff0c;…

Output directory is not specified

场景&#xff1a;从GitHub拉取Java项目使用IDEA打开运行的时候抛出 java: 写入com.common.exception.ChatException时出错: Output directory is not specified网上大部分是说在项目结构增加编译器输出路径&#xff0c;但我在实际开发的项目的时候这里为空&#xff0c;包括我加…