1. 程式人生 > >nodejs模塊之http&&url

nodejs模塊之http&&url

關系 stl header bool 根據 是我 path sla hostname

我們使用nodejs中的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