前端网络请求:从 XMLHttpRequest 到 Axios

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来Vue篇专栏内容:前端网络请求:从 XMLHttpRequest 到 Axios

前言

在网络应用中,前后端的数据交互是必不可少的一部分。本文将带你从最基本的 XMLHttpRequest 开始,逐步了解并掌握 jQuery、fetch 和 Axios 这几种常用的前端网络请求方式。每种方式都有其特点和适用场景,希望通过本文的介绍,你能找到最适合项目的解决方案。

1.1 XMLHttpRequest

浏览器对XMLHttpRequest对象的支持度不足, 创建 XMLHttpRequest 对象时需要对IE浏览器做的兼

容解决。 - ActiveXObject

回顾:XHR

  • readyState

  • 0-4,0表示未初始化,4表示请求已完成

  • status(HTTP响应状态码)

    • 200:OK,成功

    • 3XX【重定向系列的状态码】

      • 301:永久重定向

      • 302:临时重定向

      • 307:内部浏览器(缓存)重定向

    • 4XX【错误系列】

      • 400:bad request,错误请求

      • 401:鉴权失败

      • 403:禁止访问

      • 404:找不到对应的资源

      • 405:方法不被允许

    • 5XX【服务器错误,环境问题】

      • 500:服务器内部错误(代码、环境问题)

      • 502:bad Getway,错误网关

    使用XHR请求全国高校数据接口

    接口地址

    • https://api.i-lynn.cn/college

    • 只循环展示 list 信息即可

    • 接口可以直接被跨域请求

    案例效果

参考代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"></div>
</body>
<script>// 1.生成XHR对象var xhr = new XMLHttpRequest()// 2.绑定回调函数 xhr.onreadystatechange = function () {// 3. 判断是否成功 if (xhr.readyState === 4 && xhr.status === 200) {const list = JSON.parse(xhr.responseText).dataconsole.log(list)}}// 4. 打开请求xhr.open('GET', 'https://api.i-lynn.cn/college')// 5.发送请求xhr.send()
</script>
</html>

1.2 jQuery

jQuery类的引入解决自己写兼容的烦恼,但现在只是使用了jQuery库中的网络请求功能,而jQuery中大量的dom的方法都是无效引入了,有点大材小用的意思。

