ajax、axios、fetch
XMLHttpRequest:
XHR中文解释为:
可扩展超文本传输请求;XML可扩展标记语言,Http超文本传输协议,Request请求;
XHR对象用于与服务器交换数据,所有现代游览器都支持XHR对象;XHR对象可在不向服务器提交整个页面的情况下,实现局部更新网页。
XHR可以同步或异步返回Web服务器的响应;XHR可以接收任何形式的文本文档;
使用XMLHttpRequest:
创建XHR对象:
const xhr = new XHLHttpRequest();
准备发送请求:
xhr.open(method,url,async); -method:请求类型 GET、POST、PUT、DELETE;- url:地址, - async:异步true或同步false
发送请求:
xhr.send() -send(‘username=Du&age=18’)的参数是通过请求体携带的数据 (字符串);
-GET请求只能通过请求头携带;-POST请求主要通过请求体携带数据,也可以通过请求头
POST请求需要设置请求头: xhr.setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);
携带的数据如果是非英文字母,如汉字、对象等,需要经过编码再发送;编码:encodeURLComponent(***);解码:decodeURLComponent(***)
监听事件,处理响应:
获得响应后,会触发xhr对象的readystatechange事件;
xhr.onreadystatechange = () => {
if(xhr.readyState !==4) return;
if((xhr.status >=200 && xhr.status < 300) || xhr.status ===304){
console.log(xhr.responseText)}
}
}
这个事件监听readyState这个状态的变化:
- 0:未初始化。尚未调用open()
- 1:启动。已经调用open(),但尚未受到send()
- 2:发送。已经调用send(),但尚未接收到响应
- 3:接收。已经接收到部分响应数据
- 4:完成。已经接收到全部响应数据,而且已经可以在页面中使用
status:HTTP状态码
- 100-199:信息性的标示用户应该采取的其他动作。
- 200-299:表示请求成功。
- 300-399:用于那些已经移走的文件,常常包括Location报头,指出新的地址。
- 400-499:表明客户引发的错误。
- 500-599:由服务器引发的错误。
Ajax:
Ajax:是 Asynchronous JavaScript and XML (异步 JavaScript 和 XML) 的简写
Ajax中的异步:可以异步地向服务器发送请求,在等待响应地过程中,不会阻塞当前页面,游览器可以继续执行同步任务,在同步任务全部执行完成后,再处理任务队列中的结果
XML(可扩展标记语言):是前后端数据通信时传输数据的一种格式,XML现在已经不怎么使用了,比较常用的是JSON
Ajax想要实现游览器与服务器之间的异步通信,需要借助XMLHttpRequest (Ajax就是基于浏览器提供的XMLHttpRequest对象)
axios:
axios,基于Promise的网络请求库,作用于node.js(http模块)和游览器(XMLHttpRequest)中(它是isomorphic的,即同一套代码可以运行在游览器和node.js)
本质上也是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范;
特点:
- 从浏览器创建 XMLHttpRequests
- 从 node.js 创建 http 请求
- 支持 Promise API
- 拦截请求和响应
- 转换请求和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御XSRF(CSRF)
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.then(function () {
// 总是会执行
}); // 支持async/await用法
async function getUser() {
try {
const response = await axios.get('/user?ID=12345');
console.log(response);
} catch (error) {
console.error(error);
}
}
第二个参数和fetch一样都可以进行参数配置;
axios拦截器:
拦截器:分为请求(request)拦截器和响应(response)拦截器。
原理:创建一个数组,数组中保存了拦截器相应方法以及dispatchRequest(dispatchRequest这个函数调用才会真正的开始发起请求)
把请求拦截器的方法放到数组中dispatchRequest的前面,响应拦截器放到dispatchRequest的后面
为了保证它们的顺序,需要使用promise,以出队列的方式对数组中的方法挨个执行
应用场景:请求拦截器用于在接口请求之前做的处理,比如为每个请求带上相应的参数(token,时间戳等)
返回拦截器用于在接口返回之后做的处理,比如对返回的状态进行判断(token是否过期)
fetch:
fetch是一种HTTP数据请求方式,是XMLHttpRequest的一种替代方案
fetch函数就是原生js,没有使用XMLHttpRequest对象,
fetch()方法调用后返回一个Promise对象
fetch(url, {}).then(response => {
console.log(response);
if (response.ok || (response.status >= 200 && response.status <= 300)) {
return response.json()
} else {
throw new Error(`HTTP CODE异常${response.status}`);
}
}).then(data => {
console.log(data);
}).catch(err => {
console.log(err);
})
Response 对象的同步属性:请求成功后,得到一个Response对象,它对应服务器的HTTP回应:
Response.ok:返回一个布尔值,表示请求是否成功;true对应HTTP请求状态码200~299,false对应其他状态码
Response.status:返回HTTP状态码
注意:只有网络错误或者无法连接时,fetch()才会报错,其它情况都认为请求成功,也就是服务器返回的状态码是4xx或5xx也不会报错(Promise不会变成rejected)
Response.statusText:返回一个字符串,表示HTTP回应的状态信息,例如请求成功以后,预览器返回‘OK’
Response.url:返回请求的URL,若存在跳转则为最终的URL
Response.type:返回请求的类型
- basic:普通请求,即同源请求
- cors:跨域请求
- error:网络错误,主要用于Service Worker
- opaque:如果fetch()请求的type属性设为no-cors,就会返回这个值,详见请求部分。表示发出的是简单的跨域请求,类似<from>表单的那种跨域请求。
- opaqueredirect:如果fetch()请求的redirect属性设为manual,就会返回这个值,详见请求部分
Response.redirected:返回一个布尔值,表示请求是否发生过跳转
Response.header():指向一个Header对象,对应HTTP回应所有标头
- Heade.get():根据指定的键名,返回键值。
- Header.has(): 返回一个布尔值,表示是否包含某个标头。
- Header.set():将指定的键名设置为新的键值,如果该键名不存在则会添加。
- Header.append():添加标头。
- Header.delete():删除标头。
- Header.keys():返回一个遍历器,可以依次遍历所有键名。
- Header.values():返回一个遍历器,可以依次遍历所有键值。
- Header.entries():返回一个遍历器,可以依次遍历所有键值对([key,value])。
- Header.forEach():依次遍历标头,每个标头都会执行一次参数函数。
读取服务器返回的不同类型数据:
- response.text():得到文本字符串。
- response.json():得到 JSON 对象。
- response.blob():得到二进制 Blob 对象。
- response.forData():得到 FormData 表单对象。
- response.arrayBuffer():得到二进制 ArrayBuffer 对象,主要用于获取流媒体文件
上述5中读取方法都是异步的,返回的都是Promise对象,必须等异步任务结束后,才能得到服务器返回的完整数据
Response.clone():Stream对象只能读取一次,这意味着上面的5个读取方法只能使用一个,否则会报错;response.clone()创建Response对象副本,实现多次读取
Response.redirect():重定向到指定URL
Response.body():Response.body属性是Response对象暴露出的底层接口,返回一个ReadableStream对象,供用户操作;可用来读取内容,应用之一就是显示下载的进度
fetch()第二个参数:
const response = await fetch(url, {
method: 'POST',
headers: {
"Content-type": "application/x-www-form-urlencoded; charset=UTF-8", // 纯文本
"Content-Type": "application/json;charset=utf-8" // JSON
},
bodyUsed:ture // 只读一次
// body: 'foo=bar&lorem=ipsum', // POST请求体
// body: JSON.stringify(user), // 提交JSON数据
// body: new FormData(form), // 提交表单
body: blob // 二级制数据
}); const json = await response.json();
XMLHttpRequest的问题:
所有的功能全部集中在一个对象上,容易书写混乱而且不容易维护的代码;采用传统的事件驱动模式,无法适配新的Promise API
XHR对象不支持数据流,所有的数据必须放在缓存中,不支持分块读取,必须等待全部拿到后,再一次性吐出来
fetch API的特点:
精细的功能分割:头部信息,请求信息,响应信息等API分散在多个对象上(Response、Request、Headers对象),更利于处理各种复杂的数据交互场景;
支持Promise API,更利于异步代码的书写;在某些服务不需要cookie的场景下可以自定义不携带cookie,减少一些些流量
fetch()通过数据流(Stream对象)处理数据,可以分块读取,有利于提高网站性能表现,减少内存占用,对于请求大文件或者网速慢的场景效果很好。
参考:
https://www.cnblogs.com/wenkangIT/p/15230842.html
https://baike.baidu.com/item/axios/56933453?fr=aladdin
ajax、axios、fetch的更多相关文章
- 异步请求xhr、ajax、axios与fetch的区别比较
目录 1. XMLHttpRequest对象 2. jQuery ajax 3. axios 4. fetch 参考 why: 为什么会出现不同的方法呢? what: 这些都是异步请求数据的方法.在不 ...
- ajax、axios、fetch区别及优缺点
将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...
- vue 搭建框架到安装插件依赖,Element、axios、qs等
一.使用vue 单页面开发,首先要安装好本地环境 步骤如下: 1 下载nodejs 安装 (此时npm 和 node环境都已经装好)2 安装淘宝镜像 npm install -g cnpm --reg ...
- 前端向后端获取数据的三种方法:ajax、axios、fetch
1.jQuery中的ajax get方法: $.ajax({ url:"v4/api/film/now-playing?t=1539401039415&page=1&coun ...
- ajax、axios、fetch 对比
前言 今天在看到一个比较好的插件,写一个示例时,由于需要请求在线数据,官方给的是用 $.get(),就为了一个示例使用 JQuery 没必要. 又找了找,发现有用 fecth 的,挺方便,这里就做一个 ...
- 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)
一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...
- Vuex、axios、跨域请求处理和import/export的注意问题
一.Vuex 1.介绍 vuex是一个专门为Vue.js设计的集中式状态管理架构. 对于状态,我们把它理解为在data中需要共享给其他组件使用的部分数据. Vuex和单纯的全局对象有以下不同: 1. ...
- Vue框架(四)——路由跳转、路由传参、cookies、axios、跨域问题、element-ui模块
路由跳转 三种方式: $router.push / $router.go / router-link to this.$router.push('/course'); this.$router.pus ...
- [前端] VUE基础 (9) (element-ui、axios、Vuex)
一.element-ui的使用 官方网页:https://element.eleme.cn/#/zh-CN 1.安装element-ui (venv) D:\pycharm_workspace\vue ...
随机推荐
- spring-boot-learning-配置文件相关
Spring-boot的配置文件 springboot通过那个下面的依赖去读取配置文件的上下文: <!-- https://mvnrepository.com/artifact/org. ...
- Kube-OVN:大型银行技术团队推荐的金融级云原生网络方案
近日,由TWT社区主办的2021容器云职业技能大赛团队赛的冠军作品:<适用于大中型银行的云原生技术体系建设方案>中,Kube-OVN成为银行技术团队推荐的金融级云原生网络最佳实践.本文部分 ...
- CommonsCollection2反序列链学习
CommonsCollection2 1.前置知识 CmonnosCollection2需要用到Javassist和PriorityQueue 1.1.Javassist Javassist是一个开源 ...
- 机器学习 machine learn
机器学习 机器学习 概述 什么是机器学习 机器学习是一门能够让编程计算机从数据中学习的计算机科学.一个计算机程序在完成任务T之后,获得经验E,其表现效果为P,如果任务T的性能表现,也就是用以衡量的P, ...
- Numpy怎样给数组增加一个维度
Numpy怎样给数组增加一个维度 背景:很多数据计算都是二维或三维的,对于一维的数据输入为了形状匹配,经常需升维变成二维 需要:在不改变数据的情况下,添加数组维度:(注意观察这个例子,维度变了,但数据 ...
- Altium Designer PCB文件的绘制(下:PCB布线和检查)
在完成电路板的布局工作后,就可以开始布线操作了.在PCB的设计中,布线是完成产品设计的最重要的步骤,其要求最高.技术最细.工作量最大.PCB布线可分为单面布线.双面布线.多层布线.布线的方式有自动布线 ...
- 一整套PCB设计流程和要点,老板再也不怕我出错!
资料输入阶段 1. 在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件) 2. 确认PCB模板是最新的 3. 确 ...
- 从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命
本系列文章对应游戏代码已开源 Sinuous game. 每个游戏都会包含场景和角色.要实现一个游戏角色,就要清楚角色在场景中的位置,以及它的运动规律,并能通过数学表达式表现出来. 场景坐标 canv ...
- .Net Core:Docker无法拉取mcr.microsoft.com相关镜像解决办法
今天在教同事Docker简单部署Asp.Net Core项目,pull镜像时突然出现下图中的错误: 因为微软在 2018 年五月之后,只会将相关镜像打包发布到 MCR 上.但是 MCR 对国内用户不太 ...
- Android打开数据库读取数据
打开数据库读取数据 private MyDatabaseHelper dbHelper; dbHelper=new MyDatabaseHelper(this,"List.db", ...