node一個重要任務是用來建立web服務,接下來我們就學習與此相關的一個重要的api -- http。我們使用http.createServer()建立一個http服務的執行個體,用來處理來自客戶的請求。http模組包含一些重要的內容,下面我們就來學習。
http伺服器
我們先來看一個簡單的例子,如何建立一個簡單的伺服器。
require('http').createServer(function(req,res){
res.writeHead(200, {}); res.end('hello world');}
).listen(8125);
上面的代碼比較簡單,使用require('http')建立了一個http的執行個體,然後使用createServer方法建立了一個伺服器,使用listen監聽8125連接埠。上面的代碼使用了鏈式的編碼風格,雖然簡單但是可讀性差,變數複用性也不好,所以我們建議使用下面的編碼風格。
var http = require('http');var server = http.createServer();var handleReq = function(req,res){ res.writeHead(200, {}); res.end('hello world');};server.on('request', handleReq);server.listen(8125);
現在的代碼就明了多了,通過 var server = http.createServer() 建立了伺服器,並把它儲存在變數server中,接下來使用server.on('request', handleReq)綁定request事件。對request事件的綁定,例1鏈式風格的編碼並沒能直接體現出來。
http提供了很多其他的事件,下面我們簡單介紹。
1.connection和close:分別代表建立和關閉與用戶端的tcp串連。
2.checkContinue:當用戶端向伺服器端發送大量資料的時候,他將檢查是否可以繼續,此時觸發事件。當觸發了checkContinue事件時,request事件不再觸發。
3.upgrade:當用戶端請求升級協議的時候觸發,如果該事件沒有相應的處理,伺服器將拒絕升級。
4.clientError:用戶端發生異常時觸發。
http用戶端
有時候你需要使用到向外串連的http請求,例如使用web服務,訪問文本資料來源或者抓取web網站資訊,這時你可以使用http.ClientRequest建立http請求。先看一個例子:
var http = require('http');var opts = { host: 'www.google.com' port: 80, path: '/', method: 'GET'};var req = http.request(opts, function(res) { console.log(res); res.on('data', function(data) { console.log(data); });});req.end();
我們建立了一個http請求,為響應添加了data事件,最後使用req.end()初始化和發送我們的請求。
建立http GET 請求
var http = require('http');var opts = { host: 'www.google.com' port: 80, path: '/',};var req = http.get(opts, function(res) { console.log(res); res.on('data', function(data) { console.log(data); });});
這個例子和之前的例子實現同樣的功能,區別就在於opts對象少了method屬性,使用http.get()代替了之前的var req=http.request()和req.end()。由於返回回來的資料是2進位資料,我們需要使用response.setEncoding()實現編碼,所以我們需要對代碼做點小修改。
var http = require('http');var opts = { host: 'www.google.com' port: 80, path: '/',};var req = http.get(opts, function(res) { console.log(res);
res.setEncoding('utf8'); res.on('data', function(data) { console.log(data); });});
使用http POST和PUT發送資料
var options = { host: 'www.example.com', port: 80, path: '/submit', method: 'POST'};var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); });});req.write("my data");req.write("more of my data");req.end();
上面的例子我們使用了req.write()方法,向伺服器說明我們要發送的資料,最後使用req.end()初始化並發送請求。代碼中的res是ClientResponse對象,他有兩個重要的屬性:statusCode(狀態代碼)和header(回應標頭)。
URL
url模組提供了一些方法,讓我們解析和處理url字串變得更加簡單,這些方法包括:parse, format和resolve。我們來看例子,逐行在node REPL中執行下面的命令(之前的課程講到了如何使用,node.js入門 - 8.api:events)。
var URL = require('url');var myUrl = "http://www.nodejs.org/some/url/?with=query¶m=that&are=awesome#alsoahash";myUrlparsedUrl = URL.parse(myUrl);parsedUrl = URL.parse(myUrl, true);
執行結果:
querystring
querystring模組式用來處理querystring字串的,他包括如下方法:parse, decode, escape, unescape, unescapeBuffer, encode和stringify。我們來看一個例子。
var qs = require('querystring');qs.parse('a=1&b=2&c=d');
執行結果:
再來一例,關於encode方法。
var qs = require('querystring');var myObj = {'a':1, 'b':5, 'c':'cats', 'func': function(){console.log('dogs')}}qs.encode(myObj);
執行結果: