摘要:在中有相當多的解決方案,其中有語言內置功能,也有開源社區貢獻的開發庫。缺點是與其他解決方案相比,用起來不是那么友好。默認情況下,可以解析響應,非常方便。與類似,是另一個流行的庫,主要用于瀏覽器中的請求,但也適用于。
翻譯:瘋狂的技術宅
英文標題:5 Ways to Make HTTP Requests in Node.js
原文鏈接:https://www.twilio.com/blog/2...
本文首發微信公眾號:充實的腦洞
相關文章:【譯】Python3中進行HTTP請求的4種方式
創建HTTP請求使現代編程語言的核心功能之一,也是很多程序員在接觸到新的開發環境時最先遇到的技術之一。在Node.js中有相當多的解決方案,其中有語言內置功能,也有開源社區貢獻的開發庫。下面咱們來看一下比較流行的幾種方式。
在本文的案例中,我們將使用NASA提供的“每日太空照片API”作為交互用的JSON API,
因為太空是有史以來最酷的東西。
在開始之前,請先在自己的計算機上安裝最新版的node.js和npm。
HTTP - 標準庫首先是標準庫中默認的HTTP模塊。這個模塊無需安裝依賴外部即可使用,做到了真正的即插即用。缺點是與其他解決方案相比,用起來不是那么友好。
下面的代碼將向NASA的API發送一個GET請求,并輸出當天的天文照片的URL,以及它的注解:
const https = require("https"); https.get("https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY", (resp) => { let data = ""; // A chunk of data has been recieved. resp.on("data", (chunk) => { data += chunk; }); // The whole response has been received. Print out the result. resp.on("end", () => { console.log(JSON.parse(data).explanation); }); }).on("error", (err) => { console.log("Error: " + err.message); });
HTTP和HTTPS模塊提供的大多數功能是相當有限的。你需要以區塊為單位接收響應數據,而不是只提供一個回調函數,以便在收到所有數據后就立即執行。如果它是JSON格式你還需要進行手動解析。盡管工作量不大,但是它仍然會帶來一些不必要的操作。
另一個麻煩是,HTTP和HTTPS協議分屬兩個模塊,因此如果我們使用的API是通過HTTPS協議進行通信,則需要HTTPS模塊。
如果你不想向代碼庫中添加太多的依賴項或希望使用其底層的功能, 那么可能需要花費更多的精力來獲取所需的數據, 盡管如此,但是它仍然是一個很好的工具。
RequestRequest是一個簡化的http客戶端,它和Python的request庫很像。這個庫比默認的http 模塊更好用,多年來被開源社區作為開發首選。
自從我開始使用Node.js就一直在用,他對快速完成開發任務很有幫助。與http 模塊不同的是,你必須使用npm來安裝它。
在終端下進入到你想要代碼被下載的目錄中,運行以下命令:
npm install request@2.81.0
可以看到,不需要寫太多代碼就能完成前面的功能:
const request = require("request"); request("https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY", { json: true }, (err, res, body) => { if (err) { return console.log(err); } console.log(body.url); console.log(body.explanation); });
如果你想要一個使用正常方式處理HTTP請求的苦,那么Request是一個很好的選擇。如果你想使用Promises,也可以簽出request-promise庫。
AxiosAxios是一個基于promise的HTTP客戶端,可以用于瀏覽器和Node.js。在處理需要更復雜的事件鏈的代碼時,使用Promises具有很大的優勢。 編寫異步代碼可能會令人困惑,而Promises是這個問題的幾種解決方案之一。 它們甚至被用在其它語言中,比如Swift。
使用npm安裝Axios,在終端中輸入以下命令:
npm install axios@0.16.2
下面的代碼實現相同的功能,得到URL并解釋當天的天文學圖片。
const axios = 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發起多個并發請求,比如說你想一次性得到兩天的天文圖片可以這樣做:
var axios = 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(error => { console.log(error); });
異步代碼很容易地變得十分復雜并且不容易處理, Axios很輕松的解決了這個問題,從長遠看來可以使你的開發工作變得輕松。
SuperAgent與Axios類似,SuperAgent 是另一個流行的庫,主要用于瀏覽器中的Ajax請求,但也適用于Node.js。使用以下命令安裝SuperAgent :
npm install superagent@3.5.2
SuperAgent最酷的地方是能進行鏈式調用,你可以把其它函數鏈到像query()這樣的請求上,并且添加參數。在前面的例子中我們都是手動添加它們。請注意 SuperAgent 是怎樣提供這種功能的:
const superagent = require("superagent"); superagent.get("https://api.nasa.gov/planetary/apod") .query({ api_key: "DEMO_KEY", date: "2017-08-02" }) .end((err, res) => { if (err) { return console.log(err); } console.log(res.body.url); console.log(res.body.explanation); });
和axios一樣,你也不用自己解析去JSON響應,這非常酷。
Got如果你想用一個更輕量級的庫,Got是另外一個選擇。它也可用于Twilio Functions。
再來一遍,實用npm安裝Got:
npm install got@7.1.0
和Axios一樣,Got也能同Promises一起很好的工作。下面的代碼做的事情和前面的例子一樣:
const got = require("got"); got("https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY", { json: true }).then(response => { console.log(response.body.url); console.log(response.body.explanation); }).catch(error => { console.log(error.response.body); });
如果你想要一個不像Request那樣臃腫的輕量級的庫,使用Got就對了。
最后的想法以上并不是全部的解決方案,不過看到了這里,你知道了在Node.js中一些流行的HTTP庫中的基本功能是怎樣工作的。還有一些庫,例如node-fetch將瀏覽器的獲取(fetch)功能移植到后端。在其他語言中也有各種類似的庫解決這個問題,比如 Python 和 Ruby 。
你最喜歡用那種方式發送 HTTP 請求?請你告訴我,也可以向我提問:
Email: Sagnew@twilio.com
Twitter: @Sagnewshreds
Github: Sagnew
Twitch (streaming live code): Sagnewshreds
本文首發于公眾號:充實的腦洞 | |
---|---|
歡迎掃碼關注,一個技術宅的保留地 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91426.html
摘要:由于是同一起進行分發和安裝的,因此無需使用進行安裝。首先用進行安裝向發送請求輸出結果我們剛剛向發出了一個請求,同時創建了一個名為的對象,之后使用內置的解碼器來處理我們請求的內容。當每個請求成功后,響應內容將被添加到數據列表中。 翻譯:瘋狂的技術宅原文標題:HTTP Requests in Python 3原文鏈接:https://www.twilio.com/blog/2...本文首發...
摘要:前端日報精選百分比實現比例固定圖片自適應布局探索中的架構你不知道的總結中譯深入解析中種發起請求的方法帶著三個問題一起深入淺出高階組件中文深入理解筆記用模塊封裝代碼第期中的匿名遞歸是如何防御攻擊的眾成翻譯中的響應編程掘金,新特性搶先 2017-08-17 前端日報 精選 CSS百分比padding實現比例固定圖片自適應布局探索ReactJS中的CSS架構你不知道的JavaScript-總...
摘要:示例攻擊如何進行下圖展示了攻擊者如何進行攻擊攻擊者利用網站的表單插入惡意字符串到網站數據庫中。恰恰相反,至少有兩種常見的方式,會導致受害者發起針對自己的反射型攻擊。攻擊者精心構造了一個包含惡意字符串的,將其發送給受害者。 原文地址:http://excess-xss.com/。如有翻譯不當之處,歡迎指出 :D 分為四部分: 概述 XSS 攻擊 XSS 防御 總結 第一部分:概述 X...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
摘要:深入淺出一直想致力于寫一篇關于廣義講解系統的文章,苦于時間有限,資源有限。事件驅動機制是通過內部單線程高效率地維護事件循環隊列來實現的,沒有多線程的資源占用和上下文的切換。 深入淺出Node.js 一直想致力于寫一篇關于廣義講解Node.js系統的文章,苦于時間有限,資源有限。這篇文章是在結合自己的學習心得以及與行業大佬共同探討下爭對于熟練掌握JS語言后的廣義Node.js.至于為什么...
閱讀 666·2021-11-15 11:37
閱讀 4105·2021-09-09 09:34
閱讀 3559·2019-08-30 15:52
閱讀 2602·2019-08-29 14:03
閱讀 2842·2019-08-26 13:36
閱讀 1587·2019-08-26 12:16
閱讀 1592·2019-08-26 11:45
閱讀 3488·2019-08-23 18:41