nodejs模組之http&&url

來源:互聯網
上載者:User

標籤:允許   內容   color   lob   報文   lis   hunk   number   function   

我們使用nodejs中的http模組來進行網路操作

一、什麼是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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.