1. 程式人生 > 實用技巧 >Node 核心模組HTTP模組

Node 核心模組HTTP模組

Node 核心模組HTTP模組

客戶端、服務端對我們都不陌生,Node.js 中的 HTTP 介面被設計成支援協議的許多特性。 比如,大塊編碼的訊息。 這些介面不緩衝完整的請求或響應,使用者能夠以流的形式處理資料。

為了支援各種可能的 HTTP 應用,Node.js 的 HTTP API 是非常底層的。 它只涉及流處理與訊息解析。 它把一個訊息解析成訊息頭和訊息主體,但不解析具體的訊息頭或訊息主體。

1、API結構圖

1.1 模組類結構圖

1.2 Agent類結構圖

1.3 ClientRequest類結構圖

1.4 Server 類結構

1.5 ServerResponse類結構圖

1.6 IncomingMessage類結構圖

1.7 靜態方法和屬性圖

2、實現常用http服務案例

開啟http服務

// 1. 匯入http模組
var http = require('http');

// 2. 使用http這個模組中的createServer()建立一個伺服器例項物件
var server = http.createServer();

// 3. 繫結埠號,啟動web伺服器
server.listen(8000, function() {
    console.log(' 請訪問http://localhost:8000');
});

// 4. 為這個伺服器例項物件註冊 request 請求處理函式
// 請求處理函式function(形參1,形參2){}
// 形參1:request請求物件 獲取到當前請求的路徑,方法等本次請求的所有資訊
// 形參2:response響應物件 傳送響應資料
server.on('request', function(request, response) {
    console.log('服務端收到客戶端的請求啦!!!');
    // 向客戶端頁面返回字串
    response.write("hello node");
    // 結束響應
    response.end();
});

執行結果

客戶端請求兩次的問題

用瀏覽器訪問你會發現,node啟動的服務會被請求兩次,這是怎麼回事呢?

列印下請求的url

原來是請求了favicon.ico(瀏覽器預設會請求一次favicon.ico),那就做下過濾吧

// 1. 匯入http模組
var http = require('http');

// 2. 使用http這個模組中的createServer()建立一個伺服器例項物件
var server = http.createServer();

// 3. 繫結埠號,啟動web伺服器
server.listen(8000, function() {
    console.log(' 請訪問http://localhost:8000');
});

// 4. 為這個伺服器例項物件註冊 request 請求處理函式
// 請求處理函式function(形參1,形參2){}
// 形參1:request請求物件 獲取到當前請求的路徑,方法等本次請求的所有資訊
// 形參2:response響應物件 傳送響應資料
server.on('request', function(request, response) {
    //過濾請求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }

    console.log('服務端收到客戶端的請求啦!!!');
    //列印請求的url
    console.log(request.url);
    // 向客戶端頁面返回字串
    response.write("hello node");
    // 結束響應
    response.end();
});

執行結果

已被過濾

響應中文亂碼的問題

當我們想響應中文,你會發現中文是亂碼的

這時候就需要設定響應頭了,告訴瀏覽器我響應的是什麼型別的資料

// 設定響應頭
response.setHeader('Content-Type', 'text/html;charset=utf-8');

例:

// 1. 匯入http模組
var http = require('http');

// 2. 使用http這個模組中的createServer()建立一個伺服器例項物件
var server = http.createServer();

// 3. 繫結埠號,啟動web伺服器
server.listen(8000, function() {
    console.log(' 請訪問http://localhost:8000');
});

// 4. 為這個伺服器例項物件註冊 request 請求處理函式
// 請求處理函式function(形參1,形參2){}
// 形參1:request請求物件 獲取到當前請求的路徑,方法等本次請求的所有資訊
// 形參2:response響應物件 傳送響應資料
server.on('request', function(request, response) {
    //過濾請求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }

    console.log('服務端收到客戶端的請求啦!!!');
    //列印請求的url
    console.log(request.url);


    // 設定響應頭
    response.setHeader('Content-Type', 'text/html;charset=utf-8');

    // 向客戶端頁面返回字串
    response.write("hello node");
    response.write("你好世界");
    // 結束響應
    response.end();
});

執行結果

響應整個html頁面

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試Node 響應 html</title>
</head>
<body>
<h1>Node 響應整個html</h1>
</body>
</html>

