Node.js Http 介紹

在介紹本節的內容前,先了解如下的概念:

什麼是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 底層的簡單應用,後續我們將會增加更多的應用場景。

 



 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章