做爲還在漫漫前端學習路上的一位自學者。我以學習分享的方式來整理本身對於知識的理解,同時也但願可以給你們做爲一份參考。但願可以和你們共同進步,若有任何紕漏的話,但願你們多多指正。感謝萬分!html
在這一節, 我會先介紹 "客戶端" 和 "服務器" 的概念.前端
而後我會簡單介紹一下 "HTTP 協議".node
最後, 咱們要試着搭建一個最簡易的 HTTP 服務器. 當瀏覽器去向這個服務器發送請求的時候, 服務器會返回 "Hello World" 文本.api
先思考, 平時咱們在瀏覽器地址欄中, 輸入網址按下回車以後, 網頁是如何呈如今咱們面前的?瀏覽器
很顯然, 咱們想要訪問的網頁不是本來就保存在咱們的電腦裏的. 咱們在瀏覽器中輸入網址, 去網頁文件所在的網絡設備中去請求網頁. 擁有網頁的網絡設別贊成了咱們的請求, 把網頁返回給了瀏覽器. 以後瀏覽器再解析渲染網頁文件, 使網頁最終能呈如今咱們面前.服務器
像瀏覽器這樣, 請求訪問文本或圖像等資源的一端稱爲客戶端,而提供資源響應的一端稱爲服務端。網絡
客戶端和服務器之間是怎麼交流信息, 傳遞數據的呢? post
網絡之間的各類網絡設備, 就像 "學校裏說不一樣方言的同窗", 你們想要交流就必須使用 "普通話". 各類網絡設別之間想要通訊也須要一套你們都承認的通訊標準.學習
HTTP 協議 (Hyper Text Transfer Protocol 超文本傳輸協議)就是 服務器 和 客戶端 之間的通訊規則.
在應用 HTTP 協議時,一定是一端擔任客戶端角色,另外一端擔任服務器端角色
使用 HTTP 協議傳輸的信息叫作 HTTP 報文. 請求端(客戶端)的 HTTP 報文叫作請求報文,響應端(服務器端)的叫作響應報文。 HTTP 報文可分爲 報文首部 和 報文主體 兩塊, 中間由一個空行分開.
『 請求報文組成 』: 請求方法 + 請求 URI + HTTP 協議版本 + (可選的請求首部字段 和 內容實體)
『 響應報文組成 』: HTTP 協議版本 + 狀態碼(表示請求成功或失敗的數字代碼)+ 用以解釋狀態碼的緣由短語 + (可選的響應首部字段 以及 實體主體)
『 請求方法 』:
HTTP 定義了一組請求方法, 以代表要對給定資源執行的操做。
經常使用的有:
GET
: 用來請求服務器端指定的資源。使用 GET 的請求應該只用於獲取數據。POST
: 用來發送數據給服務器. 雖然用 GET 方法也能夠傳輸主體. 但通常不用 GET 方法進行傳輸,而是用 POST 方法。PUT
: 用於新增資源. PUT 與 POST 方法的區別在於,PUT 方法調用一次與連續調用屢次是等價的,而連續調用屢次 POST 方法可能會有反作用,好比將一個訂單重複提交屢次。DELETE
: 用於刪除指定的資源。除上面這些以外, 還有其餘請求方法, 想了解能夠自行查閱文檔.
『 URI 』:
HTTP 協議使用 URI 定位互聯網上的資源。也就是咱們常說的 "網址". 多數狀況下 URL 和 URI 說的是一回事. 這裏不作過多論述.
下圖是 URI 的各個組成部分
『 狀態碼 』:
狀態碼的職責是當客戶端向服務器端發送請求時,描述服務器返回的請求結果。
藉助狀態碼,用戶能夠知道服務器端是正常處理了請求,仍是出現了錯誤。
狀態碼由 3 位數字 和 緣由短語 組成。
數字中的第一位指定了響應類別,後兩位無分類。響應類別有如下 5 種:
最多見的兩個就是:
200 OK
: 表示從客戶端發來的請求在服務器端被正常處理了。404 Not Found
: 該狀態碼代表服務器上沒法找到請求的資源。除此以外,也能夠在服務器端拒絕請求且不想說明理由時使用。其他的狀態碼, 你們能夠查閱文檔, 這裏就不介紹了.
『 首部字段 』:
首部字段, 爲客戶端和服務器, 處理請求和響應, 提供了所須要的信息。
HTTP 首部字段是由 首部字段名 和 字段值 構成的,中間用 :
分隔。
例如:
在 HTTP 首部中以 Content-Type 這個字段來表示報文主體的類型。 Content-Type: text/html
就是說, 報文主體的類型爲 HTML.
更多首部字段我就再也不這裏介紹了, 你們能夠根據須要查閱文檔.
Node.js 自身提供的 http
模塊, 提供了 HTTP 服務器和客戶端接口, 能夠很便捷地應用 HTTP 協議.
下面我就介紹如何用 http
模塊實現一個響應 "Hello World" 給客戶端的 Web 服務器:
首先, 新建一個 JavaScript 文件, 取名 myServer.js
, 固然你能夠叫別的.
在文件開頭先引用 http
模塊.
var http = require('http');
複製代碼
而後調用 http.createServer
函數建立並返回一個 HTTP 服務器. 這個函數接收一個回調函數做爲參數. 服務器每次收到客戶端發過來的 HTTP 請求會交給這個回調函數處理. 回調函數會受到兩個參數, "請求對象" 和 "響應對象", 通常簡寫爲 req
和 res
.
var server = http.createServer(function(req, res) {
// 處理請求, 送出響應
});
複製代碼
服務器每次收到新的請求, 都會建立新的請求對象和響應對象. 從客戶端發過來的請求報文會被解析, 而後做爲請求對象的一部分. 在回調函數的內部, 你須要根據業務邏輯處理請求, 而後送出響應給客戶端, 結束這次請求.
在本練習中, 咱們要返回給客戶端一個寫有 "Hello World" 的純文本. 在回調函數中咱們須要用到三個響應對象上的函數:
res.writeHead(statusCode[, statusMessage][, headers])
: 該方法會發送一個響應頭給客戶端. 第一個參數做爲狀態碼, 最後一個參數 headers
是響應頭對象。 第二個參數 statusMessage
是可選的狀態描述。res.write(chunk[, encoding][, callback])
: 該方法會發送一塊響應主體。 它可被屢次調用,以便提供連續的響應主體片斷。第一個參數是一個字符串或一個 Buffer 字節流, 若是是字符串的話, 第二個參數指定如何將它編碼成一個字節流 (默認爲 utf-8). 最後一個參數這裏先不考慮.res.end([data][, encoding][, callback])
: 該方法會通知服務器,全部響應頭和響應主體都已被髮送,即服務器將其視爲已完成。每次響應都必須調用這個方法來結束請求, 不然請求會被一直掛起. 若是傳入 data 參數, 至關於調用 res.write(data, encoding)
.那麼根據需求咱們知道:
Content-Type
的值爲 text/plain
.根據這兩個信息, 咱們就能夠很輕鬆的寫出請求處理函數內的代碼:
var server = http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type':'text/plain'});
res.write("Hello World");
res.end();
});
複製代碼
最後, 咱們須要給 Web 服務器綁定一個端口. 爲了讓服務器能夠提供多種服務, 不一樣請求會被髮送到不一樣的端口. 只有發送到咱們指定端口的 HTTP 請求會被上面的代碼所處理.
咱們使用 server.listen
函數, 第一個參數爲端口號, 最後一個參數是一個回調函數, 監聽成功後調用.
在這裏我用 3000
做爲端口號, 固然你也能夠改爲你喜歡的.
server.listen(3000, function() {
console.log("服務器啓動成功!");
console.log("正在監聽 3000 端口:");
});
複製代碼
所有寫完後代碼爲:
var http = require('http');
var server = http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write("Hello World");
res.end();
});
server.listen(3000, function() {
console.log("服務器啓動成功!");
console.log("正在監聽 3000 端口:");
});
複製代碼
在命令行中輸入 node myServer.js
( 注意你的路徑和文件名 )
服務器運行後, 能夠在命令行看見
而後在瀏覽器中登陸 localhost:3000
, 你就能夠看見服務器響應給你的 "Hello World" 了.
如今你成功的返回了一條純文本內容給客戶端. 接下來, 你能夠試着返回一個 HTML 文本嗎?
Tip: Content-Type
的值應改爲什麼?
😆 好啦,今天的分享就告一段落啦。下一篇中,我會介紹如何實現一個 "HTTP 靜態文件服務器"。
傳送門 - Node.js 系列 - 搭建靜態資源服務器
若是喜歡的話就點個關注吧!O(∩_∩)O 謝謝各位的支持❗️