node總結之GET/POST請求的傳送和接收了解下
阿新 • • 發佈:2018-11-02
在我們的現實場景中,我們的node伺服器都需要跟使用者的瀏覽器打交道,也就是說建立一個互動的關係。那麼,這個關係之間的通訊基本上比較熟悉的就是get/post這種方式了。咱們這刺激來簡單看下在node中,是如何接收和處理這些關係的。
由於GET請求直接被嵌入在路徑中,URL是完整的請求路徑,包括了?後面的部分,因此我們可以使用node中 url 模組中的 parse 函式手動解析後面的內容作為GET請求的引數,來看例項:
var http = require('http'); var url = require('url'); var util = require('util'); http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'}); res.end(util.inspect(url.parse(req.url, true))); }).listen(3000);
我們還可以使用 url.parse 方法來解析 URL 中的引數,如下:
var http = require('http'); var url = require('url'); var util = require('util'); http.createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/plain'}); // 解析 url 引數 var params = url.parse(req.url, true).query; res.write("網站名:" + params.name); res.write("\n"); res.write("網站 URL:" + params.url); res.end(); }).listen(3000);
POST 請求的內容全部的都在請求體中,http.ServerRequest 並沒有一個屬性內容為請求體,原因是等待請求體傳輸可能是一件耗時的工作。比如上傳檔案,而很多時候我們可能並不需要理會請求體的內容,惡意的POST請求會大大消耗伺服器的資源,所以 node.js 預設是不會解析請求體的,當我們需要的時候,需要手動來做,來看基本的語法:
var http = require('http'); var querystring = require('querystring'); http.createServer(function(req, res){ // 定義了一個post變數,用於暫存請求體的資訊 var post = ''; // 通過req的data事件監聽函式,每當接受到請求體的資料,就累加到post變數中 req.on('data', function(chunk){ post += chunk; }); // 在end事件觸發後,通過querystring.parse將post解析為真正的POST請求格式,然後向客戶端返回。 req.on('end', function(){ post = querystring.parse(post); res.end(util.inspect(post)); }); }).listen(3000);
來看一個表單通過 POST 提交併輸出資料的例項:
var http = require('http');
var querystring = require('querystring');
var postHTML =
'<html><head><meta charset="utf-8"><title>菜鳥教程 Node.js 例項</title></head>' +
'<body>' +
'<form method="post">' +
'網站名: <input name="name"><br>' +
'網站 URL: <input name="url"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
http.createServer(function (req, res) {
var body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
// 解析引數
body = querystring.parse(body);
// 設定響應頭部資訊及編碼
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
if(body.name && body.url) { // 輸出提交的資料
res.write("網站名:" + body.name);
res.write("<br>");
res.write("網站 URL:" + body.url);
} else { // 輸出表單
res.write(postHTML);
}
res.end();
});
}).listen(3000);
好啦,本次記錄就到這裡了。
如果感覺不錯的話,請多多點贊支援哦。。。