標籤:delete 好的 ade 實現 http服務 程式 cti 擷取 function
Node內建了http模組提供HTTP伺服器和用戶端介面
var http = require("http");
建立HTTP伺服器只需要簡單的調用http.createServer()函數,參數是回呼函數,接收兩個參數: request, response對象。
var server = http.createServer(function(req, res){});
在觸發回呼函數之前Node就已經對HTTP要求標頭進行瞭解析,但是並沒有對請求體進行解析。另外需要有開發人員自行調用response.end()方法來結束響應。
HTTP伺服器需要綁定一個連接埠號碼,用來監聽接入的請求。使用http.server類的listen方法
一個最簡單的HTTP伺服器代碼:
var http = require("http");var server = http.createServer(function(req, res){ res.write("hello world"); res.end();}server.listen(8080);
接下來讓我們看看如何擷取要求標頭資訊和如何設定回應標頭資訊
1. 擷取要求標頭資訊
req.headers
req.rawHeaders
通過這兩個屬性擷取要求標頭資訊。這兩者的區別在於,headers擷取的是索引值對格式的對象,並且重複要求標頭資訊會被捨棄。而rawHeaders擷取的是列表,奇數為要求標頭名稱,偶數為要求標頭資訊,同時重複的要求標頭資訊也會放在列表中。
2. 設定回應標頭資訊
response對象提供了setHeader(field, value), getHeader(field, value), removeHeader(field) 方法
設定回應標頭一定要在發送訊息體之前,常用的回應標頭包括
Content-Type: "text/plain", "text/html"
Content-Length 設定響應訊息體的位元組長度 可以使用Buffer.byteLength方法擷取字串資料的實際位元組長度
3. 設定響應狀態代碼
response.statusCode
NodeJS中的http模組提供了http.STATUS_CODES屬性用來描述標準HTTP協議規定的狀態代碼及標題文字說明
設定response.statusCode = 302 表示 重新導向
構建RESTful WEB服務
建立標準的REST伺服器需要實現四個HTTP操作: POST GET DELETE PUT 分別對應人們常說的CURD操作
另外人們也常用curl命令列方式來進行web操作
當有請求發送資料時,HTTP解析器會將資料做成data事件的形式,將解析好的資料放入chunk中。也就是監聽request請求的data事件和end事件
var http = require("http");var server = http.createServer(function(req, res){ req.setEncoding("utf-8"); req.on("data", function(chunk){ console.log("parsed", chunk); }); req.on("end", function(){ console.log("done parsing"); res.end(); });});
使用req.method屬性來判斷請求方式
解析URL路徑資訊還需要用到核心模組url
通過理解req.method,url,和request請求對象的資料解析原理對於以後使用封裝好的進階架構是有好處的。
比如在Express中,就提供了.all() .get() .post() .put() .delete()等方法
構建靜態檔案伺服器
Stream.pipe()方法可以理解為將源頭的資料(ReadableStream)通過管道pipe流動到目的地(WritableStream)
所有ReadableStream都能接入到任何的WriteableStream中,比如request就是一個ReadableStream, response就是一個WritableStream
var http = require("http");var parse = require("url").parse;var join = require("path").join;var fs = require("fs");var root = __dirname;var server = http.createServer(function(req, res){ var pathname = parse(req.url).pathname; var path = join(root, pathname); fs.stat(path, function(err, stat){ if(err){ if(err.code === "ENOENT"){ res.statusCode = 404; res.end("Not Found"); }else{ res.statusCode = 500; res.end("Internal Server Error"); } }else{ //沒有錯誤,準備讀取檔案內容並返回 res.setHeader("Content-Length", stat.size); var stream = fs.createReadStream(path); stream.pipe(res); stream.on("error", function(err){ res.statusCode = 500; res.end("Internal Server Error"); }); } });});server.listen(8080);
[NodeJS]Node開發Web程式入門