xhr、$ajax、fetch、axios的异同

原生xhr对象

现代浏览器,最开始与服务器交换数据,都是通过XMLHttpRequest对象。它可以使用JSON、XML、HTML和text文本等格式发送和接收数据。

好处:

不重新加载页面的情况下更新网页

在页面已加载后从服务器请求/接收数据

在后台向服务器发送数据。

缺点:

使用起来也比较繁琐,需要设置很多值。

早期的IE浏览器有自己的内置对象,这样需要写兼容代码判断是否为XMLHttpRequest对象。


if (window.XMLHttpRequest) { // model browser

  xhr = new XMLHttpRequest()

} else if (window.ActiveXObject) { // IE 6 and older

  xhr = new ActiveXObject('Microsoft.XMLHTTP')

}

xhr.open('POST', url, true)

xhr.send(data)

xhr.onreadystatechange = function () {

  try {

    // TODO 处理响应

    if (xhr.readyState === XMLHttpRequest.DONE) {

      // XMLHttpRequest.DONE 对应值是 4

      // Everything is good, the response was received.

      if (xhr.status === 200) {

        // Perfect!

      } else {

        // There was a problem with the request.

        // For example, the response may hava a 404 (Not Found)

        // or 500 (Internal Server Error) response code.

      }

    } else {

      // Not ready yet

    }

  } catch (e) {

    // 通信错误的事件中(例如服务器宕机)

    alert('Caught Exception: ' + e.description)

  }

}




jQuery里的$.ajax

为了方便操作dom并避免一些浏览器兼容问题,产生了jquery,

它里面的AJAX请求也兼容了不同的浏览器,可以直接使用.get、.pist。它就是对XMLHttpRequest对象的一层封装

优点:

对原生XHR的封装,做了兼容处理,简化了使用。

增加了对JSONP的支持,可以简单处理部分跨域。

缺点:

如果有多个请求,并且有依赖关系的话,容易形成回调地狱。

本身是针对MVC的编程,不符合现在前端MVVM的浪潮。

ajax是jQuery中的一个方法。如果只是要使用ajax却要引入整个jQuery非常的不合理。




axios

Axios是一个基于promise的HTTP库,可以用在浏览器和 node.js 中。它本质也是对原生XMLHttpRequest的封装,只不过它是Promise的实现版本,符合最新的ES规范。

优点:

  1. 从浏览器中创建XMLHttpRequests

  2. 从 node.js 创建 http 请求

  3. 支持 Promise API

  4. 拦截请求和响应

  5. 转换请求数据和响应数据

  6. 取消请求

  7. 自动转换 JSON 数据

  8. 客户端支持防止CSPRF

  9. 提供了一些并发请求的接口

缺点:

只持现代代浏览器.


axios({

    method: 'post',

    url: '/userlist/all',

    data: {

      id: '1',

      page:1,

      limit: 20

    }

  })

  .then(res => console.log(res))

  .catch(err => console.log(err))




fetch

Fetch API提供了一个 JavaScript 接口,用于访问和操作HTTP管道的部分,例如请求和响应。它还提供了一个全局fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。

fetch是低层次的API,代替XHR,可以轻松处理各种格式,非文本化格式。可以很容易的被其他技术使用,例如Service Workers。但是想要很好的使用fetch,需要做一些封装处理。


fetch('http://acccess/.json')

  .then(function(response) {

    return response.json();

  })

  .then(function(myJson) {

    console.log(myJson);

  });

  //在配置中,添加mode: 'no-cors'就可以跨域了

  fetch('/users.json', {

    method: 'post',

    mode: 'no-cors',

    data: {}

}).then(function() { /* handle response */ });

优点:

  1. 语法简介,更加语义化

  2. 基于标准promise实现,支持async/await

  3. 更加底层,提供的API丰富(request,response)

  4. 脱离了XHR,是Es规范里新的实现方式

问题:

  1. 支队网络请求报错,也就是说只有网络错误这些导致请求不能完成时他才会调用reject,而对400,500这种错误它并不会reject

  2. 默认不会带cookie,需要添加配置项:fetch(url,{credentials:'include'})

  3. 不支持abort,不支持超时控制,使用setTimeout及promise.reject的实现的超时控制不能阻止请求过程继续在后台运行,会造成流量的浪费

  4. fetch没办法原生检测请求的进度,XHR可以

1 当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。

2 认情况下,fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项)。


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358