浏览器 JavaScript HTTP 库的大比拼:SugerAgent VS Axios

Ajax 请求在现代网站中大量使用。除了使用执行Ajax请求的内置方法(XMLHttpRequest)外,许多开发人员使用jQuery的方法来执行相同的任务。在这篇文章中,我们将介绍两个允许您实现相同目标的备选库。SuperAgent 和 Axios。为了比较它们,我们将对虚拟 HTTP 服务执行一些请求。

简介

Request请求实例可以执行同步或异步请求。JavaScript 是单线程的,因此同步请求会阻止要执行的其他操作。因此,我们实际上从来不使用它们。本文中介绍的库,axios 和superagent,始终执行异步请求。由于您的代码在浏览器在后台执行请求时继续运行,因此无法马上获取响应。您必须提供一个函数来调用服务器响应准备就绪时,通常称为回调,它将处理响应。

为了处理这个过程,Axios返回一个Promise。相反,SuperAgent的 API 不符合任何标准。因此,就这个功能,我们可以说,Axios比SuperAgent更好。优点是,您可以将 axios 返回的Promise与其他库的承诺或使用内置 JavaScript 对象创建的承诺相结合。如果你需要一个Promise的入门教程,你可以阅读本教程。

另一方面,SuperAgent更广为人知,并且围绕它有一个小的插件生态系统(例如,SuperAgent 前缀,以添加一个前缀到所有 URL)。

当您希望使用基本 POST/PUT/GET 功能与 API 通信时,Axios 和SuperAgent是最合适的。例如,它们不支持像在现代浏览器中那样监视上传进度。它们的主要优点是,只需链接几个函数调用,就可以配置和发送请求。

如何安装库

XMLHttpRequest无需安装。所有现代浏览器,从IE浏览器8开始实现。SuperAgent作为npm模块和组件模块进行分发。要使用 npm 安装SuperAgent,您需要先安装它。npm 附带标准Node.js或io.js安装程序,因此,如果您已经安装了 Node.js/io.js,您应该可以自行操作,或者应该安装您喜欢的其中任何一个。接下来,您需要使用客户端打包解决方案(如浏览器化)在文件中包含。如果您没有任何经验,SitePoint 已经发布了一个教程,其中讨论了浏览器化的功能。

axios 作为 npm 模块、AMD 模块和导出全局对象的普通 JavaScript 文件进行分发。你可以从轴希希布存储库下载他们全部。

示例 API

我们的示例 API 是面包店的订单管理服务。客户端可以通过执行 GET 请求按日期搜索订单,如下所示:

/orders?start=2015-03-23&end=2015-03-24

客户端还可以通过执行 POST 请求创建新订单:

/orders

服务器在 GET 请求时返回的数据以及网站为创建新订单而发送的数据使用 JSON 格式提供。例如,如果当前日期为 5 月 4 日,并且客户需要在 3 月 10 日交付 3 个巧克力蛋糕和 5 个柠檬蛋糕,您可以发送如下 JSON 对象:

{"chocolate": "3","lemon": "5","delivery": "2015-03-10","placed": "2015-03-04"
}

我们的目标是创建一个新订单,并检索在特定日期范围内下订单。

创建新订单

要创建订单,我们需要指定:

  1. 请求方法(POST)
  2. 请求 URL (/orders)
  3. 请求正文(我们的订单详情为 JSON 格式)
  4. 请求正文内容类型 (application/json)

指定正文内容类型是一种好的做法:服务器可以从请求标头中确定如何分析正文。

我们为每个配置参数配置具有专用方法的SuperAgent请求,然后调用发送请求。函数将回调作为处理响应的参数。如果第一个回调参数为真,则发生错误。让我们看一个例子:end()end()

var request = require('superagent');request.post('/orders/').send({'chocolate': 2, 'placed': '2015-04-26'}).type('application/json').accept('json').end(function(err, res) {if (err) {console.log('Error!');} else {console.log(res.body);}});

axios 将 URL 作为第一个参数,将请求正文作为第二个参数,将所有剩余配置作为第三个参数。若要处理响应,可以指定两个回调:一个用于成功案例(我将把它传递给 )另一个用于错误案例(我将把它传递给 )。使用示例如下所示:thencatch

