入門到放棄node系列之網絡模塊(二)

前言

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

模塊概述

  • URL

在咱們處理HTTP請求時,URL模塊是咱們使用頻率最高的,由於它能夠幫助咱們更快的解析、生成和拼接URL。
URL提供了一個parse方法,能夠將url變成一個對象。node

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字符串。api

  • 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來建立一個簡單的客戶端和服務端應用。app

//服務端應用
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('\n'));
    });
}).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('\n'));
    });

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

結語

到這裏咱們的網絡模塊基本上就結束了。在這一模塊裏面咱們知道了如下幾點內容curl

  • 咱們可以很方便的經過http和https進行一個客戶端的請求與搭建一個服務端應用
  • 處理http請求時每每回家上url.parse方法
  • 能夠經過request和response對象來讀寫對應的數據
  • node中支持壓縮和解壓數據以及支持socket編程
  • 人生無奈,我用node

下一次咱們的入門到放棄node系列分享點什麼呢,請發送到公衆號後臺一塊兒投票吧!socket

相關文章
相關標籤/搜索