Vue 封装axios

news2024/12/23 0:55:21

【一】准备工作

(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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Selenium自动操作鼠标的方法及示例(鼠标左右键单击、左键双击、拖动等)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

五分钟“手撕”时间复杂度与空间复杂度

目录 一、算法效率 什么是算法 如何衡量一个算法的好坏 算法效率 二、时间复杂度 时间复杂度的概念 大O的渐进表示法 推导大O阶方法 常见时间复杂度计算举例 三、空间复杂度 常见时间复杂度计算举例 一、算法效率 什么是算法 算法(Algorithm)&#xff1a;就是定…

BakedSDF: Meshing Neural SDFs for Real-Time View Synthesis 论文阅读

&#xff08;水一篇博客&#xff09; 项目主页 BakedSDF: Meshing Neural SDFs for Real-Time View Synthesis 作者介绍 是 Mildenhall 和 Barron 参与的工作&#xff08;都是谷歌的&#xff09;&#xff0c;同时一作是 Lipman 的学生&#xff0c;VolSDF 的一作。本文引用…

234.回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;head …

项目管理-案例重点知识(风险管理)

项目管理 : 每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 二、风险管理 案例重点 重点内容&#xff1a; &#xff08;1&#xff09;风险划分 &#xff08;2&#xff09;SWOT 分析&#xff0c;提示清单 …

5.10.10 用于图像识别的深度残差学习

1. 介绍 深度卷积神经网络为图像分类带来了一系列突破。深度网络自然地以端到端的多层方式集成低/中/高级特征和分类器&#xff0c;并且特征的“级别”可以通过堆叠层的数量&#xff08;深度&#xff09;来丰富。 学习更好的网络是否像堆叠更多层一样容易&#xff1f; 这个问…

RK3568平台开发系列讲解(SPI篇)SPI数据的传输

🚀返回专栏总目录 文章目录 一、数据结构1.1、spi_transfer 结构体1.2、spi_message二、数据发送程序分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 参考资料: spi_transferspi_message一、数据结构 spi 数据传输主要使用了 spi_message 和 spi_transfer 结构…

【计网】TCP中的滑动窗口

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 工作原理如下&#xff1a; 结语 我的其他博客 正文 TCP&#xff08;传输控制协议&#xff09;中的滑动窗口是一种用于流量控制和拥…

数字集成电路物理设计[陈春章]——知识总结与精炼01

第一章 集成电路物理设计方法 1.1 数字集成电路设计挑战 1.2 数字集成电路设计流程 前两节内容讲述的是数字集成电路发展与流程&#xff0c;知识体系比较宏观和简单&#xff0c;请读者自行了解即可。 1.3 数字集成电路设计收敛 实现设计收敛任务&#xff1a;①数据系统;②优…

SQL——SERVER的建表主要操作

目录 一&#xff1a;数据存储问题 1.表的相关数据 2.表&#xff0c;字段&#xff0c;记录 二&#xff1a;建表 1.创建表头 2. 数据类型 3.保存数据 4.数据冗余 5.使用命令重置表 7.设置主键 一&#xff1a;数据存储问题 1.表的相关数据 表是数据库的基本单位&…

FreeRTOS学习 -- 列表和列表项

列表和列表项是 FreeRTOS 的一个数据结构&#xff0c;FreeRTOS 大量使用到了列表和列表项。 一、什么是列表和列表项 1、列表 列表是 FreeRTOS 中的一个数据结构&#xff0c;被用来跟踪 FreeRTOS 中的任务。与列表相关的全部东西都在文件 list.c 和 list.h中。 List_t 结构体…

web入门——导航栏

本专栏内容代码来自《响应式web&#xff08;HTML5CSS3Bootstrap&#xff09;》教材。 导航栏 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

【JavaEE】Spring Web MVC入门:掌握Spring的MVC框架基础

目录 Spring Web MVC什么是Spring Web MVCMVC 定义什么是Spring MVC 学习Spring MVC1. 项目准备2. 建立连接 Spring Web MVC 什么是Spring Web MVC 官⽅对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从⼀…

2024年小学生古诗文大会备考:吃透历年真题和知识点(持续)

根据往年的安排&#xff0c;2024年小学生古诗文大会预计这个月就将启动。该如何备考2024年小学生古诗文大会呢&#xff1f;根据往期的经验&#xff0c;只要吃透这些真题和背后的知识点&#xff0c;通过上海小学生古诗文大会的初选&#xff08;初赛&#xff09;一点问题都没有。…

【并发程序设计】4. exec函数族

4.exec函数族 exec函数族是一组用于在进程中启动另一个程序来替换当前进程的函数。 exec函数族主要用于在当前进程内部执行一个新的程序&#xff0c;而不会创建新的进程。 子进程调用exec函数&#xff0c;族父进程不受影响。进程当前内容被指定的程序替换&#xff0c;但进程…

【MySQL】Mysql——卸载文档(windows版本)

MySQL卸载文档-Windows版 1. 停止MySQL服务 winR 打开运行&#xff0c;输入 services.msc 点击 “确定” 调出系统服务。 停止Mysql服务 2. 卸载MySQL相关组件 打开控制面板 —> 卸载程序 —> 卸载MySQL相关所有组件 3. 删除MySQL安装目录 4. 删除MySQL数据目录 数…

代码随想录算法训练营第二十八天 | 216.组合总和III 、17.电话号码的字母组合

216.组合总和III 题目链接/文章讲解&#xff1a; 代码随想录 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 解题思路 整体的思路和77题是一样的&#xff0c;这里只是多加了个一个…

记录一期Typecho WebShell木马渗透的经历

我创建了一个Typecho的轻量博客,之前一直是本地运行,最近才上了公网,平时自己也是粗心大意,把密码也写在第一篇博文里面 有一天,我突发奇想的想要提交更新,本博客是通过git进行代码版本管理的避免自己修改官方源码出现了问题,无法还原,也定时备份SQL, 然后莫名其妙的发现多了…

苍穹外卖-day01(SpringBoot+SSM的企业级Java项目实战)

苍穹外卖-day01 课程内容 软件开发整体介绍 苍穹外卖项目介绍 开发环境搭建 导入接口文档 Swagger 项目整体效果展示&#xff1a; 管理端-外卖商家使用 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为…

LeetCode题练习与总结:不同的二叉搜索树--96

一、题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&…