网络请求

248 阅读2分钟

image.png

控制台看到项目的接口请求分两类,一种是 fetch,一种是 xhr

之前面试被问到 fetch 一头雾水,以为是网络请求的英文,现在索性整理一下各种网络请求的区别

网络请求

网络请求分为同步请求和异步请求,同步请求会阻止代码的执行,在网络慢,请求响应时间长的情况下,
同步请求很容易导致页面无响应的情况,导致用户体验极差,所以一般来说异步请求是优于同步请求的

同步请求

image.png

在Worker中使用XMLHttpRequest时,同步请求比异步请求更适合.详见 MDN

异步请求

fetch

fetch 是原生的 http 请求,是一个异步请求

fetch() 必须接受一个参数——资源的路径。无论请求成功与否,它都返回一个 Promise 对象,
resolve 对应请求的 Response。你也可以传一个可选的第二个参数 init
fetch(myRequest)
.then(response => {
 if (response.status === 200) {
   return response.json();
 } else {
   throw new Error('Something went wrong on api server!');
 }
})
.then(response => {
 console.debug(response);
 // ...
}).catch(error => {
 console.error(error);
});

fetch 的缺点

1. 只支持异步
2. 只对网络请求报错,当接收的状态码为 4xx,5xx 等,返回的 promise 状态为 resolve,需要封装
3. 默认不带 cookie, 需要添加配置项
4. fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject的实现的超时控制
并不能阻止请求过程继续在后台运行,造成了量的浪费
5. fetch没有办法原生监测请求的进度,而XHR可以

使用 fetch 的其他库

 umi-request 和 dva 都是封装了 fetch。
 dva 首先是一个基于 redux 和 redux-saga 的数据流方案,然后为了简化开发体验,
 dva 还额外内置了 react-router 和 fetch,
 所以也可以理解为一个轻量级的应用框架。
 umi-request 是基于 fetch 封装的开源 http 请求库,旨在为开发者提供一个统一的 API 调用方式,
 同时简化使用方式

 dva 通过 model 的概念把一个领域的模型管理起来,包含同步更新 state 的 reducers,
 处理异步逻辑的 effects,订阅数据源的 subscriptions

axios

axios 是基于 promise 封装的 http 请求库,用于客户端和 Node.js

axios 的优缺点

从node.js创建http请求
在浏览器中创建XMLHttpRequest
支持Promise API
提供了一些并发请求的接口
支持拦截请求和响应
转换请求和响应数据
取消请求
自动转换JSON数据
客户端支持防御CSRF/XSRF

xhr

var xhr = new XMLHttpRequest();
xhr.open("GET", "/bar/foo.txt", true);
open 方法的第三个参数决定了请求是同步的还是异步的, true 为异步, false 为同步

参考

zhuanlan.zhihu.com/p/58062212

developer.mozilla.org/zh-CN/docs/…