摘要:状态码描述了请求的结果,它对错误处理是必不可少的。响应还没完成成功这些状态码表示请求被接收并正确处理了。服务器错误当服务器由于某些错误不能完成有效的请求时,就发送这些状态码。
本文转载自:众成翻译
译者:网络埋伏纪事
链接:http://www.zcfy.cc/article/1758
原文:https://blog.risingstack.com/node-hero-node-js-request-module-tutorial/
在如下教程中,将学习 HTTP 协议的基础知识,以及如何使用 Node.js 的 request 模块从外部源获取资源。
什么是 HTTP?HTTP 代表超文本传输协议(Hypertext Transfer Protocol)。HTTP 作为在客户机-服务器计算模型中的请求-响应协议。
HTTP 状态码在深入与其它 API 的通讯之前,我们来回顾一下在此过程中会遇到的 HTTP 状态码。状态码描述了请求的结果,它对错误处理是必不可少的。
1xx - 响应还没完成(Informational)
2xx - 成功:这些状态码表示请求被接收并正确处理了。最常见的成功响应码是 200 OK、201 Created 和 204 No Content。
3xx - 重定向: 这组状态码表示要完成请求,客户端必须要做一些额外的操作。最常见的重定向响应码是 301 Moved Permanently、304 Not Modified。
4xx - 客户端错误: 这类状态码被用在客户端发送的请求出现了某种错误时。服务器响应通常会包含了对错误的解释。最常见的客户端错误码是 400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found、409 Conflict。
5xx - 服务器错误: 当服务器由于某些错误不能完成有效的请求时,就发送这些状态码。原因可能是代码中的一个 bug,或者一些临时或者永久性的无能。最常见的服务器错误状态码是 500 Internal Server Error、503 Service Unavailable。如果你想学习更多有关 HTTP 状态码的知识,可以在这里找到详细的解释。
向外部 API 发送请求在 Node 中,连接到外部 API 是很简单的。只需要 require 核心 HTTP 模块,然后开始发送请求即可。
当然,有更好的方式来调用外部端点。在 NPM 上可以找到很多让这个过程更容易的模块。例如,两个最流行的模块是 request 和 superagent。
这两个模块都有错误优先的回调接口,这就会导致一些问题(我打赌你已经听说过回调地狱),但是幸运的是我们可以访问封装了 Promise 的版本。
使用 Node.js Request 模块request-promise 模块 的使用很简单。从 NPM 安装它之后,只需要 require 它:
const request = require("request-promise")
发送一个 GET 请求也那么简单:
const options = { method: "GET", uri: "https://risingstack.com" } request(options) .then(function (response) { // Request was successful, use the response object at will }) .catch(function (err) { // Something bad happened, handle the error })
如果调用一个 JSON API,你可能会想让 request-promise 自动解析响应。此时,只需要将其添加到 request 选项即可:
json: true
POST 请求的工作方式也类似:
const options = { method: "POST", uri: "https://risingstack.com/login", body: { foo: "bar" }, json: true // JSON stringifies the body automatically } request(options) .then(function (response) { // Handle the response }) .catch(function (err) { // Deal with the error })
要添加查询字符串参数,只需要将 qs 属性添加到 options 对象:
const options = { method: "GET", uri: "https://risingstack.com", qs: { limit: 10, skip: 20, sort: "asc" } }
这会让请求 URL 变为:https://risingstack.com?limit=10&skip=20&sort=asc。
还可以用添加查询参数同样的方式来定义所有请求头:
const options = { method: "GET", uri: "https://risingstack.com", headers: { "User-Agent": "Request-Promise", "Authorization": "Basic QWxhZGRpbjpPcGVuU2VzYW1l" } }错误处理
错误处理是对外部 API 发起请求的重要部分,因为不能确保会发生什么。除了客户端错误以外,服务器会响应一个错误,或者就发送一个错误或者不一致格式的数据。在试着处理响应时,要记住这些。此外,对每次请求都使用 catch 也是一个避免外部服务让服务器崩溃的好办法。
综合既然已经学过如何创建一个 Node.js HTTP 服务器,如何渲染 HTTP 页面,如何从外部 API 获取数据,那么现在就到了将它们放在一起的时候了!
在本例中,我们将创建一个小型 Express 应用程序,该程序基于城市名渲染当前的天气条件。
要获取 AccuWeather API key,请访问 Accuweather 开发者网站。
const express = require("express") const rp = require("request-promise") const exphbs = require("express-handlebars") const app = express() app.engine(".hbs", exphbs({ defaultLayout: "main", extname: ".hbs", layoutsDir: path.join(__dirname, "views/layouts") })) app.set("view engine", ".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" // Use your accuweather API key here }, json: true }) .then((data) => { res.render("index", data) }) .catch((err) => { console.log(err) res.render("error") }) }) app.listen(3000)
上面的示例做如下事情:
创建一个 Express 服务器
设置 handlebars 结构 - 对于 .hbs 文件,请参考 Node.js HTTP 教程
发送请求给外部 API
如果一切顺利,就渲染页面
否则,就显示错误页并记录错误
下一步下章将学习如何正确组织 Node.js 项目。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/85140.html
摘要:基本上,测试金字塔描述你应该编写单元测试集成测试和端到端测试。集成测试要比端到端测试多,单元测试甚至要更多一些。应用程序单元测试编写单元测试,是为了看看给定的模块单元是否工作。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1754原文:https://blog.risingstack.com/node-hero-node-js-un...
摘要:本文转载自众成翻译译者网络埋伏纪事链接原文本章我会指导你启动一个简单的服务器,并开始为请求服务。现在,我们开始创建第一个服务器我们将模块,并将服务器绑定到端口来监听。必须用如下方式启动服务器总结本章学习了如何从头开始创建第一个服务器。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1750原文:https://blog.risings...
摘要:使用一个事件驱动的非阻塞式的模型,让它轻量而高效。也就是说提供了用编写服务器的可能性,这种服务器具有令人难以置信的性能。正如官方声明所说是一个使用与浏览器相同引擎的运行时。这意味着有两个发布版本稳定版和试验版。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1748原文:https://blog.risingstack.com/nod...
摘要:网站和使用同样的注册库来显示模块以及查找模块。使用在上一章开始使用中,当创建文件时,已经遇到了。此外,全局命名空间只包含公共模块。通过引入作用域包来解决此问题。下一步异步编程下一章学习使用回调和实现异步编程的原理。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1749原文:https://blog.risingstack.com/n...
摘要:本教程会学习如何正确组织一个项目的结构,从而在应用程序开始增长时避免混乱。项目结构的五个基本规则组织项目有不少可能的方式并且每种已知的方式都有其兴衰。过去在,我们有机会创建各种规模的高效应用程序,也获得了大量关于项目结构注意事项的见解。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1756原文:https://blog.rising...
阅读 2471·2021-09-24 10:29
阅读 3777·2021-09-22 15:46
阅读 2550·2021-09-04 16:41
阅读 2960·2019-08-30 15:53
阅读 1238·2019-08-30 14:24
阅读 3023·2019-08-30 13:19
阅读 2135·2019-08-29 14:17
阅读 3486·2019-08-29 12:55