httpServer.js

// 1. 匯入http模組
var http = require('http');
var fs = require('fs');

// 2. 使用http這個模組中的createServer()建立一個伺服器例項物件
var server = http.createServer();

// 3. 繫結埠號,啟動web伺服器
server.listen(8000, function() {
    console.log(' 請訪問http://localhost:8000');
});

// 4. 為這個伺服器例項物件註冊 request 請求處理函式
// 請求處理函式function(形參1,形參2){}
// 形參1:request請求物件 獲取到當前請求的路徑,方法等本次請求的所有資訊
// 形參2:response響應物件 傳送響應資料
server.on('request', function(request, response) {
    //過濾請求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }
    // 設定響應頭
    response.setHeader('Content-Type', 'text/html;charset=utf-8');

    //讀取index.html並響應
    fs.readFile('./index.html', 'utf-8', function (error, data) {
        // 結束響應
        response.end(data);
    });
});

執行結果

響應圖片

如果響應http頁面中有圖片,你列印請求的連結你會發現,會向伺服器再次請求圖片,如

這時候我們可以根據請求連結判斷,去處理是請求html頁面還是圖片,判斷如果是圖片的話就直接返回圖片,如

// 判斷請求圖片
if (request.url.indexOf('jpg') >= 0) {
    fs.readFile('./img.jpg', function (error, data) {
        response.end(data);
    });
    return;
}

完整程式碼

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>測試Node 響應 html</title>
</head>
<body>
<h1>Node 響應整個html</h1>

<img src="img.jpg"/>

</body>
</html>

httpServer.js

// 1. 匯入http模組
var http = require('http');
var fs = require('fs');

// 2. 使用http這個模組中的createServer()建立一個伺服器例項物件
var server = http.createServer();

// 3. 繫結埠號,啟動web伺服器
server.listen(8000, function() {
    console.log(' 請訪問http://localhost:8000');
});

// 4. 為這個伺服器例項物件註冊 request 請求處理函式
// 請求處理函式function(形參1,形參2){}
// 形參1:request請求物件 獲取到當前請求的路徑,方法等本次請求的所有資訊
// 形參2:response響應物件 傳送響應資料
server.on('request', function(request, response) {
    console.log(request.url, '請求連結');
    //過濾請求favicon.ico
    if(request.url === '/favicon.ico'){
        return;
    }

    // 判斷請求圖片
    if (request.url.indexOf('jpg') >= 0) {
        fs.readFile('./img.jpg', function (error, data) {
            response.end(data);
        });
        return;
    }

    // 設定響應頭
    response.setHeader('Content-Type', 'text/html;charset=utf-8');

    //讀取index.html並響應
    fs.readFile('./index.html', 'utf-8', function (error, data) {
        // 結束響應
        response.end(data);
    });

});

執行結果

響應一切靜態資源

前面已經可以響應html頁面和圖片了,但是圖片是根據url判斷的,那如果要響應其他的靜態資源呢,難道每個都做判斷,這顯然太麻煩了,不過你總結一下會發現其實我們要響應的就兩種,一種是html頁面還有一種是靜態資源(圖片,js,css),那就可以吧我們的程式碼稍微改下

// 1. 匯入http模組
var http = require('http');
var fs = require('fs');

// 2. 使用http這個模組中的createServer()建立一個伺服器例項物件
var server = http.createServer();

// 3. 繫結埠號,啟動web伺服器
server.listen(8000, function() {
    console.log(' 請訪問http://localhost:8000');
});

// 4. 為這個伺服器例項物件註冊 request 請求處理函式
// 請求處理函式function(形參1,形參2){}
// 形參1:request請求物件 獲取到當前請求的路徑,方法等本次請求的所有資訊
// 形參2:response響應物件 傳送響應資料
server.on('request', function(request, response) {
    console.log(request.url, '----請求連結');
    //響應html頁面
    if(request.url === '/'){
        // 設定響應頭
        response.setHeader('Content-Type', 'text/html;charset=utf-8');
        //讀取index.html並響應
        fs.readFile('./index.html', 'utf-8', function (error, data) {
            // 結束響應
            response.end(data);
        });
    }else{
        //響應其他靜態資源
        fs.readFile('.'+request.url,function(error,data){
            response.end(data);
        })
    }

});

執行結果