risingstack.com/node-hero-node-js-request-module-tutorial/在接下来的教程中,学习HTTP协议的基础知识以及如何从中获取资源使用Node.js的请求模块的外部资源。什么是HTTP?HTTP代表超文本传输??协议。HTTP作为客户端-服务器计算模型中的请求-响应协议。HTTP状态代码在深入研究与其他API通信之前,让我们回顾一下在此过程中我们将遇到的HTTP状态代码。状态码描述了请求的结果,对于错误处理是必不可少的。1xx-响应尚未完成(信息性)2xx-成功:这些状态代码表明已正确接收和处理请求。最常见的成功响应代码是200OK、201Created和204NoContent。3xx——重定向:这组状态码表示客户端必须做一些额外的操作才能完成请求。最常见的重定向响应代码是301永久移动,304未修改。4xx-客户端错误:当客户端发送的请求发生某种错误时使用此状态代码。服务器响应通常会包含对错误的解释。最常见的客户端错误代码是400BadRequest、401Unauthorized、403Forbidden、404NotFound、409Conflict。5xx-服务器错误:当服务器由于某些错误而无法完成有效请求时发送这些状态代码。原因可能是代码中的错误,或者某些暂时或永久的无能。最常见的服务器错误状态代码是500InternalServerError、503ServiceUnavailable。如果您想了解更多有关HTTP状态代码的信息,可以在此处找到详细说明。向外部API发送请求在Node中,连接到外部API很简单。只需要核心HTTP模块并开始发送请求。当然,有更好的方法来调用外部端点。NPM上有许多模块可以使这个过程更容易。例如,两个最流行的模块是request和superagent。这两个模块都有错误优先的回调接口,这可能会导致一些问题(我打赌你听说过回调地狱),但幸运的是我们可以访问Promise包装的版本。使用Node.jsRequest模块request-promise模块使用起来很简单。从NPM安装后,只需要它:constrequest=require('request-promise')发送GET请求非常简单:constoptions={method:'GET',uri:'https://risingstack.com'}request(options).then(function(response){//请求成功,随意使用响应对象}).catch(function(err){//发生了不好的事情,处理错误})ifcalledJSONAPI,您可能希望请求承诺自动解析响应。此时,只需将其添加到请求选项中:json:truePOST请求的工作方式类似:constoptions={method:'POST',uri:'https://risingstack.com/login',body:{foo:'bar'},json:true//JSON自动将主体字符串化}request(options).then(function(response){//处理响应}).catch(function(err){//处理错误})要添加查询字符串参数,只需将qs属性添加到选项对象:constoptions={method:'GET',uri:'https://risingstack.com',qs:{limit:10,skip:20,sort:'asc'}}这会将请求URL更改为:https://risingstack.com?limit=10&skip=20&sort=asc。您还可以使用与添加查询参数相同的方式定义所有请求标头:constoptions={method:'GET',uri:'https://risingstack.com',headers:{'User-Agent':'Request-Promise','Authorization':'BasicQWxhZGRpbjpPcGVuU2VzYW1l'}}错误处理错误处理是向外部API发出请求的重要部分,因为无法保证会发生什么。除了客户端错误之外,服务器还会响应错误,或者只是发送不正确或格式不一致的数据。在尝试处理响应时请记住这一点。此外,对每个请求使用catch是避免外部服务使服务器崩溃的好方法。将它们放在一起现在您已经了解了如何创建Node.jsHTTP服务器、如何呈现HTTP页面以及如何从外部API获取数据,是时候将它们放在一起了!在此示例中,我们将创建一个小型Express应用程序,它根据城市名称呈现当前的天气状况。要获取AccuWeatherAPI密钥,请访问Accuweather开发人员网站。constexpress=require('express')constrp=require('request-promise')constexphbs=require('express-handlebars')constapp=express()app.engine('.hbs',exphbs({defaultLayout:'main',extname:'.hbs',layoutsDir:path.join(__dirname,'views/layouts')}))app.set('viewengine','.hbs')app.set('views',path.join(__dirname,'views'))app.get('/:city',(req,res)=>{rp({uri:'http://apidev.accuweather.com/locations/v1/search',qs:{q:req.params.city,apiKey:'api-key'//在这里使用你的accuweatherAPI密钥},json:true}).then((data)=>{res.render('index',data)}).catch((err)=>{console.log(err)res.render('error')})})app.listen(3000)上面的示例执行以下操作:创建一个Express服务器设置handlebars结构-.hbs文件请参考Node.jsHTTP教程向外部APIs发送请求如果一切顺利,渲染页面否则,显示错误页面并记录错误接下来下一章将学习如何正确组织Node.js项目。
