nodejs http模組的方法有:1、createServer(),可創造伺服器範例;2、listen(),啟動伺服器監聽指定埠;3、setHeader();4、write();5、end();6、get();7、request()等。
本教學操作環境:windows7系統、nodejs 12.19.0版,DELL G3電腦。
1 基本用法
1.1 模組屬性
1.1.1 HTTP請求的屬性
headers
:HTTP請求的頭資訊。
url
:請求的路徑。
1.2 模組方法
1.2.1 http模組的方法
createServer(callback)
:創造伺服器範例。
1.2.2 伺服器範例的方法
listen(port)
:啟動伺服器監聽指定埠。
1.2.3 HTTP迴應的方法
setHeader(key, value)
:指定HTTP頭資訊。
write(str)
:指定HTTP迴應的內容。
end()
:傳送HTTP迴應。
1.3 處理GET請求
Http模組
主要用於搭建HTTP服務
。使用Node.js搭建HTTP伺服器非常簡單。
var http = require('http'); http.createServer(function (request, response){ response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(8080, "127.0.0.1"); console.log('Server running on port 8080.');
var http = require("http")
,表示載入http模組createServer方法
,創造一個伺服器範例,將它賦給變數http。ceateServer方法
接受一個函數作為引數,該函數的request引數
是一個物件,表示使用者端的HTTP請求response.writeHead方法
表示,伺服器端迴應一個HTTP頭資訊;response.end
方法表示,伺服器端迴應的具體內容,以及迴應完成後關閉本次對話
listen(8080)
表示啟動伺服器範例,監聽本機的8080埠
$ node app.js
這時命令列視窗將顯示一行提示「Server running at port 8080.」
。開啟瀏覽器,存取http://localhost:8080
,網頁顯示「Hello world!」
。
上面的例子是當場生成網頁,也可以事前寫好網頁,存在檔案中,然後利用fs模組讀取網頁檔案,將其返回。
var http = require('http'); var fs = require('fs'); http.createServer(function (request, response){ fs.readFile('data.txt', function readData(err, data) { response.writeHead(200, {'Content-Type': 'text/plain'}); response.end(data); }); }).listen(8080, "127.0.0.1"); console.log('Server running on port 8080.');
下面的修改則是根據不同網址的請求,顯示不同的內容,已經相當於做出一個網站的雛形了。
var http = require("http"); http.createServer(function(req, res) { // 主頁 if (req.url == "/") { res.writeHead(200, { "Content-Type": "text/html" }); res.end("Welcome to the homepage!"); } // About頁面 else if (req.url == "/about") { res.writeHead(200, { "Content-Type": "text/html" }); res.end("Welcome to the about page!"); } // 404錯誤 else { res.writeHead(404, { "Content-Type": "text/plain" }); res.end("404 error! File not found."); } }).listen(8080, "localhost");
回撥函數的req(request)物件,擁有以下屬性。
url
:發出請求的網址method
:HTTP請求的方法headers
:HTTP請求的所有HTTP頭資訊。1.4 處理POST請求
當用戶端採用POST
方法傳送資料時,伺服器端可以對data
和end
兩個事件,設立監聽函數。
var http = require('http'); http.createServer(function (req, res) { var content = ""; req.on('data', function (chunk) { content += chunk; }); req.on('end', function () { res.writeHead(200, {"Content-Type": "text/plain"}); res.write("You've sent: " + content); res.end(); }); }).listen(8080);
data
事件會在資料接收過程中,每收到一段資料就觸發一次,接收到的資料被傳入回撥函數。end
事件則是在所有資料接收完成後觸發。
對上面程式碼稍加修改,就可以做出檔案上傳的功能。
"use strict"; var http = require('http'); var fs = require('fs'); var destinationFile, fileSize, uploadedBytes; http.createServer(function (request, response) { response.writeHead(200); destinationFile = fs.createWriteStream("destination.md"); request.pipe(destinationFile); fileSize = request.headers['content-length']; uploadedBytes = 0; request.on('data', function (d) { uploadedBytes += d.length; var p = (uploadedBytes / fileSize) * 100; response.write("Uploading " + parseInt(p, 0) + " %\n"); }); request.on('end', function () { response.end("File Upload Complete"); }); }).listen(3030, function () { console.log("server started"); });
2 發出請求
2.1 get()
get方法
用於發出get請求。
function getTestPersonaLoginCredentials(callback) { return http.get({ host: 'personatestuser.org', path: '/email' }, function(response) { var body = ''; response.on('data', function(d) { body += d; }); response.on('end', function() { var parsed = JSON.parse(body); callback({ email: parsed.email, password: parsed.pass }); }); }); },
2.2 request()
request方法
用於發出HTTP請求
,它的使用格式如下。
http.request(options[, callback])
request方法的options引數,可以是一個物件,也可以是一個字串。如果是字串,就表示這是一個URL,Node內部就會自動呼叫url.parse()
,處理這個引數。options物件
可以設定如下屬性
host
:HTTP請求所發往的域名或者IP地址,預設是localhosthostname
:該屬性會被url.parse()解析,優先順序高於host。port
:遠端伺服器的埠,預設是80。localAddress
:本地網路介面。socketPath
:Unix網路通訊端,格式為host:port或者socketPath。method
:指定HTTP請求的方法,格式為字串,預設為GET。path
:指定HTTP請求的路徑,預設為根路徑(/)。可以在這個屬性裡面,指定查詢字串,比如/index.html?page=12。如果這個屬性裡面包含非法字元(比如空格),就會丟擲一個錯誤。headers
:一個物件,包含了HTTP請求的頭資訊。auth
:一個代表HTTP基本認證的字串user:password。agent
:控制快取行為,如果HTTP請求使用了agent,則HTTP請求預設為Connection: keep-alive,它的可能值如下:undefined
(預設):對當前host和port,使用全域性Agent。Agent
:一個物件,會傳入agent屬性。false
:不快取連線,預設HTTP請求為Connection: close。keepAlive
:一個布林值,表示是否保留socket供未來其他請求使用,預設等於false。keepAliveMsecs
:一個整數,當使用KeepAlive的時候,設定多久傳送一個TCP KeepAlive包,使得連線不要被關閉。預設等於1000,只有keepAlive設為true的時候,該設定才有意義。request
方法的callback引數
是可選的,在response事件發生時觸發,而且只觸發一次。http.request()
返回一個http.ClientRequest類
的範例。它是一個可寫資料流,如果你想通過POST方法傳送一個檔案,可以將檔案寫入這個ClientRequest物件
。var postData = querystring.stringify({ 'msg' : 'Hello World!' }); var options = { hostname: 'www.google.com', port: 80, path: '/upload', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'Content-Length': postData.length } }; var req = http.request(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function (chunk) { console.log('BODY: ' + chunk); }); }); req.on('error', function(e) { console.log('problem with request: ' + e.message); }); // write data to request body req.write(postData); req.end();
注意
,上面程式碼中,req.end()
必須被呼叫,即使沒有在請求體內寫入任何資料,也必須呼叫。因為這表示已經完成HTTP請求
。
傳送過程的任何錯誤(DNS錯誤、TCP錯誤、HTTP解析錯誤
),都會在request物件上觸發error事件
。
3 搭建HTTPs伺服器
搭建HTTPs
伺服器需要有SSL
證書。對於向公眾提供服務的網站,SSL證書
需要向證書頒發機構購買;對於自用的網站,可以自制。
自制SSL證書需要OpenSSL,具體命令如下。
openssl genrsa -out key.pem openssl req -new -key key.pem -out csr.pem openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem rm csr.pem
上面的命令生成兩個檔案:ert.pem(證書檔案)
和 key.pem(私鑰檔案)
。有了這兩個檔案,就可以執行HTTPs伺服器了。Node.js
提供一個https
模組,專門用於處理加密存取。
var https = require('https'); var fs = require('fs'); var options = { key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem') }; var a = https.createServer(options, function (req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000);
上面程式碼顯示,HTTPs伺服器與HTTP伺服器的最大區別,就是createServer
方法多了一個options引數
。執行以後,就可以測試是否能夠正常存取。
curl -k https://localhost:8000
更多node相關知識,請存取:!
以上就是nodejs http模組的方法有哪些的詳細內容,更多請關注TW511.COM其它相關文章!