【Node Hero】6. Node.js Request 模塊

本文轉載自:衆成翻譯
譯者:網絡埋伏紀事
連接:http://www.zcfy.cc/article/1758
原文:https://blog.risingstack.com/node-hero-node-js-request-module-tutorial/html

在以下教程中,將學習 HTTP 協議的基礎知識,以及如何使用 Node.js 的 request 模塊從外部源獲取資源。node

什麼是 HTTP?

HTTP 表明超文本傳輸協議(Hypertext Transfer Protocol)。HTTP 做爲在客戶機-服務器計算模型中的請求-響應協議。express

HTTP 狀態碼

在深刻與其它 API 的通信以前,咱們來回顧一下在此過程當中會遇到的 HTTP 狀態碼。狀態碼描述了請求的結果,它對錯誤處理是必不可少的。npm

  • 1xx - 響應還沒完成(Informational)json

  • 2xx - 成功:這些狀態碼錶示請求被接收並正確處理了。最多見的成功響應碼是 200 OK201 Created204 No Contentapi

  • 3xx - 重定向: 這組狀態碼錶示要完成請求,客戶端必需要作一些額外的操做。最多見的重定向響應碼是 301 Moved Permanently304 Not Modifiedpromise

  • 4xx - 客戶端錯誤: 這類狀態碼被用在客戶端發送的請求出現了某種錯誤時。服務器響應一般會包含了對錯誤的解釋。最多見的客戶端錯誤碼是 400 Bad Request401 Unauthorized403 Forbidden404 Not Found409 Conflict服務器

  • 5xx - 服務器錯誤: 當服務器因爲某些錯誤不能完成有效的請求時,就發送這些狀態碼。緣由多是代碼中的一個 bug,或者一些臨時或者永久性的無能。最多見的服務器錯誤狀態碼是 500 Internal Server Error503 Service Unavailable。若是你想學習更多有關 HTTP 狀態碼的知識,能夠在這裏找到詳細的解釋。網絡

向外部 API 發送請求

在 Node 中,鏈接到外部 API 是很簡單的。只須要 require 核心 HTTP 模塊,而後開始發送請求便可。app

固然,有更好的方式來調用外部端點。在 NPM 上能夠找到不少讓這個過程更容易的模塊。例如,兩個最流行的模塊是 requestsuperagent

這兩個模塊都有錯誤優先的回調接口,這就會致使一些問題(我打賭你已經據說過回調地獄),可是幸運的是咱們能夠訪問封裝了 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 項目

圖片描述

相關文章
相關標籤/搜索