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的更多相关文章

  1. 异步请求xhr、ajax、axios与fetch的区别比较

    目录 1. XMLHttpRequest对象 2. jQuery ajax 3. axios 4. fetch 参考 why: 为什么会出现不同的方法呢? what: 这些都是异步请求数据的方法.在不 ...

  2. ajax、axios、fetch区别及优缺点

    将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...

  3. vue 搭建框架到安装插件依赖,Element、axios、qs等

    一.使用vue 单页面开发,首先要安装好本地环境 步骤如下: 1 下载nodejs 安装 (此时npm 和 node环境都已经装好)2 安装淘宝镜像 npm install -g cnpm --reg ...

  4. 前端向后端获取数据的三种方法:ajax、axios、fetch

    1.jQuery中的ajax get方法: $.ajax({ url:"v4/api/film/now-playing?t=1539401039415&page=1&coun ...

  5. ajax、axios、fetch 对比

    前言 今天在看到一个比较好的插件,写一个示例时,由于需要请求在线数据,官方给的是用 $.get(),就为了一个示例使用 JQuery 没必要. 又找了找,发现有用 fecth 的,挺方便,这里就做一个 ...

  6. 快速搭建react项目骨架(按需加载、redux、axios、项目级目录等等)

    一.前言 最近整理了一下项目骨架,顺便自定义了一个脚手架,方便日后使用.我会从头开始,步骤一步步写明白,如果还有不清楚的可以评论区留言.先大致介绍一下这个骨架,我们采用 create-react-ap ...

  7. Vuex、axios、跨域请求处理和import/export的注意问题

    一.Vuex 1.介绍 vuex是一个专门为Vue.js设计的集中式状态管理架构. 对于状态,我们把它理解为在data中需要共享给其他组件使用的部分数据. Vuex和单纯的全局对象有以下不同: 1. ...

  8. Vue框架(四)——路由跳转、路由传参、cookies、axios、跨域问题、element-ui模块

    路由跳转 三种方式: $router.push / $router.go / router-link to this.$router.push('/course'); this.$router.pus ...

  9. [前端] VUE基础 (9) (element-ui、axios、Vuex)

    一.element-ui的使用 官方网页:https://element.eleme.cn/#/zh-CN 1.安装element-ui (venv) D:\pycharm_workspace\vue ...

随机推荐

  1. 使用 Spring 通过什么方式访问 Hibernate?

    在 Spring 中有两种方式访问 Hibernate:控制反转 Hibernate Template 和 Callback.继承 HibernateDAOSupport 提供一个 AOP 拦截器.

  2. 学习SVN02

    代码发布方案: 1,安装,优化 软件环境,(nginx,lvs)  <-------运维工程师 2,程序代码(不断更新).   <--------开发工程师,(开发,运维都可以发布) 3, ...

  3. linux文本编辑器vim详解

    vim 1.打开文件 vim [option] - file... 打开文件 +# 打开文件后,让光标处于第#行的行首 +/字符串 打开文件后,光标处于第一个被匹配到字符串的行首 -b file 二进 ...

  4. Python - 本地文件读写(初级)

  5. 集合流之"交集(相同)和差集(区别的)"的使用

    一.需求 今天做的是将两个字符串转为数组后再转集合,然后利用集合的流stream来进行差集过滤 二.差集代码 差集:将两个集合相同的数据去掉,留下不同的数据 1 @Test 2 public void ...

  6. Python学习--Python的了解与安装

    Python简介: Python 是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python 由荷兰人Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 19 ...

  7. asp.net 可视化操作(二)——Sql数据库连接及简单查询功能的实现

    目录 连接数据库 利用repeater控件实现数据显示 查询功能 页面CSS美化 数据插入.更新-- 连接数据库 添加test.aspx 添加控件SqlDataSource,选择配置数据源 选择新建连 ...

  8. JS:数组中push对象,覆盖问题

    发现将对象push进数组,后面的值会覆盖前面的值,最后输出的都是最后一次的值.其实这一切都是引用数据类型惹的祸.如果你也有类似问题,可以继续看下去哦.下面代码模拟:将json对象的每个键值对,单独搞成 ...

  9. H5进阶篇--实现微信摇一摇功能

    在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...

  10. ES6-11学习笔记--数组的扩展

    类数组 / 伪数组 Array.from() Array.of() copyWithin() fill() includes()   类数组.伪数组例子: let divs = document.ge ...