nodejs模塊之http&&url
我們使用nodejs中的http模塊來進行網絡操作
一、什麽是HTTP協議:
超文本傳輸協議(HyperText Transfer Protocol)HTTP假定其下層協議提供可靠傳輸。
因此,任何能夠提供這種保證的協議都可以被其使用。因此也就是使用TCP作為其傳輸層。
二、HTTP請求和響應報文的結構:
HTTP請求的結構:
請求行 GET /images/logo.gif HTTP/1.1 表示從/images目錄下請求logo.gif這個文件
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
空行 區分請求頭和請求主體
---------------------------------------------------------------------------------
請求主體 請求中的內容
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