1. 程式人生 > >入門到放棄node系列之網路模組(一)

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

前言

本文首發公眾號【一名打字員】
上一次相信大家都基本瞭解node的用法了,有做功課的童鞋肯定回去溫習了一下js的語法。這些年來js發展很快,出了很多類似許多vue、react、node等等眾所周知的玩意兒,對應的社群配套也越來越完善。好的,接下來我們補充一下node的內建網路模組,順帶複習一下網路程式設計的相關知識,畢竟“技多不壓身”。

API概覽

其實nodejs一開始就是幫助編寫高效能的web伺服器,在這裡簡單介紹一下相關的API,好讓大家知道什麼情況下該使用哪個API,具體使用的方法還是去官網上瞄一下,畢竟官網已經解釋的不能再詳細了。我們將會介紹

  • HTTP
  • HTTPS
  • URL
  • QUERY STRING
  • ZLIB
  • NET

今天我們先主要介紹一下HTTP與HTTPS。

  • HTTP與HTTPS

HTTP與HTTPS模組基本上都一樣,唯一不同的地方就是HTTPS訪問我們通常是需要證書的嘛,所以需要單獨處理一下SSL證書。在這裡先介紹一下HTTP模組,使用HTTP模組有兩種用途,一是作為服務端,建立一個HTTP伺服器,監聽客戶端並響應。二是作為客戶端,進行HTTP請求,獲取服務端資訊。

說到HTTP請求,不得不插一句,相信很多人對其既陌生又熟悉。它大致上分為請求頭和請求體,也就是我們常說的Request hearders和Request Body。就從訪問某搜尋引擎的請求來說,他的訪問靜態資源時請求內容如下:

host:ss0.bdstatic.com
method:GET
path:/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png
scheme:https
version:HTTP/1.1
accept:image/webp,image/*,*/*;q=0.8
accept-encoding:gzip, deflate, sdch
accept-language:zh-CN,zh;q=0.8
cache-control:max-age=0
if-modified-since:Tue, 06 Jun 2017 06:04:45 GMT
if-none
-match:"593645fd-e7a" referer:https://www.baidu.com/?tn=57095150_6_oem_dg user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36

由於這裡是一個GET方法,所以上面都是請求頭部分,當我們使用POST請求時,則會加上body。當客戶端傳送請求到我們服務端時,我們接收到對應的請求,就會呼叫相應的回撥函式。在回撥函式中我們就可以使用request物件來讀取請求頭的資料以及請求體的資料。
貼出新建一個HTTP伺服器的示例程式碼,示例中建立了一個服務端應用並監控8080埠,當接收到客戶端請求時,將會打印出請求頭部內容以及請求體內容:

//建立一個服務
http.createServer(function (request, response) {
    var body = []
    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埠

HTTP響應與請求一樣,也分為響應頭和響應體。我們可以使用response物件來操作響應資料。我們將上面的例子改一下,將客戶端的請求資料再返給客戶端。

//建立一個服務
http.createServer(function (request, response) {
    var body = []
    //寫入響應資料
    response.writeHead(200, { 'Content-Type': 'text/plain' })
    request.on('data', function (chunk) {
        response.write(chunk)
        body.push(chunk)
    })

    request.on('end', function () {
        body = Buffer.concat(body)
        response.end()
    })
}).listen(8080)//監聽8080埠

以上就是服務端所操作的過程,那麼有人問了,客戶端該如何操作呢。下面我們介紹一下客戶端的流程,下面使用的是node中網路請求比較方便的模組request,當然node也提供了一個便捷的API供我們使用,各取所需嘛。

//HTTP內建API
http.get('http://www.example.com/', function (response) {});
//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'  
    },
}
//發起服務端請求
var request = http.request(options, function(result) {})
    request.on('error', function (e) {})
    //寫入請求體內容
    request.write(qs.stringify({username:userName,password:pwd,captcha:cap}))
    request.end()

這樣一個完整的客戶端發起請求到服務端響應返回資料的流程就結束了,最後我們介紹一下HTTPS中使用證書的步驟,因為HTTPS提供一個安全的加密的環境,保證了網際網路請求的安全性。與上面的程式碼類似,我們只需要在建立服務時增加倆個引數即可。

var options = {
        key: fs.readFileSync('./ssl/default.key'),
        cert: fs.readFileSync('./ssl/default.cer')
    }
//建立一個HTTPS服務
http.createServer(options,(request, response) =>{
    //請求處理
})

有的童鞋在這裡肯定自己動手搭建了起來,會發現客戶端https在用自建證書時客戶端訪問不了被拒絕了,嘗試著在請求的頭部中加上這一句,rejectUnauthorized: false是不是發現可以了呢,趕緊試一試吧。

結語

今天介紹了nodejs中利用HTTP以及HTTPS模組建立一個簡單的服務端程式以及客戶端的請求。下次我們會介紹node同樣在網路程式設計中比較有用的模組。

彩蛋

細心的同學就會發現了,打字員大大,你的程式裡咋都沒有結束符號;呀。最後一個函式咋變成了(res)=>{}了,是不是BUG寫多了手抖了。答案當然不是,這是ES6的語法,out了吧。ES6是JavaScript語言的一個標準,已經在2015釋出,ES是ECMAScript,簡單來說ECMAScript是JavaScript語言的國際標準,JavaScript是ECMAScript的實現。在這裡你會看到一個不一樣的js,對一個面向物件程式設計的打字員來說也很友好,有興趣的同學可以自己去研究一下。(逃