Vue使用axios二次封装、解决跨域问题

 1、什么是 axios

在实际开发过程中,浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后,官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。

关于 promise 的详细介绍,请点击浏览文章:《ECMAScript6语法:Promise》

axios 的主要特点如下:

  • 从浏览器中创建 XMLHttpRequest。
  • 从 node.js 发出 HTTP 请求。
  • 支持 Promise API。
  • 拦截请求和响应。
  • 转换请求和响应数据。
  • 取消请求。
  • 自动转换JSON数据。
  • 客户端支持防止CSRF/XSRF。

官方文档:《Axios中文文档》

2、安装 axios

如果在项目中使用 axios,则可以使用 npm 方式进行安装。在命令提示符窗口中输入如下命令:

npm install axios --save

或者使用 yarn 安装,命令如下:

yarn add axios –save

3、axios 的语法

在实际项目开发中,前端页面中所需的数据通常要从服务器端获取,这就需要实现本地与服务器端的通信,Vue 使用 axios 实现 Ajax 请求。

语法格式和参数说明:

axios({url: '',             //请求的路径method: 'GET',       //请求的方式,默认为GETparams: {},          //GET请求方式:传递的参数data: {},            //POST请求方式:传递的参数headers: {},         //自定义请求头timeout: 1000,       //请求超时时间(毫秒)responseType: 'JSON' //响应的数据类型,默认为JSON
}).then(// then() 函数:处理请求成功的回调函数function (response) {console.log("返回的数据", response.data);}
).catch(function (error) {// catch() 函数:处理请求失败的回调函数console.log("发生异常:" + error.message);
});

axios 详细使用方法,请点击浏览文章:《Vue使用axios实现Ajax请求》

4、解决跨域问题

如果 Vue 前端应用请求后端 API 服务器,出现跨域问题(CORS),如下图:

 解决方法:在 Vue 项目中,打开 vue.config.js 配置文件,在配置文件中使用代理解决跨域问题。

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,devServer:{proxy: 'http://localhost:8085',  //使用代理,解决跨域问题}
})

详细的解决方法,请点击浏览文章:《Vue使用代理方式解决跨域问题》

5、axios 的二次封装

在项目中,axios 进行二次封装可以更加方便的使用 Ajax 请求,提高代码复用性和维护性。同时可以封装统一的请求与响应拦截处理。

项目结构图:

5.1 封装 axios 公共处理类

在项目 src 目录下,创建 utils 目录,并在该目录下创建 request.js 类:

// 1、引入axios
import axios from 'axios'// 2、创建axios对象
const request = axios.create({//baseURL: 'http://localhost:8081', //注意:因为已经在 vue.config.js 文件中配置了代理服务(解决跨域问题),所有这里需要注释掉timeout: 0, //0表示永不超时withCredentials: true // 表示请求可以携带cookie   
});// 3、添加请求拦截器
request.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});// 4、添加响应拦截器
request.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么if (response.status == 200) {return response.data;}else {alert("操作失败:" + response.data.message);return null;}
}, function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么return Promise.reject(error);
});// 5、导出axios实例
export default request

5.2 创建 API 服务类

在实际项目中,为各个模块创建各自的 API 服务类,用于对接后端服务提供的 API 接口。

在项目 src 目录下,创建 API 目录,并在该目录下创建 UserApi.js 类:

import request from '@/utils/request.js';//获取用户信息
export function getUserInfo(userId) {return request({method: 'GET',url: `/user/getUserInfo/${userId}`});
}//新增用户信息
export function saveUserInfo(userInfo) {return request({url: '/user/saveUserInfo',method: 'POST',data: userInfo});
}//修改用户信息
export function updateUserInfo(userInfo) {return request({url: '/user/updateUserInfo',method: 'POST',data: userInfo});
}//删除用户信息
export function deleteUserInfo(userId) {return request({url: `/user/deleteUserInfo/${userId}`,method: 'POST'});
}

5.3 创建组件并调用API接口

