入門到放棄node系列之網路模組(二)

wslongchen發表於2019-02-16

前言

本文首發【一名打字員】
上一節我們剛剛介紹完node的HTTP和HTTPS模組,相信我們也對nodejs有了更深層次的理解,接下來緊接著上一節的內容繼續繼續。

模組概述

  • URL

在我們處理HTTP請求時,URL模組是我們使用頻率最高的,因為它可以幫助我們更快的解析、生成和拼接URL。
URL提供了一個parse方法,可以將url變成一個物件。

let url = require(`url`)
url.parse(`http://www.mrpann.cn:8080/p/a/t/h?query=string#hash`);
 =>
{ protocol: `http:`,
  host: `www.mrpann.cn:8080`,
  port: `8080`,
  hostname: `www.mrpann.cn`,
  hash: `#hash`,
  search: `?query=string`,
  query: `query=string`,
  pathname: `/p/a/t/h`,
  path: `/p/a/t/h?query=string`,
  href: `http://www.mrpann.cn:8080/p/a/t/h?query=string#hash` }

通過上面的方法,我們可以很輕鬆的拿到請求地址中有關的資訊,同時,我們也能通過使用format方法,將一個URL物件格式化成一個請求地址。這個時候有的童鞋問了,打字員大大,我想拼接url怎麼辦呢,除了原始的+來拼接之外,我們還可以用resolve。示例如下:

url.resolve(`http://www.mrpann.cn/api`, `../user`);
=>
/* http://www.mrpann.cn/api/user */
  • QUERY STRING

在實際運用中,當我們客戶端傳送請求的時候,我們往往URL引數字串與引數物件的互相轉換。querystring就是為此而生的,舉個例子,當我們使用get方法請求一張圖片的時候,url地址為www.mpann.cn/resourse/img/user?type=img&isHistory=2。我就可以使用querystring.parse方法,轉換為{ type: `img`, isHistory: 2 }
同理,我們也能夠使用querystring.stringify將引數物件轉換為url字串。

  • ZLIB

當我們開發一個稍微龐大的系統的時候,往往某個請求中需要傳送比較大的資料給服務端或者返回稍大的資料給客戶端,但是往往因為資料量過大,導致請求失敗或者後臺無法接收。這個時候我們就可以使用zlib這個模組,它提供了資料壓縮和解壓的功能,通過zlib我們能很方便的壓縮HTTP響應體資料。在下面這個示例中我們展示瞭如何使用zlib這個模組。

//服務端
http.createServer(function (request, response) {
    var body = []
    var headers = request.headers
    //判斷是否支援gzip
    if(headers[`accept-encoding`] || ``).indexOf(`gzip`) != -1){
        zlib.gzip(data, function (err, data) {
            response.writeHead(200, {
                `Content-Type`: `text/plain`,
                `Content-Encoding`: `gzip`
            });
            response.end(data);
        });
    }else {
        response.writeHead(200, {
            `Content-Type`: `text/plain`
        });
        response.end(data);
    }
    console.log(request.headers)
    request.on(`data`, function (chunk) {
        body.push(chunk)
    })

    request.on(`end`, function () {
        body = Buffer.concat(body)
        console.log(body.toString())
    })
}).listen(8080)//監聽8080埠

//客戶端
//request模組請求
//構建請求頭資訊
var options = {  
    hostname: `www.mrpann.cn`,  
    port: 8880,  
    path: `/api/v1/user/login`,  
    method: `POST`,  
    headers: {  
        `Content-Type`: `application/x-www-form-urlencoded; charset=UTF-8`,
        `Accept-Encoding`: `gzip, deflate`  
    },
}
//發起服務端請求
var request = http.request(options, function(result) {
        var body = []
        result.on(`data`, function (chunk) {
            body.push(chunk)
        });
        result.on(`end`, function () {
            body = Buffer.concat(body)
            var headers = result.headers
            //判斷是否支援gzip壓縮
            if (headers[`content-encoding`] === `gzip`) {
                //進行解壓響應體
                zlib.gunzip(body, function (err, data) {
                    console.log(data.toString());
                });
            } else {
                console.log(data.toString());
            }
        });
    })
    request.on(`error`, function (e) {})
    //寫入請求體內容
    request.write(qs.stringify({username:userName,password:pwd,captcha:cap}))
    request.end()
  • NET

接觸過其它語言網路程式設計這一塊的童鞋應該比較熟悉socket。nodejs裡面有沒有呢,答案是肯定的。我們利用net模組可以建立一個socket服務端或者是客戶端。但是由於前端的侷限性,據本猿所知,使用socket的應用場景還很少,在這裡僅僅展示一下利用net來建立一個簡單的客戶端和服務端應用。

//服務端應用
net.createServer(function (conn) {
    conn.on(`data`, function (data) {
        conn.write([
            `HTTP/1.1 200 OK`,
            `Content-Type: text/plain`,
            `Content-Length: 11`,
            ``,
            `Hello World`
        ].join(`
`));
    });
}).listen(8080);
//客戶端應用
var options = {
        port: 8080,
        host: `www.example.com`
    };

var client = net.connect(options, function () {
        client.write([
            `GET / HTTP/1.1`,
            `User-Agent: curl/7.26.0`,
            `Host: www.baidu.com`,
            `Accept: */*`,
            ``,
            ``
        ].join(`
`));
    });

client.on(`data`, function (data) {
    console.log(data.toString());
    client.end();
});

結語

到這裡我們的網路模組基本上就結束了。在這一模組裡面我們知道了以下幾點內容

  • 我們能夠很方便的通過http和https進行一個客戶端的請求與搭建一個服務端應用
  • 處理http請求時往往回家上url.parse方法
  • 可以通過request和response物件來讀寫對應的資料
  • node中支援壓縮和解壓資料以及支援socket程式設計
  • 人生無奈,我用node

下一次我們的入門到放棄node系列分享點什麼呢,請傳送到公眾號後臺一起投票吧!

相關文章