博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈fetch
阅读量:5893 次
发布时间:2019-06-19

本文共 3025 字,大约阅读时间需要 10 分钟。

在开发过程中,我们向服务端发送请求,一般会使用三种方式, XMLHttpRequest(XHR),jQuery实现的AJAX,Fetch ,让我们首先来比较一下这三者的使用示例。

XMLHttpRequest

var xhr;if (window.XMLHttpRequest) {  // Mozilla, Safari...  xhr = new XMLHttpRequest(); } else if (window.ActiveXObject) { // IE  try {  xhr = new ActiveXObject('Msxml2.XMLHTTP');   } catch (e) {   try {   xhr = new ActiveXObject('Microsoft.XMLHTTP');   } catch (e) {}   } } if (xhr) {  xhr.onreadystatechange = onReadyStateChange;   xhr.open('POST', '/api', true);   // 设置 Content-Type 为 application/x-www-form-urlencoded   // 以表单的形式传递数据  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');   xhr.send('username=admin&password=root'); } // onreadystatechange 方法 function onReadyStateChange() {   // 该函数会被调用四次  console.log(xhr.readyState);  if (xhr.readyState === 4) {    // everything is good, the response is received   if (xhr.status === 200) {    console.log(xhr.responseText);   } else {    console.log('There was a problem with the request.');    }  } else {   // still not ready   console.log('still not ready...');  } }

从上边的代码可以看出,XMLHttpRequest 是一个非常粗糙的API,不符合关注分离(Separation of Concerns)的原则,配置和调用方式非常混乱,前端程序员们不仅要做各个浏览器的兼容性,还饱受回调地狱的折磨,这显然不是一个好的选择。我们在发送请求的时候并不希望去关注请求open,请求send....XMLHttpRequest并没有对这些做封装,我们只关注请求是否成功,返回值是啥。

jQuery实现AJAX

$.ajax({    method: 'POST',    url: '/api', data: { username: 'admin', password: 'root' } }) .done(function(msg) { alert( 'Data Saved: ' + msg ); });

jQuery作为一个使用人数最多的库,其AJAX很好的封装了原生AJAX的代码,在兼容性和易用性方面都做了很大的提高,而且jQuery还把jsonp装在了AJAX里面,这样我们就可以开心的跨域了!!!!对比原生AJAX的实现,使用jQuery实现的AJAX就异常简单了.

但是,笔锋一转,我们仍然逃脱不了一个问题,回调地狱。。。。

Fetch

fetch(...).then(fun2)          .then(fun3) //各依赖有序执行          .....          .catch(fun)

从上边的代码可以看出,fetch用起来想jQuery一样简单,虽然还是有Callback的影子,但是看起来舒服多了


详解Fetch API

兼容性

注意:由于Fetch API是基于Promise设计,旧浏览器不支持Promise,需要使用pollyfill

  1. Fetch使用说明
fetch(url, options).then(function(response) { // handle HTTP response }, function(error) { // handle network error })

说明:

a. fetch api返回的是一个promise对象
b.Options:

  • method(String): HTTP请求方法,默认为GET
  • body(String): HTTP的请求参数
  • headers(Object): HTTP的请求头,默认为{}
  • credentials(String): 默认为omit,忽略的意思,也就是不带cookie;还有两个参数,same-origin,意思就是同源请求带cookie;include,表示无论跨域还是同源请求都会带cookie

c.第一个then函数里面处理的是response的格式,这里的response具体如下:

image.png
  • status(number): HTTP返回的状态码,范围在100-599之间
  • statusText(String): 服务器返回的状态文字描述,例如Unauthorized,上图中返回的是Ok
  • ok(Boolean): 如果状态码是以2开头的,则为true
  • headers: HTTP请求返回头
  • body: 返回体,这里有处理返回体的一些方法
    • text(): 将返回体处理成字符串类型
    • json(): 返回结果和 JSON.parse(responseText)一样
    • blob(): 返回一个Blob,Blob对象是一个不可更改的类文件的二进制数据
    • arrayBuffer()
    • formData()
  1. Fetch常见坑
  • 兼容性
image.png

如caniuse所示,IE浏览器完全不支持fetch,移动端的很多浏览器也不支持,所以,如果要在这些浏览器上使用Fetch,就必须使用fetch polyfill

  • cookie传递
    必须在header参数里面加上credientials: 'include',才会如xhr一样将当前cookies带到请求中去
  • fetch和xhr的不同
    fetch虽然底层,但是还是缺少一些常用xhr有的方法,比如能够取消请求(abort)方法
    fetch在服务器返回4xx、5xx时是不会抛出错误的,这里需要手动通过,通过response中的ok字段和status字段来判断
  1. 实践总结
    我们在实际应用中虽然会因为它没有interceptor等原因还需要再封装一层,但fetch api仍然不失为一个非常赞的API。。。。

4.参考

作者:瓦斯程序媛
链接:https://www.jianshu.com/p/35123b048e5e

转载于:https://www.cnblogs.com/zytrue/p/8567838.html

你可能感兴趣的文章
Netty实现HTTP服务器端(二)
查看>>
FolderPane
查看>>
CentOS 6.4 安装RBTools 报错 ImportError: Entry point ('console_scripts', 'easy_install') not found...
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
java描述学生
查看>>
如何取未知Json字符串 某个主键取对应的Value
查看>>
Java基础学习总结(4)——对象转型
查看>>
迁移home分区
查看>>
Git使用详细教程
查看>>
linux 查看进程使用(打开)的文件
查看>>
Java基础学习总结(9)——this关键字
查看>>
提取用户下的所有表的表结构
查看>>
[IOI2018]组合动作——构造
查看>>
BZOJ1430小猴打架——prufer序列
查看>>
浅谈IT路的职业规划
查看>>
Webtoos 仿Q+云桌面框架
查看>>
Liunx查找命令解析与分析
查看>>
10条命令,1分钟时间检查Linux服务器性能
查看>>
python一个发邮件的函数
查看>>
mailto用法
查看>>