node.js入门 - 9.api:http
node一個(gè)重要任務(wù)是用來創(chuàng)建web服務(wù),接下來我們就學(xué)習(xí)與此相關(guān)的一個(gè)重要的api -- http。我們使用http.createServer()創(chuàng)建一個(gè)http服務(wù)的實(shí)例,用來處理來自客戶的請(qǐng)求。http模塊包含一些重要的內(nèi)容,下面我們就來學(xué)習(xí)。
http服務(wù)器
我們先來看一個(gè)簡(jiǎn)單的例子,如何創(chuàng)建一個(gè)簡(jiǎn)單的服務(wù)器。
require('http').createServer(function(req,res){res.writeHead(200, {});res.end('hello world');}
).listen(8125);
上面的代碼比較簡(jiǎn)單,使用require('http')創(chuàng)建了一個(gè)http的實(shí)例,然后使用createServer方法創(chuàng)建了一個(gè)服務(wù)器,使用listen監(jiān)聽8125端口。上面的代碼使用了鏈?zhǔn)降木幋a風(fēng)格,雖然簡(jiǎn)單但是可讀性差,變量復(fù)用性也不好,所以我們建議使用下面的編碼風(fēng)格。
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);現(xiàn)在的代碼就明了多了,通過?var server = http.createServer() 創(chuàng)建了服務(wù)器,并把它保存在變量server中,接下來使用server.on('request', handleReq)綁定request事件。對(duì)request事件的綁定,例1鏈?zhǔn)斤L(fēng)格的編碼并沒能直接體現(xiàn)出來。
http提供了很多其他的事件,下面我們簡(jiǎn)單介紹。
1.connection和close:分別代表建立和關(guān)閉與客戶端的tcp連接。
2.checkContinue:當(dāng)客戶端向服務(wù)器端發(fā)送大量數(shù)據(jù)的時(shí)候,他將檢查是否可以繼續(xù),此時(shí)觸發(fā)事件。當(dāng)觸發(fā)了checkContinue事件時(shí),request事件不再觸發(fā)。
3.upgrade:當(dāng)客戶端請(qǐng)求升級(jí)協(xié)議的時(shí)候觸發(fā),如果該事件沒有相應(yīng)的處理,服務(wù)器將拒絕升級(jí)。
4.clientError:客戶端發(fā)生異常時(shí)觸發(fā)。
?
http客戶端
有時(shí)候你需要使用到向外連接的http請(qǐng)求,例如使用web服務(wù),訪問文本數(shù)據(jù)源或者抓取web站點(diǎn)信息,這時(shí)你可以使用http.ClientRequest創(chuàng)建http請(qǐng)求。先看一個(gè)例子:
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();我們創(chuàng)建了一個(gè)http請(qǐng)求,為響應(yīng)添加了data事件,最后使用req.end()初始化和發(fā)送我們的請(qǐng)求。
創(chuàng)建http GET 請(qǐng)求
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);}); });這個(gè)例子和之前的例子實(shí)現(xiàn)同樣的功能,區(qū)別就在于opts對(duì)象少了method屬性,使用http.get()代替了之前的var req=http.request()和req.end()。由于返回回來的數(shù)據(jù)是2進(jìn)制數(shù)據(jù),我們需要使用response.setEncoding()實(shí)現(xiàn)編碼,所以我們需要對(duì)代碼做點(diǎn)小修改。
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發(fā)送數(shù)據(jù)
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()方法,向服務(wù)器說明我們要發(fā)送的數(shù)據(jù),最后使用req.end()初始化并發(fā)送請(qǐng)求。代碼中的res是ClientResponse對(duì)象,他有兩個(gè)重要的屬性:statusCode(狀態(tài)碼)和header(響應(yīng)頭)。
?
URL
url模塊提供了一些方法,讓我們解析和處理url字符串變得更加簡(jiǎn)單,這些方法包括:parse, format和resolve。我們來看例子,逐行在node REPL中執(zhí)行下面的命令(之前的課程講到了如何使用,node.js入門 - 8.api:events)。
var URL = require('url'); var myUrl = "http://www.nodejs.org/some/url/?with=query¶m=that&are=awesome#alsoahash"; myUrl parsedUrl = URL.parse(myUrl); parsedUrl = URL.parse(myUrl, true);執(zhí)行結(jié)果:
?
? querystring
querystring模塊式用來處理querystring字符串的,他包括如下方法:parse, decode,?escape, unescape, unescapeBuffer, encode和stringify。我們來看一個(gè)例子。
var qs = require('querystring'); qs.parse('a=1&b=2&c=d');執(zhí)行結(jié)果:
? 再來一例,關(guān)于encode方法。
var qs = require('querystring'); var myObj = {'a':1, 'b':5, 'c':'cats', 'func': function(){console.log('dogs')}} qs.encode(myObj);執(zhí)行結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的node.js入门 - 9.api:http的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript向表中添加行--浏览
- 下一篇: 程序员面试题100题第29题——调整数组