node之http相關學習

http協議

在學習node的http模塊以前,先了解一下http協議。
HTTP協議(HyperText Transfer Protocol,超文本傳輸協議)是用於從WWW服務器傳輸超文本到本地瀏覽器的傳送協議它是基於TCP的應用層協議,它不關心數據傳輸的細節,主要是用來規定客戶端和服務端的數據傳輸格式,最初是用來向客戶端傳輸HTML頁面的內容。默認端口是80。
HTTP協議一般承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了咱們常說的HTTPS
圖片描述javascript

http報文

  1. 請求報文

圖片描述
請求報文就是由請求行、請求頭、內容實體組成的。其中請求頭是鍵值對的形式存在的,就是字段名:值;請求行指定的是請求方法、請求URL、協議版本;內容實體就是要傳輸的數據。
如訪問www.baidu.com的請求頭:
圖片描述
圖片描述html

  1. 響應報文

HTTP的響應報文也由響應行,響應頭,響應體三部分組成。
例訪問www.baidu.com的響應頭:
圖片描述java

http狀態碼

狀態碼是用來告知客戶端服務器端處理請求的結果。憑藉狀態碼用戶能夠知道服務器是請求處理成功、失敗或者是被轉發。
圖片描述node

post和get

post和get方法是咱們比較經常使用的http請求方式。web

  1. get:
    使用get方法時,查詢字符串添加到URL地址後一塊兒發送到服務器:
    www.baidu.com/s?wd=http&ie=utf-8
    get請求可以被緩存
    get請求會保存在瀏覽器的瀏覽記錄中
    以get請求的URL可以保存爲瀏覽器書籤
    get請求有長度限制
    get請求主要用以獲取數據

2.post:正則表達式

使用POST方法時,查詢字符串在post信息中單獨存在,和http請求一塊兒發送到服務器,通常表單數據提交都用post的方式。
post請求不能被緩存下來
post請求不會保存在瀏覽器瀏覽記錄中
以post請求的URL沒法保存爲瀏覽器書籤
post請求沒有長度限制

node的http模塊

Node.js標準庫提供了http模塊,該模塊是Node中很是重要的一個核心模塊。使用http.createServer方法能夠建立http服務器,http.request方法建立一個http客戶端。瀏覽器

簡單web服務器

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.ServerRequset

http請求分爲請求頭和請求體,若是請求的內容少的話就直接在請求頭協議完成以後當即讀取,請求體可能相對較長一點,須要必定的時間傳輸。所以提供了三個事件用於控制請求體傳輸:socket

  1. data.當請求體數據到來時,該事件被觸發,該事件一共一個參數chunk,表示接受到的數據。
  2. end.當請求體數據傳輸完成時,該事件被觸發,此後將不會再有數據到來。
  3. close.用戶當前請求結束時,該事件被觸發,不一樣於end,若是用戶強制終止了傳輸,也會觸發close。

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

因爲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

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.ServerResponse用來給用戶發送響應結果,它是由http.Server的request事件發送的,做爲第二個參數傳遞。
response.writeHead(statusCode,[headers]):向請求的客戶端發送響應頭
response.write(data,[encoding]):向請求客戶端發送相應內容,data是buffer或字符串,encoding爲編碼
response.end([data],[encoding]):結束響應,告知用戶全部發送已經完成,當全部要返回的內容發送完畢,該函數必須被調用一次,若是不調用,客戶端永遠處於等待狀態

url模塊

在開發過程當中, 咱們能夠經過正則表達式獲取到一個url地址中的某一部分。而url模塊提供了一些實用函數,用於url處理與解析。經過const url = require('url');引入。url.parse()來分解。
圖片描述

相關文章
相關標籤/搜索