在學習node的http模塊以前,先了解一下http協議。
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議它是基於TCP的應用層協議,它不關心數據傳輸的細節,主要是用來規定客戶端和服務端的數據傳輸格式,最初是用來向客戶端傳輸HTML頁面的內容。默認端口是80。
HTTP協議一般承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了咱們常說的HTTPS
javascript
請求報文就是由請求行、請求頭、內容實體組成的。其中請求頭是鍵值對的形式存在的,就是字段名:值;請求行指定的是請求方法、請求URL、協議版本;內容實體就是要傳輸的數據。
如訪問www.baidu.com的請求頭:
html
HTTP的響應報文也由響應行,響應頭,響應體三部分組成。
例訪問www.baidu.com的響應頭:
java
狀態碼是用來告知客戶端服務器端處理請求的結果。憑藉狀態碼用戶能夠知道服務器是請求處理成功、失敗或者是被轉發。
node
post和get方法是咱們比較經常使用的http請求方式。web
2.post:正則表達式
使用POST方法時,查詢字符串在post信息中單獨存在,和http請求一塊兒發送到服務器,通常表單數據提交都用post的方式。 post請求不能被緩存下來 post請求不會保存在瀏覽器瀏覽記錄中 以post請求的URL沒法保存爲瀏覽器書籤 post請求沒有長度限制
Node.js標準庫提供了http模塊,該模塊是Node中很是重要的一個核心模塊。使用http.createServer方法能夠建立http服務器,http.request方法建立一個http客戶端。瀏覽器
http.server是一個基於事件的HTTP服務器,全部的請求都被封裝到獨立的事件當中。緩存
let http = require('http'); //建立web服務器,提供服務,處理客戶端的請求 //普通方式監聽 let server = http.createServer((req,res)=>{ //req客戶端請求的相關信息,res返回響應信息 let url = req.url; //解決中文亂碼 res.writeHead(200, {'Content-Type': 'text/plain;charset=utf-8'}); res.end('訪問路徑:'+url); }).listen(9000); //request事件監聽 /*server.on('request', (req, res) => { console.log(req.url); //設置應答頭信息 res.writeHead(200, { 'Content-Type': 'text/html' }); res.write('HHHHH<br>'); }); server.listen(9000);*/ //當TCP創建鏈接的時候,該事件被觸發,提供了一個參數socket,爲net.socket的實例(底層協議對象) server.on('connection',(req,socket,head)=>{ console.log('有鏈接'); });
在瀏覽器經過http://localhost:9000/
便可訪問:
服務器
http請求分爲請求頭和請求體,若是請求的內容少的話就直接在請求頭協議完成以後當即讀取,請求體可能相對較長一點,須要必定的時間傳輸。所以提供了三個事件用於控制請求體傳輸:socket
serverRequest經常使用信息:
let http = require('http'); let server = http.createServer((req,res)=>{ //客戶端請求是否發送完成 console.log(req.complete); //http協議版本 console.log(req.httpVersion); //connnection console.log(req.socket); //http請求頭 console.log(req.headers); //http請求方法 console.log(req.method); res.writeHead(200,{'Content-Type':'text/plain'}); res.write("hahahaha"); res.end(); }).listen(9000);
因爲get請求直接被嵌入在路徑中,URL完整的請求路徑包括了?後面的部分,所以咱們能夠手動解析後面的內容做爲get的參數,Nodejs的url模塊中的parse函數提供了這個功能。
const http = require('http'); const url = require('url'); const util = require('util'); http.createServer((req, res) => { // 利用url模塊去解析客戶端發送過來的URL res.write(util.inspect(url.parse(req.url, true))); res.end(); }).listen(9000);
post請求的內容所有都在請求體中,http.ServerRequest並無一個屬性內容爲請求體,由於等待請求體傳輸多是一件耗時的工做, 好比: 上傳文件。惡意的post請求會大大消耗服務器資源,因此Node是不會解析請求體,當你須要的時候,須要手動來作。
// 獲取post請求數據 const http = require('http'); const util = require('util'); const querystring = require('querystring'); http.createServer((req, res) => { let post = ''; req.on('data', chunk => { post += chunk; }); req.on('end', () => { post = querystring.parse(post); res.end(util.inspect(post)); }); }).listen(9000);
http.ServerResponse用來給用戶發送響應結果,它是由http.Server的request事件發送的,做爲第二個參數傳遞。
response.writeHead(statusCode,[headers]):向請求的客戶端發送響應頭
response.write(data,[encoding]):向請求客戶端發送相應內容,data是buffer或字符串,encoding爲編碼
response.end([data],[encoding]):結束響應,告知用戶全部發送已經完成,當全部要返回的內容發送完畢,該函數必須被調用一次,若是不調用,客戶端永遠處於等待狀態
在開發過程當中, 咱們能夠經過正則表達式獲取到一個url地址中的某一部分。而url模塊提供了一些實用函數,用於url處理與解析。經過const url = require('url');
引入。url.parse()
來分解。