標籤:允許 內容 color lob 報文 lis hunk number function
我們使用nodejs中的http模組來進行網路操作
一、什麼是HTTP協議:
超文字傳輸通訊協定 (HTTP)(HyperText Transfer Protocol)HTTP假定其下層協議提供可靠傳輸。
因此,任何能夠提供這種保證的協議都可以被其使用。因此也就是使用TCP作為其傳輸層。
二、HTTP請求和響應報文的結構:
HTTP請求的結構:
請求行 GET /images/logo.gif HTTP/1.1 表示從/images目錄下請求logo.gif這個檔案
---------------------------------------------------------------------------------
要求標頭 Accept-Language:en……
---------------------------------------------------------------------------------
空行 區分要求標頭和請求主體
---------------------------------------------------------------------------------
請求主體 請求中的內容
HTTP響應的結構:
響應行: HTTP/1.1 200 OK
版本號碼 狀態代碼 相應文本
---------------------------------------------------------------------------------
回應標頭: content-length:16……
---------------------------------------------------------------------------------
空行 區分回應標頭和響應主體
---------------------------------------------------------------------------------
響應主體 響應中的內容
三、hTTP協議的特點:
無狀態、無串連、HTTP允許傳輸任意類型的資料對象
簡單來說就是無法像我們打電話那樣你說一句,我說一句,可以持續通話,而HTTP協議只能做到你說一句,然後我說一句,只後想要通話只能再次建立串連。
然後HTTP對傳輸資料的的類型不限制,可以是任意類型的。
四、HTTP模組
1、
http.createServer([requestListener]) 建立一個監聽server,會返回一個http.Server對象,參數requestListener會作為request事件的回呼函數,
該回呼函數第一個參數為http.IncomingMessage執行個體,第二個參數為http.ServerResponse執行個體
http.IncomingMessage 一個對象,封裝了用戶端發送過來的請求
http.ServerResponse 響應對象
2、http.Server對象的方法:
on:給監聽server添加事件處理函數
listen:使用伺服器監聽連接埠
http.Server支援的事件:
request:有請求到來時觸發回呼函數
close:伺服器關閉時觸發
3、http.IncomingMessage對象的重要屬性、事件和方法:
屬性:
req.headers:要求標頭
req.url:請求路徑
req.method:要求方法
req.httpVersion:http協議的版本
事件:
data:接受到請求主體中的內容時會觸發
end:請求主體內容接受完畢時觸發
這兩個配合擷取請求主體全部內容
"use strict";const http = require(‘http‘);const server = http.createServer(function (req, res) { // console.log(req.headers); // console.log(req.url); // console.log(req.method); // console.log(req.httpVersion); // 擷取請求主體內容 let body = ‘‘; req.on(‘data‘, function (thunk) { body += thunk; }); req.on(‘end‘, function () { console.log(body); res.setHeader(‘Content-Type‘, ‘text/html‘); res.end(‘<h1>‘ + body + ‘</h1>‘); }); });server.listen(3000);console.log(‘server is running in localhost:3000……‘);
4、http.ServerResponse對象方法:
res.end([data][,encoding][,callback]) 用於聲明整個請求已經發送完畢,同時也可以響應發送資料,每個響應必須調用一次,否則會導致請求持續串連不斷的狀態
res.write(chunk[,encoding][,callback]) 用於往請求主體匯總寫入資料,並且調用了這個方法後,回應標頭以及響應行也不能再操作了(在end前分多次發送資料,必須在end前調用)
res.statusCode <Number> 可操作響應狀態代碼(eg:200,404)(狀態代碼和瀏覽器顯示內容沒有關係,一般都是後端設定商量好的,可以是404,單頁面顯示正常)
res.statusMessage <string> 可操作響應狀態資訊
res.writeHead(statusCode[,statusMessage][,headers]) 佈建要求頭部,可以同時設定statusCode、statusMessage、headers,其中headers為一個對象
"use strict";const http = require(‘http‘);const server = http.createServer(function (req, res) { // 設定響應狀態代碼 res.statusCode = 200; // 設定響應狀態資訊 res.statusMessage = ‘req success‘; // 設定回應標頭 res.setHeader(‘Content-Type‘, ‘text/html‘); // 響應資料,可分多次寫入 res.write(‘<h1>write01</h1>‘); res.write(‘<h1>write02</h1>‘); // 響應 res.end(‘<h1>end</h1>‘);});server.listen(3000);console.log(‘server is running in localhost:3000……‘);
五、url模組
url.parse(urlString[,parseQueryString[,slashesDenoteHost]]) 將一個urlString進行解析
第一個參數是url,第二個參數是一個boolean值,如果為true,則會將url中query解析為一個object返回,如果為false,則返回的query屬性值則為一個未解析、未編碼的string,預設為false
"use strict";const http = require(‘http‘);const url = require(‘url‘);const server = http.createServer(function (req, res) { const urlObj = url.parse(req.url, true); console.log(urlObj); res.end(‘<h1>parse urlString</h1>‘);});server.listen(3000);console.log(‘server is running in localhost:3000……‘);
列印結果為:(標紅屬性是我們常用的)
Url { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: ‘?name=lyl&age=18‘, query: { name: ‘lyl‘, age: ‘18‘ }, pathname: ‘/mypage/page01‘, path: ‘/mypage/page01?name=lyl&age=18‘, href: ‘/mypage/page01?name=lyl&age=18‘
}
使用如上這些知識,我們做很多東西:
1、使用url.parse(req,url, true)來解析url,然後根據不同的url來做出不同的響應。
2、我們可以根據不同的url進行路由選擇,使用fs模組讀取不同html模板檔案,擷取響應資料,然後對用戶端做出響應,從而顯示不同頁面和資料。
這是最簡單的原理,但實現起來從最佳化、速度等方面總會產生很多問題,但總來來說原理都是這樣。
-------------------------------------------------------------------------------------------------------------------------end
nodejs模組之http&&url