在介紹本節的內容前,先了解如下的概念:
什麼是Http?
也即超文本傳輸協議(HTTP ,HyperText Transfer Protocol),是互聯網上應用最爲廣泛的一種網絡協議。所有的文件都必須遵守這個標準。設計最初的目的是爲了提供一種發佈和接收頁面的方法,簡單的說就是一種協議,它定義了通訊的客戶端與服務器端如何傳輸數據。
什麼是Web服務器?
Web服務器一般指網站服務器,是指駐留於因特網上某種類型計算機的程序,Web服務器的基本功能就是提供Web信息瀏覽服務。它只需支持HTTP協議、HTML文檔格式及URL,與客戶端的網絡瀏覽器配合。大多數 web 服務器都支持服務端的腳本語言(php、python、ruby)等,並通過腳本語言從數據庫獲取數據,將結果返回給客戶端瀏覽器。
目前最主流的三個Web服務器是Apache、Nginx、IIS。
Web應用框架(圖片來自百度):
Client - 客戶端,一般指瀏覽器,瀏覽器可以通過 HTTP 協議向服務器請求數據。
Server - 服務端,一般指 Web 服務器,可以接收客戶端請求,並向客戶端發送響應數據。
Business - 業務層, 通過 Web 服務器處理應用程序,如與數據庫交互,邏輯運算,調用外部程序等。
Data - 數據層,一般由數據庫組成。
以上的邏輯可以分爲三層:用戶界面層,業務邏輯層,數據訪問層。也就是通常所講的三層架構。
三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分爲:界面層(User Interface layer)、業務邏輯層(Business Logic Layer)、數據訪問層(Data access layer)。區分層次的目的即爲了“高內聚低耦合”的思想。在軟件體系架構設計中,分層式結構是最常見,也是最重要的一種結構。微軟推薦的分層式結構一般分爲三層,從下至上分別爲:數據訪問層、業務邏輯層(又或稱爲領域層)、表示層。
用戶通過客戶端界面(用戶界面層),向服務器發出請求,服務器接收到請求以後,根據用戶的請求進行業務邏輯處理(業務邏輯層),並向後臺數據庫請求數據(數據訪問層)。最後將請求獲取到的數據,呈現給前臺用戶。如下圖(圖片來自百度):
簡單的Node.js Http
在之前的學習類容中,我們學習瞭如下的代碼:
var http = require('http');
http.createServer(function (req, res) {
res.end('Hello World');
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
1、從Node.js 的核心請求http模塊並賦予一個變量,以後便以後在腳本中使用。
2、使用http.createServer方法撞見一個新的Web服務器對象,該對象的參數是一個匿名函數,函數的參數req代表請求,res代表回覆的信息。
3、當請求到來時,應當相應"Hello World"字符串,然後關閉連接。
4、在最後定義了Web服務器的端口以及主機IP地址,這就意味着可以通過http://10.17.255.73:3000/ 這個地址來進行訪問。
將上面的代碼保存爲Server.js 然後在網頁中數據http://10.17.255.73:3000/,此時可以看到瀏覽器輸出信息爲"Hello World“。注意
這裏的IP地址與端口,是在服務器端的IP地址與端口,實際運用中需要進行調整。
給服務器回覆增加頭信息
var http = require('http');
http.createServer(function (req, res) {
console.log(req)
<strong>res.writeHead(200, {
'Content-Type': 'text/plain'</strong>
});
res.end('Hello World');
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
在上面的代碼中,我們增加了一段頭信息,這個信息,當服務器收到客戶端的請求時,回覆給客服端,內容是'text/plain',文本格式,這裏的200是一個狀態碼,代表服務器端成功接收到消息。
這裏我們可以看出,通過res.writeHead,可以回覆給客戶端一些信息,那麼我們是否可以回覆其他的內容呢?當然可以,比如我們需要進行頁面重定向的時候,我們就可以這樣修改代碼:
var http = require('http');
http.createServer(function (req, res) {
<strong>res.writeHead(301, {
'': 'http://www.runoob.com/nodejs/nodejs-web-module.html'
});</strong>
res.end();
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
服務器收到客戶端的請求的以後,會回覆客戶端,讓其通過301重定向到http://www.runoob.com/nodejs/nodejs-web-module.html 這個網站。
當然,我們可以通過截獲客戶端請求的內容,然後針對內容進行回覆客戶端信息,見如下的代碼:
var http = require('http'),
url = require('url');
http.createServer(function (req, res) {
var pathname = url.parse(req.url).pathname;
if (pathname === '/') {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Home Page\n')
} else if (pathname === '/about') {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('About Us\n')
} else if (pathname === '/redirect') {
res.writeHead(301, {
'Location': '/'
});
res.end();
} else {
res.writeHead(404, {
'Content-Type': 'text/plain'
});
res.end('Page not found\n')
}
}).listen(3000, "10.17.255.73");
console.log('Server running at http://10.17.255.73:3000/');
以上的內容,當服務器端收到客戶端的請求,然後對請求的地址(req.url)進行解析獲取pathname路徑,如果是"/" ,則給客戶端返回'Home Page\n',如果是'/about'
則返回'About Us\n'。以上的代碼示例,我們可以在客戶端輸入http://10.17.255.73:3000/,或者http://10.17.255.73:3000/about 進行觀察,客戶端將從服務器端獲取不同的請求數據。
以上是根據Node.js 關於Http 底層的簡單應用,後續我們將會增加更多的應用場景。