入門到放棄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.commethod:GETpath:/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.pngscheme:httpsversion:HTTP/1.1accept:image/webp,image/*,*/*;q=0.8accept-encoding:gzip, deflate, sdchaccept-language:zh-CN,zh;q=0.8cache-control:max-age=0if-modified-since:Tue, 06 Jun 2017 06:04:45 GMTif-none-match:"593645fd-e7a"referer:https://www.baidu.com/?tn=57095150_6_oem_dguser-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內置APIhttp.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,對一個面向對象編程的打字員來說也很友好,有興趣的同學可以自己去研究一下。(逃

推薦閱讀:

使用markdown製作的html幻燈片有哪些?
請問一下,跨平台解決方案中,Qt 和 Electron 孰優孰劣?
node.js與php相比有哪些優缺點?未來會替代php成為最好的語言嗎?
php 和nodejs 的各自優勢有哪些,如果無基礎開始,要學那個好?
es6 import from xx , 是怎麼實現找到 node_modules目錄下的?

TAG:入門指南 | Nodejs | 計算機網路 |