axios.post('/orders/',{chocolate: 2,placed: '2015-04-26'},{headers:{'Content-type': 'application/json','Accept': 'application/json'}}
).then(function(response) {console.log(response.data);}).catch(function(response) {console.log('Error!)});

为了使用 实现相同的目标,我们在 函数中配置 HTTP 方法和 URL。然后,我们将响应回调附加到处理程序并调用以发送请求。使用示例如下所示:XMLHttpRequestopen()onloadsend

var xhr = new XMLHttpRequest();// The last parameter must be set to true to make an asynchronous request
xhr.open('POST', '/orders/', true);xhr.setRequestHeader('Content-type', 'application/json');
xhr.setRequestHeader('Accept', 'application/json');
xhr.onload = function() {if (xhr.status >= 200 && xhr.status < 300) {console.log(xhr.response);} else {console.log('Error !');}
};
xhr.send();

浏览器将响应数据附加到对象本身。要知道是否发生了错误,我们必须分析响应状态,并按我们喜欢的方式对其进行管理。在这种情况下,我记录在成功状态(从 200 到 299)时返回的响应;字符串,否则。XMLHttpRequest'Error !'

基于日期范围检索订单

要检索在日期范围内下订单,我们将设置 一个 和 查询参数。SuperAgent函数采用包含查询参数及其值的对象:startendquery()

request.get('/orders').query({start: '2015-04-22', end: '2015-04-29'}).accept('json').end(function(err, res) {if (err) {/* Handle error */}  else {/* Handle response */}
});

axios 使用配置对象中的键:params

axios.get('/orders',{headers: {'Accept': 'application/json'},params: {start: '2015-04-22',end: '2015-04-29'}}
);

查询字符串不应包含某些字符,特别是 和 。Axios和SuperAgent都小心地为你转义查询参数。&=?

使用 ,您需要使用查询字符串的键值对上的内置函数手动转义组件。下面你可以找到一个示例,说明如何做到这一点,即使对于这个特定情况来说,这是多余的:XMLHttpRequestencodeURIComponent()

var xhr = new XMLHttpRequest();
xhr.open('GET', '/orders?start=' +encodeURIComponent('2015-04-22') + '&end=' +encodeURIComponent('2015-04-29'), true);

建议

虽然Axios使用Promise,但代码看起来几乎与SuperAgent相同。使用SuperAgent,您可以使用专用方法设置内容类型,但使用 axios 时,您需要小心避免标题名称中的拼写错误。

SuperAgent和Axios根据内容类型自动对请求体进行去计算。可以通过在实例上设置属性来实现相同的目标。它们还将所有非 200 响应作为错误处理,同时通过允许您管理状态代码,然后采取相应操作来提供更大的灵活性。

SuperAgent和Axios在服务器上也起作用。然而,在我看来,SuperAgent有最令人愉快的API。但是,如果你想要Promise,Axios是你最好的选择。

最后一点,如果你可以自己处理浏览器差异或只是针对现代浏览器,是Fetch。

好吧,其实superagent也是支持Promise的,而且使用async await,用起来爽的很。个人更喜欢superagent。

结论

在这篇文章中,我们了解如何使用原始、简单的 REST API 通信。这三种解决方案提供等效功能,但具有它们自身的特点。如果您使用现代浏览器,可以依赖 。 并且是方便的,如果您希望避免处理旧版本的 Internet 资源管理器,并在服务器上使用相同的 API。

如果你想玩本文中显示的代码,你可以访问我创建的GitHub存储库。

翻译来源:https://www.sitepoint.com/comparison-javascript-http-libraries/

浏览器 JavaScript HTTP 库的大比拼:SugerAgent VS Axios相关推荐

  1. 适用于任何数据可视化需求的国外10个最佳JavaScript图表库

    如今,数据量呈指数级增长,我们看到的信息越多,处理它的难度就越大.这就是为什么我们需要数据可视化--在图表和仪表板中,最好是交互式的.它帮助我们人类节省了大量时间和精力来查看,分析和理解数据,并根据这 ...

  2. 2019年11个值得研究的Javascript机器学习库

    https://www.toutiao.com/a6669159846014616071/ 虽然大部分机器学习都是用python这样的语言完成的,但在Javascript生态系统中,其前端和后端社区都 ...

  3. 向 Web 开发人员推荐35款 JavaScript 图形图表库

    图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web 应用和项目的可靠性. 在这篇文章中,我们收集了3 ...

  4. js中的new file_深受 Pandas 启发的 JavaScript 开源库 — Danfo.js 现已推出!

    特邀博文 / 独立研究员 Rising Odegua 与来自 Data Science Nigeria 的 Stephen Oni Danfo.js 是个 JavaScript 开源库,提供了高性能. ...

  5. 网页制作中最有用的免费Ajax和JavaScript代码库

    本文中,小编整理了12个免费的Ajax和JavaScript代码库,可以帮助Web开发人员将应用程序提升到一个新水平. Ajax Instant Messenger 它是最流行和常用的Ajax代码解决 ...

  6. Moo.fx 超级轻量级的 javascript 特效库

    Moo.fx是 一个超级轻量级的 javascript 特效库(7k),能够与 prototype.js 或mootools 框架一起使用.它非常快.易于使用.跨浏览器.符合标准,提供控制和修改任何 ...

  7. javascript高级程序设计pdf_2019年最好的JavaScript图表库

    作者 | arthur puszynski 来源 | Medium 编辑 | 代码医生团队 首先,简要介绍一下: 随着数据收集和使用持续呈指数级增长,对这些数据进行可视化的需求变得越来越重要.开发人员 ...

  8. 美观又实用,10 款强大的开源 Javascript 图表库

    2019独角兽企业重金招聘Python工程师标准>>> 随着发展,现代 Web 设计在改善体验和功能的同时,对于美观的追求也越来越高,可视化.交互式.动态等元素和效果似乎已成为标配. ...

  9. 开源的数据可视化JavaScript图表库:ECharts

    ECharts (Enterprise Charts 商业产品图表库)是基于HTML5 Canvas的一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽 ...

最新文章

  1. 《因果学习周刊》第8期:因果反事实预测
  2. 计算机网络或计算机基础知识点滴1
  3. python没有英语基础的好学吗-Python好学吗难不难?0基础能学会吗?
  4. 摘要:ASP.NET的路由
  5. mvc:annotation-driven/
  6. esxi直通 gen8_HP MicroServer Gen8与ESXI采坑之旅
  7. 671. 二叉树中第二小的节点
  8. P1110 [ZJOI2007]报表统计
  9. Hibernate杂问
  10. 正式环境docker部署hyperf_忍受不了 docker 环境下 hyperf 启动等待时间,教你如何通过 win10 子系统快速运行 hyperf...
  11. MATLAB函数调用
  12. 管螺纹如何标注_螺纹知识,这一次搞全了!
  13. python强制删除文件夹_对Python各种删除文件失败的处理方式-强制删除文件
  14. 物联网、大数据、云计算、人工智能之间的关系
  15. SAR图像滤波去噪效果评价研究
  16. 【Proteus仿真】6位数码管秒计数器(0-999999S)
  17. 编一程序,将两个字符串连接起来,不要用strcat函数。C语言
  18. 掌握茼蒿施肥方式,想不高产都难。
  19. 联想 x系列服务器停产,去年年底惠普、IBM和联想相继在服务器市场失去了份额...
  20. 互联网上下50年,万字长文推演Web1.0到Web5.0

热门文章

  1. 远程连接“终端服务器超出了最大允许连接数” 解决
  2. vs2010 在svn上传东西的时候 出现一个错误 An internal occurred 值不在预期范围内 要如何解决呢?...
  3. 使用 jQuery Mobile 与 HTML5 开发 Web App (六) —— jQuery Mobile 内容格式
  4. 网页上的摄影展:等高响应布局实现
  5. [Linux] rpm 与 dpkg 用法比较
  6. 11个实用jQuery日历插件
  7. LinuxCNC基础知识
  8. Linux——Linux下的tar压缩解压缩命令详解
  9. Linux—scp或ssh出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  10. 【OpenGL】顶点变换常用函数总结