在项目 src 目录下,创建 views/user 目录,并在该目录下创建 UserInfo.vue 组件:

<template><fieldset><legend>用户信息</legend><p>用户名称:<input type="text" v-model="userInfo.userName" /></p><p>用户年龄:<input type="text" v-model="userInfo.age" /></p><p>用户性别:<input id="male" type="radio" value="男" v-model="userInfo.sex" /><label for="male">男</label><input id="female" type="radio" value="女" v-model="userInfo.sex" /><label for="female">女</label></p><p>博客信息:<input type="text" v-model="userInfo.blogName" /></p><p>博客地址:<input type="text" v-model="userInfo.blogUrl" /></p><button @click="getUser(1)">查询用户</button><button @click="saveUser">新增用户</button><button @click="updateUser">修改用户</button><button @click="deleteUser">删除用户</button></fieldset>
</template><script setup>
//导入所需的API方法
import { getUserInfo, saveUserInfo, updateUserInfo, deleteUserInfo } from '@/api/UserApi.js';
import { ref } from 'vue';//注意:这里使用 ref(),不要使用 reactive(),否则重新赋值后,响应式状态就缺失了
let userInfo = ref({userId: 0
});//获取用户信息
function getUser(userId) {getUserInfo(userId).then(function (result) {userInfo.value = result;});
}//新增用户信息
function saveUser() {saveUserInfo(userInfo.value).then(function (response) {if (response) {alert("操作成功");} else {alert("操作失败");}});
}//修改用户信息
function updateUser() {updateUserInfo(userInfo.value).then(function (response) {if (response) {alert("操作成功");} else {alert("操作失败");}});
}//删除用户信息
function deleteUser() {deleteUserInfo(userInfo.value.userId).then(function (response) {if (response) {alert("操作成功");} else {alert("操作失败");}});
}</script><!-- CSS样式 -->
<style scoped>
input[type="text"] {width: 300px;padding: 3px;font-size: 16px;
}button {margin-right: 10px;
}
</style>

6、综合实例

通过上述 axios 的二次封装,下面通过一个综合实例,来测试应用效果。

【实例】使用  axios 的二次封装,通过使用 Ajax 请求,实现用户信息的查询、新增、修改、删除功能。实例执行的结果如下图:

使用 Java、SpringBoot 创建一个后端项目,编写 UserController.java 用户信息控制器,实现 API 接口。

