fetch,ajax,axios的区别以及使用

fetch,ajax,axios这些都是发起前端请求的工具,除了这些外还有jquery的$.ajax。ajax和$.ajax都是基于XMLHttpRequest。

介绍下XMLHttpRequest

XMLHttpRequest是一种在浏览器中用于与服务器进行异步通信的对象,它是实现 AJAX(Asynchronous JavaScript and XML,异步的 JavaScript 与 XML 技术)的核心。通过 XMLHttpRequest,可以在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。而jquery的$.ajax简化了XMLHttpRequest的使用。

区别

ajax:是最早用于实现异步数据交互的技术,出现时间较早。兼容性非常好,能在所有主流浏览器(包括一些较旧版本的浏览器)中使用。

fetch:是 ES6 引入的新的 API,现代浏览器基本都支持,但在一些旧版本浏览器中需要使用 polyfill 来实现兼容。

axios:是一个基于promise的 HTTP 客户端,用于浏览器和 Node.js。由于是第三方库,使用时需要引入,不过它通过内部处理兼容了不同浏览器,也能在 Node.js 环境使用。

使用

这里使用express框架创建一个简单的node服务,里面有一个接口,以便演示使用。

node后端

创建好项目文件夹后在cmd里面输入命令

npm i express

使用cors中间件来配置跨域,安装命令

npm install cors

app.js 

// 引入 express 模块
const express = require('express');
// 引入 cors 模块
const cors = require('cors');// 创建 express 应用实例
const app = express();
// 定义端口号
const port = 3000;// 配置 cors 中间件,允许来自 8080 端口的跨域请求
const corsOptions = {origin: 'http://localhost:8080',
};
app.use(cors(corsOptions));// 定义一个 GET 请求的接口
app.get('/api/data', (req, res) => {// 定义要返回的数据const data = {message: '接口的数据',list: [1, 2, 3]};// 设置响应头,指定返回的数据格式为 JSONres.setHeader('Content-Type', 'application/json');// 发送 JSON 数据作为响应res.send(JSON.stringify(data));
});// 启动服务器,监听指定端口
app.listen(port, () => {console.log(`服务器正在运行,访问地址为 http://localhost:${port}/api/data`);
});

打开终端输入node app.js 启动,看到这个表示成功了,点击地址可以看到接口返回的数据

 fetch

<template><div id="box"><button @click="getDate">fetch</button></div>
</template><script>export default {name: "App",methods: {async getDate() {const res = await fetch("http://localhost:3000/api/data");console.log("res", res);// 使用 res.json() 方法将响应体解析为 JSON 格式const data = await res.json();console.log("data", data);},},};
</script>

运行结果,打印可以看到已经拿到了接口的数据了,在浏览器网络中也可以看到请求已经成功了

 

ajax

<template><div id="box"><button @click="getData2">ajax</button></div>
</template><script>
export default {name: "App",methods: {getData2() {const xhr = new XMLHttpRequest();xhr.open("GET", "http://localhost:3000/api/data", true);xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status === 200) {const res2 = JSON.parse(xhr.responseText);console.log("res2", res2);} else {console.error("AJAX 请求出错,状态码:", xhr.status);}}};xhr.send();},},
};
</script>

打印结果

 axios

axios是第三方库,在使用前需要安装,命令

npm install axios
<template><div id="box"><button @click="getData3">axios</button></div>
</template><script>
import axios from 'axios';
export default {name: "App",methods: {async getData3(){const res3=await axios.get('http://localhost:3000/api/data');console.log('res3',res3);}},
};
</script>

打印结果

 axios在实际开发中用的比较多,这里在演示下axios发put,post,delete请求。首先修改下后端代码,添加上put,post,delete接口。(修改完代码后记得重启下--在执行一次node app.js)

// 引入 express 模块
const express = require('express');
// 引入 cors 模块
const cors = require('cors');// 创建 express 应用实例
const app = express();
// 定义端口号
const port = 3000;// 配置 cors 中间件,允许来自 8080 端口的跨域请求
const corsOptions = {origin: 'http://localhost:8080',
};
app.use(cors(corsOptions));// 解析请求体中的 JSON 数据
app.use(express.json());// 声明一个数据对象
let data = {message: '接口的数据',list: [1, 2, 3]
};// 定义一个 GET 请求的接口,用于获取数据
app.get('/api/data', (req, res) => {res.setHeader('Content-Type', 'application/json');res.send(JSON.stringify(data));
});// 定义一个 POST 请求的接口,用于新增数据
app.post('/api/data', (req, res) => {const newData = req.body;// 假设新增的数据是添加到 list 数组中if (newData.value) {data.list.push(newData.value);}const responseData = {message: 'POST 请求处理成功,数据已新增',currentData: data};res.setHeader('Content-Type', 'application/json');res.send(JSON.stringify(responseData));
});// 定义一个 PUT 请求的接口,用于更新数据
app.put('/api/data', (req, res) => {const updatedData = req.body;// 假设更新的数据是替换 list 数组if (updatedData.list) {data.list = updatedData.list;}const responseData = {message: 'PUT 请求处理成功,数据已更新',currentData: data};res.setHeader('Content-Type', 'application/json');res.send(JSON.stringify(responseData));
});// 定义一个 DELETE 请求的接口,用于删除数据
app.delete('/api/data', (req, res) => {const deleteIndex = req.body.index;if (deleteIndex!== undefined && deleteIndex >= 0 && deleteIndex < data.list.length) {data.list.splice(deleteIndex, 1);}const responseData = {message: 'DELETE 请求处理成功,数据已删除',currentData: data};res.setHeader('Content-Type', 'application/json');res.send(JSON.stringify(responseData));
});// 启动服务器,监听指定端口
app.listen(port, () => {console.log(`服务器正在运行,访问地址为 http://localhost:${port}/api/data`);
});

