当前位置: 首页 > 科技观察

深入解析Node.js中5种发起HTTP请求的方法

时间:2023-03-21 23:18:02 科技观察

深入分析Node.js中发起HTTP请求的5种方法。Node.js中有相当多的解决方案,包括语言内置函数和开源社区贡献的开发库。让我们来看看一些比较流行的方法。在本文的案例中,我们将使用NASA提供的“DailySpacePhotoAPI”作为JSONAPI进行交互,因为太空是有史以来最酷的东西。在开始之前,请在您的计算机上安装最新版本的node.js和npm。HTTP-标准库First是标准库中的默认HTTP模块。该模块无需安装外部依赖即可使用,真正做到即插即用。缺点是与其他解决方案相比,它不那么用户友好。以下代码将向NASA的API发送GET请求并输出当天天文照片的URL及其注释:consthttps=require('https');https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY',(resp)=>{letdata='';//已经接收到Achunkofdata.resp.on('data',(chunk)=>{data+=chunk;});//已收到完整响应。Printouttheresult.resp.on('end',()=>{console.log(JSON.parse(data).explanation);});}).on("error",(err)=>{console.log("错误:"+err.message);});HTTP和HTTPS模块提供的大部分功能都相当有限。您需要以块的形式接收响应数据,而不是仅仅提供一个回调函数,以便在接收到所有数据后立即执行。如果它是JSON格式,您仍然需要进行手动解析。虽然工作量不大,但还是引入了一些不必要的操作。还有一个麻烦就是HTTP和HTTPS协议属于两个模块,所以如果我们使用的API是通过HTTPS协议进行通信的,就需要HTTPS模块。如果您不想向您的代码库添加太多依赖项或者想使用它的底层功能,那么获取您需要的数据可能需要花费更多的精力,但它仍然是一个很棒的工具。RequestRequest是一个简化的http客户端,与Python的request库非常相似。这个库比默认的http模块更有用,多年来一直被开源社区用作开发工具。我从一开始就一直在使用Node.js,它对快速完成开发任务非常有帮助。与http模块不同,您必须使用npm来安装它。在终端下进入你要下载代码的目录,运行如下命令:npminstallrequest@2.81.0可以看到不用写太多代码也可以完成前面的功能:constrequest=require('request');请求('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY',{json:true},(err,res,body)=>{if(err){returnconsole.log(err);}console.log(body.url);console.log(body.explanation);});如果你想要使用正常方式处理HTTP请求的痛苦,那么Request是一个不错的选择。如果你想使用Promises,也可以查看request-promise库。AxiosAxios是用于浏览器和Node.js的基于承诺的HTTP客户端。在处理需要更复杂的事件链的代码时,使用Promises具有很大的优势。编写异步代码可能会令人困惑,而Promises是该问题的几种解决方案之一。它们甚至被用于Swift等其他语言。要使用npm安装Axios,请在终端中输入以下命令:npmintalaxios@0.16.2下面的代码做同样的事情,获取URL并解释当天的天文图像。constaxios=require('axios');axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY').then(response=>{console.log(response.data.url);console.log(response.data.explanation);}).catch(error=>{console.log(error);});默认情况下,Axios可以解析JSON响应,非常方便。您还可以看到错误处理是由.catch()完成的,现在我们都在使用promises。你甚至可以通过axios.all发起多个并发请求。例如,如果你想一次获取两天的天文图像,你可以这样做:varaxios=require('axios');axios.all([axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-03'),axios.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&date=2017-08-02')]).then(axios.spread((response1,response2)=>{console.log(response1.data.url);console.log(response2.data.url);})).catch(错误=>{console.log(错误);});异步代码很容易变得非常复杂和难以处理,Axios轻松解决了这个问题,从长远来看可以使您的开发工作更加轻松。与Axios类似,SuperAgent是另一个流行的库,主要用于浏览器中的Ajax请求,但也适用于Node.js。使用以下命令安装SuperAgent:npminstallsuperagent@3.5.2SuperAgent最酷的一点是能够链接调用,您可以将其他函数链接到请求,如query()并添加参数。在前面的示例中,我们手动添加了它们。请注意SuperAgent如何提供此功能:constsuperagent=require('superagent');superagent.get('https://api.nasa.gov/planetary/apod').query({api_key:'DEMO_KEY',date:'2017-08-02'}).end((err,res)=>{if(err){returnconsole.log(err);}console.log(res.body.url);console.log(res.body。解释);});与axios一样,您不必自己解析JSON响应,这非常酷。Got如果你想使用更轻量级的库,Got是另一个选择。它也可用于Twilio函数。同样,使用npm安装Got:npminstallgot@7.1.0与Axios一样,Got也适用于Promises。以下代码与前面的示例执行相同的操作:constgot=require('got');got('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY',{json:true})。然后(response=>{console.log(response.body.url);console.log(response.body.explanation);}).catch(error=>{console.log(error.response.body);});如果你想要一个不像Request那样臃肿的轻量级库,使用Got。***思考以上并不是全部的解决方案,但是看完这篇你就会知道一些流行的HTTP库中的基本功能在Node.js中是如何工作的。还有诸如node-fetch之类的库将浏览器的fetch功能移植到后端。在其他语言(如Python和Ruby)中有各种类似的库可以解决这个问题。

最新推荐
猜你喜欢