package com.pjb.pm.controller;import com.pjb.pm.entity.UserInfo;
import org.springframework.web.bind.annotation.*;/*** 用户信息控制器* @author pan_junbiao**/
@RestController
@RequestMapping("/user")
//@CrossOrigin //解决跨域问题
public class UserController
{/*** 获取用户信息*/@RequestMapping(value = "/getUserInfo/{id}", method = RequestMethod.GET)public UserInfo getUserInfo(@PathVariable("id") Long userId){//模拟用户查询功能UserInfo userInfo = new UserInfo();userInfo.setUserId(userId);userInfo.setUserName("pan_junbiao的博客");userInfo.setSex("男");userInfo.setAge(36);userInfo.setBlogName("您好,欢迎访问 pan_junbiao的博客");userInfo.setBlogUrl("https://blog.csdn.net/pan_junbiao");return userInfo;}/*** 新增用户信息*/@RequestMapping(value = "/saveUserInfo", method = RequestMethod.POST)public boolean saveUserInfo(@RequestBody UserInfo userInfo){if (userInfo == null || userInfo.getUserName() == null || userInfo.getUserName().length() == 0){return false;}//忽略相关代码...return true;}/*** 修改用户信息*/@RequestMapping(value = "/updateUserInfo", method = RequestMethod.POST)public boolean updateUserInfo(@RequestBody UserInfo userInfo){if (userInfo.getUserId() <= 0){return false;}//忽略相关代码...return true;}/*** 删除用户信息*/@RequestMapping(value = "/deleteUserInfo/{id}", method = RequestMethod.POST)public boolean deleteUserInfo(@PathVariable("id") Long userId){if (userId == 0){return false;}//忽略相关代码...return true;}
}

执行结果:

(1) 查询用户信息:

(2)新增、修改、删除用户信息:

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

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

相关文章

专为汽车功能应用打造的 MLX90376GGO、MLX90377GGO、MLX90377GDC-ADB-280 Triaxis®磁位置传感器 IC

一、MLX90376 Triaxis堆叠式高性能位置传感器芯片&#xff08;模拟/PWM/SENT/SPC&#xff09; MLX90376GGO-ABA-600 MLX90376GGO-ABA-630 MLX90376GGO-ABA-680 MLX90376是一款磁性绝对位置传感器芯片&#xff0c;适用于要求具备抗杂散磁场干扰性能的360旋转汽车应用。它提供…

Matlab进阶绘图第68期—带分组折线段的分区柱状图

上一篇文章分享了分区柱状图的绘制方法&#xff1a; 带分组折线段的分区柱状图是在原始分区柱状图的基础上&#xff0c;再添加分组折线段&#xff0c;用以增加一个对象的表达。 由于Matlab中未收录的带分组折线段的分区柱状图的绘制方法&#xff0c;因此需要大家自行解决。 本…

C++进阶(2):多态

多态的概念 多态分为编译时多态(静态多态)和运行时多态(动态多态)。**编译时多态&#xff1a;**主要就是我们前面讲的函数重载和函数模版。之所以叫编译时多态&#xff0c;是因为实参传给形参的参数匹配是发生在编译时完成的&#xff08;ps&#xff1a;通常把编译时一般归为静…

Java项目实战II基于Java+Spring Boot+MySQL的网上租贸系统设计与实现(开发文档+源码+数据库)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 "随着…

面试-设计模式

策略模式 定义了一组算法&#xff0c;分别封装起来&#xff0c;这些算法直接可以相互替换 设计模式的开闭原则&#xff1a;对修改关闭&#xff0c;对扩展开放 装饰模式 将某种算法作为一个装饰品添加到对象身上&#xff0c;同时可以自由穿戴更换装饰品 两个主要的角色&…

游戏淡入淡出效果

一、制作UIdocument 注&#xff1a;是全黑的&#xff1b;并且Picking Mode设置为Igore 通过调节display中的值&#xff0c;实现淡入淡出效果 二、建立空物体 增加uiDocument 拖入相关的物体 注&#xff1a;层级必须设置为最高&#xff0c;此处为20&#xff0c;这个效果必须遮…

MySQL深入原理

MySQL深入原理 索引、事务、日志原理、InnoDB引擎、缓存、锁 有4个数据库是属于MySQL自带的系统数据库&#xff1a; ​ mysql MySQL 系统自带的核心数据库&#xff0c;它存储了MySQL的用户账户和权限信息&#xff0c;一些存储过程、事件的定义信息&#xff0c;一些运行过程中…

波分技术基础 -- Liquid OTN

什么是Liquid OTN 传统OTN技术主要定位于骨干网和城域网应用&#xff0c;主要用于承载大于1Gbits/s速率业务&#xff0c;在OTN下沉到城域/接入网后&#xff0c;面临如下问题&#xff1a;管道弹性不足&#xff08;最小管道ODU0&#xff09;、连接数少、带宽调整不够灵活等挑战。…

yolov5/8/9模型在COCO分割数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9模型在COCO分割数据集上的应用【代码数据集python环境GUI系统】 yolov5/8/9模型在COCO分割数据集上的应用【代码数据集python环境GUI系统】 1.COCO数据集介绍 COCO数据集&#xff0c;全称为Microsoft Common Objects in Context&#xff0c;是微软于2014年出资标注的…

更换硬盘后,电脑装完系统进不去?或PE能识别硬盘但开机/启动/BIOS识别不了硬盘解决办法

由于现在的电脑主板&#xff0c;默认都是UEFI启动&#xff0c;硬盘只有使用GUID分区表&#xff0c;主板BIOS才找得到系统引导&#xff01; 而当我们拿到一块新硬盘&#xff0c;使用分区工具默认类型分区&#xff0c;默认是MBR类型&#xff0c;所以这种分区的硬盘&#xff0c;B…

解决Windows10关闭UAC后,开机启动项不生效的问题

Windows10关闭UAC后&#xff0c;会发现启动项不生效。 运行输入gpedit.msc打开组策略&#xff08;家庭版没有组策略功能&#xff09; 依次展开计算机配置-》Windows设置-》安全设置-》本地策略-》安全选项-》用户账户控制&#xff1a;以管理员批准模式运行所有管理员&#xf…

VGG16模型实现新冠肺炎图片多分类

1. 项目简介 本项目的目标是通过深度学习模型VGG16&#xff0c;实现对新冠肺炎图像的多分类任务&#xff0c;以帮助医疗人员对患者的影像进行快速、准确的诊断。新冠肺炎自爆发以来&#xff0c;利用医学影像如X光和CT扫描进行疾病诊断已成为重要手段之一。随着数据量的增加&am…

ETCD学习使用

一、介绍 etcd&#xff08;分布式键值存储&#xff09;是一个开源的分布式系统工具&#xff0c;用于可靠地存储和提供键值对数据。etcd 通常通过 HTTP 或 gRPC 提供 API&#xff0c;允许应用程序通过简单的接口与其交互。由于其可靠性和稳定性&#xff0c;etcd 在构建可扩展、分…

【Linux笔记】如何将内容从一个文件复制到另一个文件

比如&#xff1a;将文件tmp_file.txt中的部分数据&#xff0c;复制到file01.txt中去 tmp_file.txt文中内容&#xff1a; file01.txt为空文档 一、使用vi编辑器 I、文件中直接使用:e 目标文件进行切换文件复制 1、打开被复制文件 vi tmp_file.txt 2、进入一般命令模式 默认情况为…

电机学习-有感BLDC开环控制(六步换相)

文章目录 1. 简介2. 六步换向控制3. 机械角度和电角度4.转子位置获取5.霍尔传感器读取测试6.速度开环控制6.1 PWM设置6.2死区时间 1. 简介 BLDC的反电动势一般是梯形的反电动势&#xff0c;所以采用方波控制。如图2-1所示&#xff0c;是一个简化的内转子无刷直流电机。我们通过…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染&#xff0c;又能做单页应用的框架&#xff0c;如果想做单页应用&#xff0c;又想学服务端渲染&#xff0c;使用Remix可以降低学习成本。最近&#xff0c;在学习Remix的过程中&#xff0c;遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

自动化立体仓库与堆垛机单元的技术参数

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 完整版文件和更多学习资料&#xff0c;请球友到知识星球【智能仓储物流技术研习社】自行下载。 这份文件是一份自动化立体仓库与堆垛机单…

ViT模型

Vision Transformer (ViT) 论文地址&#xff1a;https://arxiv.org/abs/2010.11929 输入到MLP类别分类器中的特征只有类别token 经过N层transformer编码器处理后的特征的维度与输入前相同&#xff0c;均为[197&#xff0c;768]&#xff0c;我们只使用列表切片的方式提取出类…

成都睿明智科技有限公司抖音电商新蓝海领航者

在当今这个短视频与直播电商风起云涌的时代&#xff0c;抖音凭借其庞大的用户基数和高度活跃的社区氛围&#xff0c;已成为众多品牌与商家争相入驻的新蓝海。而在这场电商盛宴中&#xff0c;成都睿明智科技有限公司凭借其专业的服务、创新的策略和深厚的行业洞察力&#xff0c;…

MySQL(日志)

日志 日志分为三种&#xff1a; undo log &#xff08;回滚日志&#xff09;&#xff1a;用于事务回滚和MVCC redo log &#xff08;重做日志&#xff09;&#xff1a;用于故障恢复 binlog &#xff08;归档日志&#xff09;&#xff1a;用于数据备份和主从复制 undo log undo…