前端代码

<template><div id="box"><button @click="getData">获取数据</button><button @click="addData">新增数据</button><button @click="updateData">更新数据</button><button @click="deleteData">删除数据</button>info:{{ info.message }} {{ info.list }}</div>
</template><script>
import axios from 'axios';
export default {name: "App",data(){return {info:{},}},methods: {// 获取数据async getData() {try {const response = await axios.get('http://localhost:3000/api/data');this.info = response.data;} catch (error) {console.error('获取数据失败:', error);}},// 新增数据async addData() {try {const newData = { value: 4 };await axios.post('http://localhost:3000/api/data', newData);//调用获取数据接口来获取最新的数据,await 确保接口完成后在打印//不加await可能会打印新增之前的旧值await this.getData();console.info('新增后',this.info );} catch (error) {console.error('新增数据失败:', error);}},// 更新数据async updateData() {try {const updatedData = { list: [5, 6, 7] };await axios.put('http://localhost:3000/api/data', updatedData);await this.getData();console.info('更新后',this.info );} catch (error) {console.error('更新数据失败:', error);}},// 删除数据async deleteData() {try {const deleteIndex = 0;await axios.delete('http://localhost:3000/api/data', {data: { index: deleteIndex }});await  this.getData();console.info('删除后',this.info );} catch (error) {console.error('删除数据失败:', error);}}},
};
</script>

运行效果,从打印结果可以看到调用接口的时候数据发生了变化

end 

如有误欢迎指正 

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

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

相关文章

微信小程序的业务域名配置(通过ingress网关的注解)

一、背景 微信小程序的业务域名配置&#xff08;通过kong网关的pre-function配置&#xff09;是依靠kong实现&#xff0c;本文将通过ingress网关实现。 而我们的服务是部署于阿里云K8S容器&#xff0c;当然内核与ingress无异。 找到k8s–>网络–>路由 二、ingress注解 …

LiteratureReading:[2016] Enriching Word Vectors with Subword Information

文章目录 一、文献简明&#xff08;zero&#xff09;二、快速预览&#xff08;first&#xff09;1、标题分析2、作者介绍3、引用数4、摘要分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;分析 5、总结分析&#xff08;1&#xff09;翻译&#xff08;2&#xff09;…

前后端联调解决跨域问题的方案

引言 在前后端分离的开发模式中&#xff0c;前端和后端通常在不同的服务器或端口运行&#xff0c;这样就会面临跨域问题。跨域问题是指浏览器因安全限制阻止前端代码访问与当前网页源不同的域、协议或端口的资源。对于 Java 后端应用&#xff0c;我们可以通过配置 CORS&#x…

开源软件许可证冲突的原因和解决方法

1、什么是开源许可证以及许可证冲突产生的问题 开源软件许可证是一种法律文件&#xff0c;它规定了软件用户、分发者和修改者使用、复制、修改和分发开源软件的权利和义务。开源许可证是由软件的版权所有者&#xff08;通常是开发者或开发团队&#xff09;发布的&#xff0c;它…

python爬虫笔记(一)

文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签&#xff08;网站&#xff09;target属性换行线和水平分割线 图片设置宽高width&#xff0c;height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…

电脑节电模式怎么退出 分享5种解决方法

在使用电脑的过程中&#xff0c;许多用户为了节省电力&#xff0c;通常会选择开启电脑的节能模式。然而&#xff0c;在需要更高性能或进行图形密集型任务时&#xff0c;节能模式可能会限制系统的性能表现。这时&#xff0c;了解如何正确地关闭或调整节能设置就显得尤为重要了。…

AI学习——卷积神经网络(CNN)入门

作为人类&#xff0c;我们天生擅长“看”东西&#xff1a;一眼就能认出猫狗、分辨红绿灯、读懂朋友的表情……但计算机的“眼睛”最初是一片空白。直到卷积神经网络&#xff08;CNN&#xff09;​的出现&#xff0c;计算机才真正开始理解图像。今天&#xff0c;我们就用最通俗的…

2025年渗透测试面试题总结- shopee-安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 shopee-安全工程师 信息安全相关Response头详解 1. 关键安全头及防御场景 Linux与Docker核心命令速查…

IntelliJ IDEA 中 Maven 的 `pom.xml` 变灰带横线?一文详解解决方法

前言 在使用 IntelliJ IDEA 进行 Java 开发时&#xff0c;如果你发现项目的 pom.xml 文件突然变成灰色并带有删除线&#xff0c;这可能是 Maven 的配置或项目结构出现了问题。 一、问题现象与原因分析 现象描述 文件变灰&#xff1a;pom.xml 在项目资源管理器中显示为灰色。…

Spring MVC 接口数据

访问路径设置 RequestMapping("springmvc/hello") 就是用来向handlerMapping中注册的方法注解! 秘书中设置路径和方法的对应关系&#xff0c;即RequestMapping("/springmvc/hello")&#xff0c;设置的是对外的访问地址&#xff0c; 路径设置 精准路径匹…

技术分享 | MySQL内存使用率高问题排查

本文为墨天轮数据库管理服务团队第51期技术分享&#xff0c;内容原创&#xff0c;如需转载请联系小墨&#xff08;VX&#xff1a;modb666&#xff09;并注明来源。 一、问题现象 问题实例mysql进程实际内存使用率过高 二、问题排查 2.1 参数检查 mysql版本 &#xff1a;8.0.…

【redis】什么是持久化之 RDB

什么是持久化 MySQL 的事务&#xff0c;有四个比较核心的特性&#xff1a; 原子性一致性持久性>持久化&#xff08;说的一回事&#xff09; 把数据存储在硬盘上>持久把数据存在内存上>不持久重启进程/重启主机之后&#xff0c;数据是否还存在 隔离性 Redis 是一个内存…

Python、MATLAB和PPT完成数学建模竞赛中的地图绘制

参加数学建模比赛时&#xff0c;很多题目——诸如统计类、数据挖掘类、环保类、建议类的题目总会涉及到地理相关的情景&#xff0c;往往要求我们制作与地图相关的可视化内容。如下图&#xff0c;这是21年亚太赛的那道塞罕坝的题目&#xff0c;期间涉及到温度、降水和森林覆盖率…

Python(冒泡排序、选择排序、插入法排序、快速排序,算法稳定性)

算法的稳定性 冒泡排序 # 冒泡排序 # 1 思想: 相邻位置两个元素比较, 前面的元素比后面的元素大则交换, 把最大的数给找到 # 经过一轮一轮的比较最终把序列给排序 # 2 关键点1: 两层for循环 外层循环控制多少轮 内层for循环控制比较次数 # 3 关键点2: 若遍历一遍没有数字…

【自用】NLP算法面经(5)

一、L1、L2正则化 正则化是机器学习中用于防止过拟合并提高模型泛化能力的技术。当模型过拟合时&#xff0c;它已经很好地学习了训练数据&#xff0c;甚至是训练数据中的噪声&#xff0c;所以可能无法在新的、未见过的数据上表现良好。 比如&#xff1a; 其中&#xff0c;x1和…

PyCharm安装redis,python安装redis,PyCharm使用失败问题

报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…

学习笔记|arduino uno r3|DS1307时钟芯片|Atmega328P| 设置时间|读取时间|无源晶振:DS1307时钟芯片实验

目录 芯片pinout&#xff1a; 实验器件&#xff1a; 实验连线 解决AVR 架构不支持 printf() 方法 使用GetTimeAndDate.ino设置时间&#xff1a; 使用SetTimeAndDate.ino设置时间&#xff1a; 芯片pinout&#xff1a; DS1307 是美国 DALLAS 公司推出的 I 总线接口实时时钟芯…

uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效

组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22679 兼容性&#xff1a; 测试了h5和微信小程序&#xff0c;理论支持全平台&#xff0c;暂不支持pc端&#xff0c;不过可以自己修改事件兼容pc 使用uniapp仿写了一个手机qq聊天列表右侧未读数的徽标组件&#x…

【设计模式】策略模式

以下是格式优化后的Markdown文档&#xff0c;仅调整代码缩进&#xff0c;保持内容不变&#xff1a; 四、策略模式 策略(Strategy) 模式是一种行为型模式&#xff0c;其实现过程与模板方法模式非常类似——都 是以扩展的方式支持未来的变化。本章通过对一个具体范例的逐步重构…

STM32配套程序接线图

1 工程模板 2 LED闪烁 3LED流水灯 4蜂鸣器 5按键控制LED 6光敏传感器控制蜂鸣器 7OLED显示屏 8对射式红外传感器计次 9旋转编码器计次 10 定时器定时中断 11定时器外部时钟 12PWM驱动LED呼吸灯 13 PWM驱动舵机 14 PWM驱动直流电机 15输入捕获模式测频率 16PWMI模式测频率占空…