$.ajax({ url, type:get/post, data, dataType:json/text/xml/html/jsonp success:function(res){}, error:function(){} 
})
$.get(url,data,callback,dataType) 
$.post(url,data,callback,dataType)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><ul><li v-for="(item,index) of list" :key = "index">{{ item.area }}</li></ul></div>
</body>
<script src="lib/jquery.min.js"></script>
<script src="lib/vue.js"></script>
<script>new Vue({el: '#app',data: {list: []},async mounted () {// async await// async 加载函数上,表示函数内部有异步操作// await 记载异步操作前,把异步操作写为同步const res = await $.get("https://api.i-lynn.cn/college", 'json')console.log(res)this.list = res.data.list}})
</script>
</html>

async:关键词,用于函数声明关键词 function 之前,标记当前的函数为异步函数

await:关键词,让当前关键词的行代码执行之后等到到结果之后再去执行后续代码

1.3 fetch

由HTML5提供的内置API

更加简单的数据获取方式,功能更强大、灵活,可以看作是xhr的升级版

基于Promise实现

fetch支持很多请求方式,但默认为 GET 请求,如果需要使用其他方式可以通过第二个自选参数的 method 选项去指定

fetch(url[,some settings]).then(fn2) .then(fn3) ... .catch(fn)
// 通过url表达式来传递数据 
fetch("http://xxx/?id=123") .then(res => res.json()) .then(data => console.log(data)); 
​
// post标准提交 
fetch("http://xxxx/post", { method: "post", body: "uname=lisi&pwd=123", headers: { "Content-Type": "application/x-www-form-urlencoded"}
}).then(res => res.json()) .then(data => console.log(data));
​
// post提交json数据 
fetch("http://localhost:3000/books", { method: "post", body: JSON.stringify({ uname: "lisi", pwd: "123", }), headers: { "Content-Type": "application/json", }
}).then(res => res.json()) .then(data => console.log(data));

注意:fetch 不会发送 cookies。除非你使用了credentials 的初始化选项 credentials: "include"

在上述代码示例中我们会看到有个 json() 方法,它是fetch的响应结果处理方法,fetch的常用响应

结果处理方法有:

  • text():将返回体处理成字符串类型

  • json():返回结果和JSON.parse(responseText)一样

使用fetch方式改写 XHR 部分案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>06 fetch</title>
</head>
<body><div id="app"><ul><li v-for="item of list" :key="item.proid">{{ item.proname }}</li></ul><input type="text" v-model="loginname"><input type="text" v-model="password"><button @click="login">登录</button></div>
</body>
<script src="lib/vue.js"></script>
<script>new Vue({el: '#app',data: {list: [],loginname: '15635878563',password: '123456'},mounted () {// get请求fetch('http://182.44.11.110/api/pro/list?limitNum=1').then(res => res.json()) // 需要把promise的对象转换为json对象.then(res => {console.log(res)this.list = res.data})},methods: {// post请求login () {fetch('http://http://182.44.11.110/api/user/login', {method: 'post',body: JSON.stringify({ loginname: this.loginname, password: this.password }),headers: {'Content-Type': 'application/json'}}).then(res => res.json()).then(res => {console.log(res)})}}})
</script>
</html>

1.4 axios

1.4.1 基本使用

文档:https://www.kancloud.cn/yunye/axios/234845

axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和node.js中。axios是vue作者推荐使用

的网络请求库,它具有以下特性:

  • 支持浏览器和node.js

  • 支持promise

  • 能够拦截 请求和响应

  • 自动转换json数据

axios的浏览器支持

在使用axios之前需要在对应的模板文件中引入axiosjs库文件,随后按照以下用法使用axios:

// GET请求方式 
axios.get('/get_data?id=10010').then(ret => console.log(ret.data))
​
axios.get('/get_data',{ params: { id: 10010, name: 'zhangsan', age: 26 } }).then(ret => console.log(ret.data)) 
​
//POST请求方式 
axios.post('/set_data', { firstName: 'zhang', lastName: 'san' 
}).then(ret => { }) 
​
axios({ method: 'post', url: 'set_data', timeout: 1000, headers: {'X-Custom-Header': 'foobar'}, data: { firstName: 'zhang', lastName: 'san' } 
}).then(ret => { })

当然axios除了支持传统的 GET 和 POST 方式以外,常见的请求方式还支持:

  • put:修改数据

  • delete:删除数据

以上方的axios请求示例为例,axios响应结果( ret )的主要属性有:

  • data:实际响应回来的数据(最常用)**

  • headers:响应头信息

  • status:响应状态码

  • statusText:响应状态信息

另外需要注意的是,在使用axios发送请求之前它允许我们通过全局配置做一些设置,这样可以方便后续的请求操作,例如:

  • axios.defaults.timeout = 3000【设置超时时间】

  • axios.defaults.baseURL = 'http://localhost/app'【设置默认地址】

  • axios.defaults.headers['token'] = '123123123'【设置请求头信息,通用头信息】

    • axios.defaults.headers.get['_token'] = '123123'

    • axios.defaults.headers.post['_token'] = '123123'

    • axios.defaults.headers.common['_token'] = '123123'【通用头信息,common可以不写】

注意:

axios发送post请求的时候,默认发送json格式数据

如果需要发送post表单类型请求,则需要指定请求头

axios.post('college',{ username: 'zhangsan', age: 22 
},{ headers: { "Content-Type": "application/x-www-form-urlencoded" } 
}).then(ret => this.list = ret.data.list)

使用axios方式改写 XHR 部分案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>07 axios</title>
</head>
<body><div id="app"><ul><li v-for="item of list" :key="item.proid">{{ item.proname }}</li></ul><input type="text" v-model="loginname"><input type="text" v-model="password"><button @click="login">登录</button></div>
</body>
<script src="lib/vue.js"></script>
<script src="lib/axios.min.js"></script>
<script>// http://121.89.205.189/apidoc/new Vue({el: '#app',data: {list: [],loginname: '18813007814',password: '123456'},mounted () {// get请求// fetch('http://182.44.11.110/api/pro/list?limitNum=1')//   .then(res => res.json()) // 需要把promise的对象转换为json对象//   .then(res => {//     console.log(res)//     this.list = res.data//   })// axios.get('http://182.44.11.110/api/pro/list')//   .then(res => {//     console.log(res)//     this.list = res.data.data//   })// axios.get('http://182.44.11.110/api/pro/list?limitNum=2')//   .then(res => {//     console.log(res)//     this.list = res.data.data//   })axios.get('http://182.44.11.110/api/pro/list', { // 推荐使用他传递参数params: {limitNum: 3}}).then(res => {console.log(res)this.list = res.data.data})},methods: {// post请求login () {// fetch('http://182.44.11.110/api/user/login', {//   method: 'post',//   body: JSON.stringify({ loginname: this.loginname, password: this.password }),//   headers: {//     'Content-Type': 'application/json'//   }// }).then(res => res.json())//   .then(res => {//     console.log(res)//   })axios.post('http://182.44.11.110/api/user/login', {loginname: this.loginname,password: this.password}).then(res => {console.log(res)})}}})
</script>
</html>

1.4.2 拦截器

目的:在请求 发出去之前 / 收到响应之后 做一些操作

请求拦截器

axios.interceptors.request.use(function(config){ // 在请求发出去之前进行一些信息设置 return config; 
},function(err){ // 处理响应的错误信息 
});

响应拦截器

axios.interceptors.response.use(function(res){ // res为axios对象 return res; 
},function(err){ // 处理响应的错误信息 
});
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="app"><ul><li v-for="(item,index) of list" :key = "index">{{ item.area }}</li></ul></div>
</body>
<script src="lib/vue.js"></script>
<script src="lib/axios.min.js"></script>
<script>axios.interceptors.request.use(function(config){ // 在请求发出去之前进行一些信息设置 console.log('loading......')return config; },function(err){ // 处理响应的错误信息 });
​axios.interceptors.response.use(function(res){ // res为axios对象 console.log('loading end')return res; },function(err){ // 处理响应的错误信息 });new Vue({el: '#app',data: {list: []},mounted () {// axios.get('https://api.i-lynn.cn/college')//   .then(res => {//     console.log(res)//     this.list = res.data.data.list//   })axios({url: 'https://api.i-lynn.cn/college',method: 'GET',headers: {'content-type': 'application/json'}}).then(res => {console.log(res)this.list = res.data.data.list})}})
</script>
</html>

总结

通过本文的介绍,我们从最基础的 XMLHttpRequest 逐步过渡到了现代的 Axios,每一种请求方式都有其独特的优势和适用场景。XMLHttpRequest 虽然历史悠久,但依然在某些场景下有其价值;jQuery 简化了兼容性问题,但引入了额外的库;fetch 是原生的现代 API,简洁且功能强大;Axios 则是 Vue 官方推荐的库,支持 Promise,使用起来非常方便。希望本文能帮助你在实际项目中选择合适的网络请求方式。

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

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

相关文章

计算机毕业设计Python+大模型美食推荐系统 美食可视化 美食数据分析大屏 美食爬虫 美团爬虫 机器学习 大数据毕业设计 Django Vue.js

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Element UI 打包探索【2】

目录 第三个命令 第四个命令 第五个命令 第六个命令 第七个命令 cross-env BABEL_ENV babel 第八个命令 总结 书&#x1f4da;接上文Element UI 打包探索【1】我们继续来看 第三个命令 "lint": "eslint src/**/* test/**/* packages/**/* build/**/* …

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

游戏引擎学习第23天

实时代码编辑功能的回顾 当前实现的实时代码编辑功能已经取得了显著的成功&#xff0c;表现出强大的性能和即时反馈能力。该功能允许开发者在修改代码后几乎立即看到变化在运行中的程序中体现出来&#xff0c;极大提升了开发效率。尽管目前的演示内容较为简单&#xff0c;呈现…

【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法

课程链接 线性回归的从零开始实现 import random import torch from d2l import torch as d2l# 人造数据集 def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.01,y.shape) # 加入噪声return X,y.reshape…

基于Spring Boot+Unipp的博物馆预约小程序(协同过滤算法、二维码识别)【原创】

&#x1f388;系统亮点&#xff1a;协同过滤算法、二维码识别&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框…

什么是 WPF 中的依赖属性?有什么作用?

依赖属性&#xff08;Dependency Property&#xff09;是 WPF 的一个核心概念&#xff0c;它为传统的 .NET 属性提供了增强功能&#xff0c;支持绑定、样式、动画和默认值等功能。通过依赖属性&#xff0c;WPF 提供了一种灵活的数据驱动的方式来处理 UI 属性。 1. 什么是依赖属…

【TS】TypeScript基本使用

什么是TypeScript&#xff1f; 是一种编程语言&#xff0c;是JavaScript的超集&#xff0c;过添加静态类型、类、接口和模块等功能&#xff0c;使得在大型应用程序中更容易进行维护和扩展&#xff0c;可以编译成纯JavaScript 静态类型和动态类型有什么区别&#xff1f; 静态…

git 命令之只提交文件的部分更改

git 命令之只提交文件的部分更改 有时&#xff0c;我们在一个文件中进行了多个更改&#xff0c;但只想提交其中的一部分更改。这时可以使用 使用 git add -p 命令 Git add -p命令允许我们选择并添加文件中的特定更改。它将会显示一个交互式界面&#xff0c;显示出文件中的每个更…

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现

深度学习网络模型 MobileNet系列MobileNet V1、MobileNet V2、MobileNet V3网络详解以及pytorch代码复现 1、DW卷积与普通卷积计算量对比DW与PW计算量普通卷积计算量计算量对比 2、MobileNet V1MobileNet V1网络结构MobileNet V1网络结构代码 3、MobileNet V2倒残差结构模块倒残…

[极客大挑战 2019]BabySQL--详细解析

信息搜集 进入界面&#xff1a; 输入用户名为admin&#xff0c;密码随便输一个&#xff1a; 发现是GET传参&#xff0c;有username和password两个传参点。 我们测试一下password点位能不能注入&#xff1a; 单引号闭合报错&#xff0c;根据报错信息&#xff0c;我们可以判断…

C 语言面向对象

面向对象的基本特性&#xff1a;封装&#xff0c;继承&#xff0c;多态 1.0 面向过程概念 当我们在编写程序时&#xff0c;通常采用以下步骤&#xff1a; 1. 将问题的解法分解成若干步骤 2. 使用函数分别实现这些步骤 3. 依次调用这些函数 这种编程风格的被称作 面向过程…

VMware16安装macOS12【详细教程】

因为在应用上线IOS应用商店时&#xff0c;需要用到mac系统进行&#xff0c;于是就在VMware16pro虚拟机进行安装macOS12系统&#xff0c;安装的过程做了一个记录&#xff0c;希望对你有所帮助&#xff01; 前言 首先需要下载好下面工具&#xff1a; VMware workstation pro 16…

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析

在数字科技日新月异的今天&#xff0c;视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台&#xff0c;提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务&#xff0c;广泛应用于…

【Python】分割秘籍!掌握split()方法,让你的字符串处理轻松无敌!

在Python开发中&#xff0c;字符串处理是最常见也是最基础的任务之一。而在众多字符串操作方法中&#xff0c;split()函数无疑是最为重要和常用的一个。无论你是Python新手&#xff0c;还是经验丰富的开发者&#xff0c;深入理解并熟练运用split()方法&#xff0c;都将大大提升…

从 Llama 1 到 3.1:Llama 模型架构演进详解

编者按&#xff1a; 面对 Llama 模型家族的持续更新&#xff0c;您是否想要了解它们之间的关键区别和实际性能表现&#xff1f;本文将探讨 Llama 系列模型的架构演变&#xff0c;梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程&#xff0c;深入剖析了每个版本的技术创新&#…

【Qt】QComboBox设置默认显示为空

需求 使用QComboBox&#xff0c;遇到一个小需求是&#xff0c;想要设置未点击出下拉列表时&#xff0c;内容显示为空。并且不想在下拉列表中添加一个空条目。 实现 使用setPlaceholderText()接口。我们先来看下帮助文档&#xff1a; 这里说的是&#xff0c;placeholderText是…

mysql根据日期查询没有的日期也要显示数据

先查询出日期数据(当前日期往前推12个月) select bb.datefrom (select num : num 1,date_format(adddate(date_sub(date_sub(curdate(),interval 12 month),interval 1 month),interval num month), %Y-%m) as datefrom mysql.help_topic,(select num : 0) as twhere addd…

非root用户安装CUDA

1.使用nvidia-smi查看当前驱动支持的最高CUDA版本&#xff1a; 表示当前驱动最多支持cuda12.1 2.进入cuda安装界面&#xff0c;https://developer.nvidia.com/cuda-toolkit-archive&#xff0c;选择想要安装的版本&#xff0c;例如想要安装CUDA11.4&#xff1a; 如果需要查看ub…

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域&#xff0c;我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备&#xff0c;声称能够彻底改变我们对健康和健身的方式。 然而&#xff0c;在这些光鲜的外观和营销宣传背后&#xff0c;隐藏着一个令人担忧的现实&#xff1a;大多数这些…