ENSP如何开启服务器的http_如何使用HTTP模块在Node.js中创建Web服务器(上)
當你在瀏覽器中查看網頁時,其實是在向互聯網上的另一臺計算機發出請求,然后它會將網頁提供給你作為響應。你通過互聯網與之交談的那臺計算機就是Web服務器,Web服務器從客戶端(例如你的瀏覽器)接收HTTP請求,并提供HTTP響應(如來自API的HTML頁面或JSON)。
服務器返回一個網頁需要使用很多軟件,該軟件通常分為兩類:前端和后端。前端代碼關心的是內容如何呈現,比如導航欄的顏色和文本樣式。后端代碼與如何交換、處理和存儲數據有關,處理來自瀏覽器的網絡請求或與數據庫通信的代碼主要由后端代碼管理。
Node.js允許開發人員使用JavaScript編寫后端代碼,盡管傳統上它是在瀏覽器中用于編寫前端代碼的。這樣將前端和后端結合在一起可以減少制作Web服務器的工作量,這是Node.js成為編寫后端代碼的流行選擇的主要原因。
在本文中,你將學習如何使用Node.js中包含的http模塊構建web服務器。你將構建可返回JSON數據、CSV文件和HTML網頁的Web服務器。
配置
確保在你的開發計算機上安裝了Node.js,本教程使用Node.js 10.19.0版本,要將其安裝在macOS或Ubuntu 18.04上,請遵循如何在macOS上安裝Node.js并創建本地開發環境中的步驟,或如何在Ubuntu 18.04上安裝Node.js的使用PPA安裝部分中的步驟。
Node.js平臺支持開箱即用地創建Web服務器,首先,請確保你熟悉Node.js的基礎知識。你可以通過閱讀有關如何在Node.js中編寫和運行第一個程序的指南來開始使用。
我們還將在其中一節中使用異步編程,如果你不熟悉Node.js中的異步編程或用于與文件交互的fs模塊,則可以閱讀有關如何在Node.js中編寫異步代碼的文章來了解更多信息。
步驟1:創建基本的HTTP服務器
首先,創建一個將用戶返回純文本的服務器,這將涵蓋設置服務器所需的關鍵概念,這將為返回更復雜的數據格式(如JSON)提供必要的基礎。
首先,我們需要建立一個可訪問的編碼環境來進行練習,以及本文中的其他內容。在終端中,創建一個名為first-servers的文件夾:
然后輸入該文件夾:
現在,創建將包含代碼的文件:
在文本編輯器中打開文件,我們將在終端中使用nano:
首先,加載所有Node.js安裝的標準http模塊,將以下行添加到hello.js:
http模塊包含創建服務器的函數,稍后我們將看到。如果你想了解有關Node.js中模塊的更多信息,請查看我們的如何創建Node.js模塊文章。
下一步將定義兩個常量,服務器將綁定到的主機和端口:
如前所述,Web服務器接受來自瀏覽器和其他客戶端的請求。我們可以通過輸入域名來與Web服務器進行交互,域名由DNS服務器轉換為IP地址。IP地址是一串唯一的數字序列,用于標識網絡(如Internet)上的計算機。有關域名概念的更多信息,請參閱我們的DNS術語、組件和概念介紹文章。
值localhost是一個特殊的私有地址,計算機使用它來引用自己。它通常相當于內部IP地址127.0.0.1,它只對本地計算機可用,對我們已經加入的任何本地網絡或互聯網都不可用。
端口是服務器用作我們IP地址的終結點。在我們的示例中,我們將為web服務器使用端口8000。端口8080和8000通常用作開發中的默認端口,在大多數情況下,開發人員將使用它們而不是HTTP服務器的其他端口。
當我們將服務器綁定到該主機和端口時,可以通過在本地瀏覽器中訪問http://localhost:8000來訪問服務器。
讓我們添加一個特殊的函數,在Node.js中,我們將其稱為請求監聽器。此函數旨在處理傳入的HTTP請求并返回HTTP響應。該函數必須有兩個參數,一個請求對象和一個響應對象。request對象捕獲傳入的HTTP請求的所有數據,response對象用于返回服務器的HTTP響應。
我們希望我們的第一臺服務器在有人訪問它時返回此消息:"My first server!"。
接下來讓我們添加這個函數:
irst-servers/hello.js
該函數通常根據其函數進行命名,例如,如果我們創建了一個請求監聽器函數來返回一個圖書列表,則我們可能會將其命名為listBooks()。由于這是一個示例案例,因此我們將使用通用名稱requestListener。
Node.js中的所有請求監聽器函數都接受兩個參數:req和res(如果需要,可以使用不同的名稱)。用戶發送的HTTP請求被捕獲在Request對象中,該對象對應于第一個參數req。我們返回給用戶的HTTP響應是通過與第二個參數res中的Response對象進行交互而形成的。
第一行res.writeHead(200);設置響應的HTTP狀態代碼。HTTP狀態代碼指示服務器處理HTTP請求的狀態。在本例中,狀態代碼200對應于“確定”。如果你有興趣了解Web服務器可以返回的各種HTTP代碼以及它們所表示的含義,,那么我們的關于如何排除常見HTTP錯誤代碼的指南是一個很好的起點。
函數的下一行res.end("My first server!");,將HTTP響應寫回到請求它的客戶端。該函數返回服務器必須返回的所有數據。在本例中,它返回文本數據。
最后,我們現在可以創建服務器并利用我們的請求監聽器:
first-servers / hello.js
通過按CTRL + X保存并退出nano。
在第一行中,我們通過http模塊的createServer()函數創建一個新的服務器對象。該服務器接受HTTP請求,并將它們傳遞給我們的requestListener()函數。
創建服務器后,必須將其綁定到網絡地址。我們使用server.listen()方法來實現這一點,它接受三個參數:端口,主機和在服務器開始監聽時觸發的回調函數。
所有這些參數都是可選的,但是最好明確聲明要使用Web服務器的端口和主機。將Web服務器部署到不同的環境時,需要知道正在運行的端口和主機來設置載荷平衡或DNS別名。
回調函數將消息記錄到控制臺,以便我們可以知道服務器何時開始監聽連接。
注意:即使requestListener()不使用req對象,它仍必須是函數的第一個參數。
現在只有不到十五行的代碼,我們有了一個Web服務器。讓我們看看它的運行情況,并通過運行該程序進行端到端測試:
在控制臺中,我們將看到以下輸出:
注意提示符消失了。這是因為Node.js服務器是一個長時間運行的進程。它只有在遇到導致崩潰和退出的錯誤時才會退出,或者我們停止運行Node.js進程時才會退出。
在一個單獨的終端窗口中,我們將使用cURL(一種用于在網絡之間傳輸數據的CLI工具)與服務器進行通信。輸入命令向運行中的服務器發出HTTP GET請求:
當我們按回車鍵時,終端會顯示如下輸出:
現在,我們已經設置了服務器,并得到了第一個服務器響應。
讓我們來分析一下在測試服務器時發生了什么,我們使用cURL向服務器發送了一個GET請求,地址是http://localhost:8000。我們的Node.js服務器偵聽來自該地址的連接。服務器將該請求傳遞給requestListener()函數。函數返回狀態碼為200的文本數據,然后服務器將響應發送回cURL,后者在終端中顯示消息。
在繼續之前,讓我們按CTRL+C退出正在運行的服務器。這會中斷服務器的執行,使我們回到命令行提示符。
在大多數我們訪問的網站或使用的API中,服務器響應很少以純文本形式出現。我們將HTML頁面和JSON數據作為常見的響應格式。在下一步中,我們將學習如何以網絡上常見的數據格式返回HTTP響應。
步驟2:返回不同類型的內容
我們從Web服務器返回的響應可以采用多種格式。前面提到了JSON和HTML,我們還可以返回其他文本格式,例如XML和CSV。最后,Web服務器可以返回非文本數據,例如PDF,壓縮文件、音頻和視頻。
在本文中,除了我們剛剛返回的純文本之外,你還將學習如何返回以下類型的數據:
JSON
CSV
HTML
這三種數據類型都是基于文本的,并且是用于在Web上傳遞內容的流行格式。許多服務器端開發語言和工具都支持返回這些不同的數據類型。在Node.js的上下文中,我們需要做兩件事:
·?使用適當的值在我們的HTTP響應中設置Content-Type標頭;
·?確保res.end()以正確的格式獲取數據。
讓我們來看一些示例,在本節中編寫的代碼,以后的代碼與我們之前編寫的代碼有很多相似之處。大多數更改存在于requestListener()函數中,讓我們使用此“模板代碼”創建文件,以便以后的章節更容易理解。
創建一個名為html.js的新文件,稍后將使用此文件在HTTP響應中返回HTML文本。我們將模板代碼放在此處,然后將其復制到其他返回各種類型的服務器。
在終端中,輸入以下內容:
現在,在文本編輯器中打開此文件:
復制“模板代碼”,在nano中輸入以下內容:
first-servers / html.js
保存并使用CTRL+X退出html.js,然后返回到終端。
現在,我們將該文件復制到兩個新文件中。第一個文件將在HTTP響應中返回CSV數據:
第二個文件將在服務器中返回一個JSON響應:
其余文件將用于以后的練習:
我們現在已經準備好繼續練習了,讓我們從返回JSON開始。
JSON服務
JavaScript對象表示法通常稱為JSON,是一種基于文本的數據交換格式。顧名思義,它是從JavaScript對象派生而來的,但它是獨立于語言的,這意味著任何能夠解析其語法的編程語言都可以使用它。
API通常使用JSON來接收和返回數據。它之所以受歡迎,是因為其數據傳輸大小比以前的數據交換標準(例如XML)要小,以及現有的工具可以使程序無需花費過多精力即可解析它們。如果你想了解有關JSON的更多信息,請閱讀有關如何在JavaScript中使用JSON的指南。
使用nano打開json.js文件:
我們希望返回一個JSON響應,通過更改突出顯示的行來修改requestListener()函數,以返回所有JSON響應都具有的適當標頭,如下所示:
res.setHeader()方法將HTTP標頭添加到響應中,HTTP標頭是可以附加到請求或響應的其他信息。res.setHeader()方法采用兩個參數:標頭的名稱和其值。
Content-Type標頭用于指示與請求或響應一起發送的數據格式,也稱為媒體類型。在這種情況下,我們的Content-Type是application / json。
現在,讓我們將JSON內容返回給用戶,修改json.js,使它看起來像這樣:
first-servers / json.js
像以前一樣,我們通過返回狀態碼200來告訴用戶他們的請求成功。這次在response.end()調用中,我們的字符串參數包含有效的JSON。
通過按CTRL + X保存并退出json.js,現在,讓我們使用node命令運行服務器:
在另一個終端,我們使用cURL到達服務器:
當我們按回車鍵時,我們將看到以下結果:
現在我們已經成功地返回了一個JSON響應,就像我們創建應用程序時使用的許多流行API一樣。確保使用CTRL + C退出正在運行的服務器,以便我們可以返回到標準終端提示符。接下來,讓我們看一下返回數據的另一種流行格式:CSV。
CSV
逗號分隔值(CSV)文件格式是一種文本標準,通常用于提供表格數據。在大多數情況下,每一行都由換行符分隔,并且該行中的每一項都由逗號分隔。
在我們的工作區中,使用文本編輯器打開csv.js文件:
讓我們在requestListener()函數中添加以下代碼:
這次,我們的Content-Type表示正在返回CSV文件,其值為text / csv。我們添加的第二個標頭是Content-Disposition。此標頭告訴瀏覽器如何顯示數據,尤其是在瀏覽器中或作為單獨的文件顯示。
當我們返回CSV響應時,即使未設置Content-Disposition標頭,大多數現代瀏覽器也會自動下載文件。但是,在返回CSV文件時,我們仍應添加此標頭,因為它允許我們設置CSV文件的名稱。在這種情況下,我們會向瀏覽器發出此CSV文件是附件的信號,應下載該文件。然后,我們告訴瀏覽器文件名稱為oceanpals.csv。
讓我們在HTTP響應中寫入CSV數據:
就像在我們的響應返回200/OK狀態之前一樣,這一次,我們對res.end()的調用具有一個有效的CSV字符串。逗號分隔每列中的值,新行字符(\n)分隔行。我們有兩行,一行用于表頭,另一行用于數據。
我們將在瀏覽器中測試該服務器。保存csv.js并使用CTRL + X退出編輯器。
使用Node.js命令運行服務器:
在另一個終端中,使用cURL到達服務器:
控制臺將顯示以下內容:
如果在瀏覽器中轉到http:// localhost:8000,將下載CSV文件。它的文件名將是oceanpals.csv。
使用CTRL+C退出正在運行的服務器,以返回到標準終端提示符。
返回JSON和CSV后,我們介紹了兩種API常用的情況,讓我們繼續介紹如何為人們在瀏覽器中查看的網站返回數據。
下一篇文章中,我們將繼續介紹步驟3和步驟4,創建可以處理各種請求和響應的web服務器。
參考及來源:https://www.digitalocean.com/community/tutorials/how-to-create-a-web-server-in-node-js-with-the-http-module
總結
以上是生活随笔為你收集整理的ENSP如何开启服务器的http_如何使用HTTP模块在Node.js中创建Web服务器(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中range 函数_Pyth
- 下一篇: python构建二维数组_Python中