使用vite从头搭建一个vue3项目(四)使用axios封装request.js文件,并使用proxy解决跨域问题

在这里插入图片描述

目录

  • 一、创建request.js文件
  • 二、创建axios实例
  • 三、创建请求、响应拦截器
  • 四、使用 request.js,测试接口:https://api.uomg.com/api/rand.qinghua
    • 1、调取接口代码书写
    • 2、注意(跨域问题)

axios 的二次封装有三个要点:

  • 创建 axios 实例,axios.create()
  • 创建请求拦截器,interceptors.request.use()
  • 创建响应拦截器,interceptors.response.use()

一、创建request.js文件

安装 axios 插件,指令: npm i axios

src/utils 目录下创建 request.js 文件,并引入 axios。

import axios from "axios"

二、创建axios实例

import axios from "axios"console.log(import.meta);
// 创建axios实例
const instance = axios.create({baseURL: import.meta.env.VITE_BASE_API,  // 设置默认的 API 地址timeout: 5000,						   // 设置请求超时时间headers: { 'systemType': 'IOS' }         // 设置请求header,可以自定义属性
})export default instance;

import.meta 是个什么东西?

import.meta 是一个 ES 模块(ESM)特性,它提供了有关当前模块的元数据。在 Vue 3 中,import.meta 可以用于访问当前 Vue 应用程序实例的上下文信息,如应用程序的基本 URL、环境变量等。

在这里插入图片描述

Vite 官网也说过:Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。
在这里插入图片描述

三、创建请求、响应拦截器

src/utils 中创建 token 操作文件 auth.js。

const tokenKey = 'vite_token'; // 自定义tokenKey
// 获取token
export function getToken() {return sessionStorage.getItem(tokenKey);
}
// 设置token
export function setToken(token) {return sessionStorage.setItem(tokenKey, token);
}
// 删除token
export function removeToken() {return sessionStorage.clear();
}

拦截器代码逻辑(完整代码):

import axios from "axios"
import { getToken } from "./auth";
import { ElMessage } from 'element-plus';console.log(import.meta);
// 创建axios实例
const instance = axios.create({baseURL: import.meta.env.VITE_BASE_API, // 设置默认的 API 地址,url = baseURL + url(使用proxy代理时此处可不写)timeout: 5000,						  // 设置请求超时时间headers: { 'systemType': 'IOS' }        // 设置请求header,可以自定义属性
})// 请求拦截器
instance.interceptors.request.use(// 请求配置(全局),一般在登录时后端返回token,此处设置token后,前端每次调取接口都会携带token(config) => {const token = getToken();if (token) {config.headers.token = token;}return config;},// 请求错误(error) => {return Promise.reject(error)}
)
// 响应拦截器
instance.interceptors.response.use(// 响应数据,2xx 范围内的状态码都会触发该函数。(response) => {const { status, data } = response;if (status === 200) {const { code, message } = data;// 根据后端返回的自定义状态码 code 进行错误信息提示(根据具体需求确定是否需要书写)switch (code) {case 1001:ElMessage({ message: '登录信息已过期,请重新登录!', type: 'error' })return Promise.reject(data);case 1002:ElMessage({ message: '当前账号已在其它端登录,请重试!', type: 'error' })return Promise.reject(data);case 1003:ElMessage({ message: message || '未知错误', type: 'error' })return Promise.reject(data);default:return data;}}},// 响应错误,超出 2xx 范围的状态码都会触发该函数。(error) => {if (error.response) {// 请求已发送,收到响应,但状态码非 2xx ,根据 http 状态码来判断响应错误信息const { status, data } = error.response;if (status === 2001) {ElMessage({ message: '没查到对应数据!', type: 'error' })} else if (status === 2002) {ElMessage({ message: '服务器开小差了!', type: 'error' })} else {ElMessage({ message: data.message || '未知错误!', type: 'error' })}} else if (error.request) {// 请求已发送,未收到响应ElMessage({ message: error.message || '请求已发送,未收到响应信息!', type: 'error' })} else {// 其他错误ElMessage({ message: error.message, type: 'error' })}// 若简写,上面代码可省略,只写此一行return Promise.reject(error);}
)export default instance;

四、使用 request.js,测试接口:https://api.uomg.com/api/rand.qinghua

1、调取接口代码书写

src/api/about 目录下创建 index.js 文件,引入request.js,创建一个请求函数。

import request from '@/utils/request';// 获取随机搞笑语句
export function getMessage(params = {}) {return request({url: '/api/rand.qinghua',method: 'POST',data: params})
}

src/pages/about/index.vue 组件中使用:

<template><div class="about"><h3>This is About page!</h3><el-button type="default" @click="handleClick">切换内容</el-button><h4>{{ message }}</h4></div>
</template>
<script setup>
import { getMessage } from '@/api/about'const message = ref("")
onMounted(() => {handleClick();
})
function handleClick() {getMessage().then(res => {const { content } = res;message.value = content;})
}
</script>
<style lang="less" scoped>
.about {h3 {color: grey;}
}
</style>

需要修改 .env.development 文件:

## 开发环境
VITE_MODE='development'# 变量必须以 VITE_ 为前缀才能暴露给外部读取
VITE_BASE_API = 'https://api.uomg.com/'

因为 about 组件中使用了 Element Plus UI 组件库,所以还得安装一下:npm i element-plus,然后在 main.js 文件中全局引入:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import './style.css'
import '@style/index.scss'
import '@style/index.less'import App from './App.vue'
import router from "@/router"const app = createApp(App)app.use(router)
app.use(ElementPlus)
app.mount('#app')

如果想要按需引入 Element Plus 组件,首先你需要安装 unplugin-vue-componentsunplugin-auto-import 这两款插件。详情请参考:https://element-plus.org/zh-CN/guide/quickstart.html

2、注意(跨域问题)

因为测试的 API 地址协议为 https,而本地使用的是 http,所以会出现跨域问题:
在这里插入图片描述

这时候就必须使用代理 proxy了。而要使用 proxy 代理,则 request.js 文件中的 baseURL 配置项就不再需要了。

此处说明一下:

  • 如果 axios 的 baseURL 配置的是绝对路径,例如 'http://192.168.1.32:8000/',axios 会直接发送请求而不经过 server.proxy。
  • 如果 axios 的 baseURL 配置的是相对路径,例如 '/api',则可以正常使用 server.proxy 进行请求转发,不会存在跨域问题

此处若配置 baseURL,则路径地址变成了 https://api.uomg.com/api/rand.qinghua 这样的绝对路径;而不配置 baseURL ,则为相对路径 /api/rand.qinghua。proxy匹配到了 '/api',会使用配置的 target 选项拼接成完整路径:target + '/api/rand.qinghua' 进行请求。

当然,此处的配置还有其他方式,不做赘述。

const instance = axios.create({baseURL: '',  // 设置默认的 API 地址,url = baseURL + urltimeout: 5000,                           // 设置请求超时时间headers: { 'systemType': 'IOS' }         // 设置请求header,可以自定义属性
})

vite.config.js 文件中的 proxy 配置也需要修改:

proxy: {'/api': {target: env.VITE_BASE_API,                      changeOrigin: true,                             // rewrite: (path) => path.replace(/^\/api/, ''),  // 此行注释},
}

因为 '/api' 是地址 https://api.uomg.com/api/rand.qinghua 中的成员,所以 rewrite 配置项不需要再将 '/api' 重写为 ''

看效果:
在这里插入图片描述

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

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

相关文章

【智能算法】霸王龙优化算法(TROA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;VSDM Sahu等人受到霸王龙狩猎行为启发&#xff0c;提出了霸王龙优化算法&#xff08;Tyrannosaurus Optimization Algorithm, TROA&#xff09;。 2.算法原理 2.1算法思想 TR…

【系统分析师】系统规划

文章目录 1、项目的机会选择2、可行性分析3、成本效益分析3.1 基本概念3.2 盈亏临界分析3.3 净现值分析3.4 投资回收期 截图&#xff1a;希赛讲义 视频&#xff1a;B站 系统规划对应的是 立项 阶段 1、项目的机会选择 2、可行性分析 3、成本效益分析 3.1 基本概念 例题 3.2 盈…

边缘计算智能分析网关V4地面垃圾AI检测算法介绍及场景应用

在传统的卫生监管场景中&#xff0c;无法及时发现地面遗留的垃圾&#xff0c;通过人工巡逻的方式需要大量的人力、物力和时间&#xff0c;而且效率不高&#xff0c;并存在一定的滞后性&#xff0c;而采用地面垃圾AI检测算法则可以大大提高监管效率。 TSINGSEE青犀AI智能分析网…

windows10安装Tensorflow-gpu 2.10.0

windows10安装Tensorflow-gpu 2.10.0 本文主要目的是 从0开始演示 在windows10 平台安装Tensorflow-gpu 2.10.0。 Tensorflow-gpu 2.10.0 之后的版本&#xff0c;不再支持这样的安装方式&#xff0c;如果有需要&#xff0c;请参考wsl安装ubuntu的方式&#xff0c;进行安装。 …

短视频矩阵源头====技术文档交付

短视频矩阵源头技术文档交付 搭建短视频矩阵系统源码需要以下步骤&#xff1a; 1. 确定系统需求和功能&#xff1a;明确系统需要支持哪些功能&#xff0c;例如短视频的上传、存储、播放、分享、评论、点赞等。 2. 选择合适的编程语言和框架&#xff1a;根据需求选择合适的编程…

存储人视角:人工智能AI + 大模型

原文来自于知乎存储专栏&#xff1a; 存储人视角&#xff1a;人工智能AI 大模型 前沿 我的角色 背景 AI 出场 效果 一个宠娃狂魔 娃喜爱并有奥特曼玩具 她的奥特曼玩具会跳舞了 娃对我的崇拜和爱又多了一分......amazing 杭州网商路艾弗森 球队需要制作LOGO 形象生动…

【办公软件word小技巧】如何一键提取word中的图片 几十张 几百张均可一键提取

在日常生活和工作中&#xff0c;我们经常会遇到需要从Word文档中提取图片的情况。无论是为了单独保存这些图片&#xff0c;还是为了在其他地方使用它们&#xff0c;一键提取Word中的图片都是一个非常实用的技能。提取Word文件中的图片并不是一件复杂的事情&#xff0c;只要掌握…

照片jpg格式小于50kb怎么弄?jpg压缩到指定大小

我们经常需要处理大量的图片&#xff0c;特别是在分享到社交媒体时&#xff0c;然而&#xff0c;图片文件的大小常常成为困扰我们的问题&#xff0c;尤其是当我们的设备存储空间有限时。有些平台甚至会需要将图片压缩到50kb大小&#xff0c;那么&#xff0c;如何有效地压缩图片…

WAF攻防-权限控制代码免杀异或运算变量覆盖混淆加密传参

知识点 1、脚本后门基础&原理 2、脚本后门查杀绕过机制 3、权限维持-覆盖&传参&加密&异或等 章节点&#xff1a; WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 代码表面层免杀-ASP&PHP&JSP&a…

电商数据接口开发|淘宝商品接口|天猫商品接口|京东商品接口|拼多多商品接口|API接口申请指南

电商数据接口开发涉及到多个电商平台&#xff0c;包括淘宝、天猫、京东和拼多多等。这些平台都提供了丰富的API接口&#xff0c;以便开发者能够获取商品信息、订单数据等&#xff0c;从而构建出各种电商应用和服务。 1.请求方式&#xff1a;HTTP POST GET &#xff08;复制薇&…

Python经典游戏:乒乓球对战(单人+双人模式)

Python108款&#xff0c;小游戏集合&#xff0c;总有一个是你想要的 中国象棋 像素鸟 五子棋 24点小游戏 贪吃蛇 扫雷 俄罗斯方块 魂斗罗 消消乐 坦克大战 外星人入侵 汤姆猫 斗地主 乒乓球 推箱子 植物大战僵尸 围棋 超级玛丽 飞机大战 迷宫 滑雪 吃豆人…等等 &#xff0…

基于springboot实现信息化在线教学平台设计【项目源码+论文说明】计算机毕业设计

基于springboot实现信息化在线教学平台设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、通用版QT5 存在一些问题四、python版PyQt5 存在一些问题五、OpenGL的析构问题5.1 OpenGL很脆弱,这不是危言耸听5.2 以上OpenGL问题解决方法六、一些保留意见一、说明 应用QT做程序界面,在…

电视盒子哪个牌子好?博主总结网络电视盒子推荐

电视盒子是我们使用最多的产品&#xff0c;追剧、游戏、上网课都离不开电视盒子&#xff0c;但很多朋友不知道电视盒子哪个牌子好&#xff0c;我这周共计测评了18款不同品牌的电视盒子&#xff0c;今天整理了五款网络电视盒子推荐&#xff0c;想买电视盒子可以看看下面这些。 第…

vscode 配置go环境

https://www.zhihu.com/question/486786946/answer/2723663432 注意一定要安装最新版,否则不容易debug //main.go package main //说明hello.go这个文件在main这个包中import "fmt" //导入内置包&#xff0c;可以使用其中函数等func main() {fmt.Println("Hello…

java 红黑树

01.红黑树的定义&#xff1a; 每一个结点有五个属性&#xff1a;

Computer Organization/Architecture 计算机组织/架构/结构 重要观念和笔记(陆续更新中,2024/04/17周三,已更新)

前情提要&#xff1a;我的说法比较白话&#xff0c;希望可以更好理解其中一些观念&#xff0c;这篇会以中文为主&#xff0c;专有名词还是用英文&#xff0c;好吧应该会中英穿插&#xff0c;自己学的时候感觉听中文会吸收比较快&#xff0c;也可能是我英文比较烂的关系&#xf…

Eagle for Mac v1.9.13注册版:强大的图片管理工具

Eagle for Mac是一款专为Mac用户设计的图片管理工具&#xff0c;旨在帮助用户更高效、有序地管理和查找图片资源。 Eagle for Mac v1.9.13注册版下载 Eagle支持多种图片格式&#xff0c;包括JPG、PNG、GIF、SVG、PSD、AI等&#xff0c;无论是矢量图还是位图&#xff0c;都能以清…

Solaris安装Oracle RAC配置手册

一. Oracle RAC安装前的系统准备工作 检查安装包 ​pkginfo –i SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo pkg install SUNWarc SUNWbtool SUNWhea SUNWlibC SUNWlibm SUNWlibms SUNWsprotSUNWtoo 1.1 创建系统用户和组(两节点都要执行 ro…

通付盾APP尽职调查报告:守护移动应用安全新篇章

在数字化浪潮席卷全球的今天&#xff0c;移动应用程序已经成为我们生活中不可或缺的一部分。无论是购物、社交、娱乐还是工作&#xff0c;我们几乎每天都在与各种各样的APP打交道。然而&#xff0c;随着APP的广泛应用&#xff0c;其安全问题也日益凸显&#xff0c;成为开发者和…