區(qū)別:1、GET請(qǐng)求傳參通過(guò)URL,而POST請(qǐng)求傳參通過(guò)HTTP上行報(bào)文;2、POST請(qǐng)求的安全性比GET請(qǐng)求高,GET請(qǐng)求的參數(shù)在URL中,是可見(jiàn)的,因此GET請(qǐng)求不安全;3、GET有請(qǐng)求緩存,而POST沒(méi)有;4、GET用于取出數(shù)據(jù),而POST用于提交數(shù)據(jù);5、GET傳輸?shù)臄?shù)據(jù)量有限制,而POST傳輸?shù)臄?shù)據(jù)量沒(méi)有限制;6、GET請(qǐng)求對(duì)數(shù)據(jù)類(lèi)型有限制,而POST請(qǐng)求沒(méi)有限制。
本教程操作環(huán)境:windows7系統(tǒng)、nodejs16版,DELL G3電腦。
node是運(yùn)行在服務(wù)端的javaScript語(yǔ)言,用戶(hù)向服務(wù)器發(fā)送請(qǐng)求就要用到get/post方法。
get和post實(shí)現(xiàn)的功能基本相同,都是客戶(hù)端提交數(shù)據(jù)給服務(wù)器端,只是實(shí)現(xiàn)的機(jī)制不同而已。
GET請(qǐng)求
GET請(qǐng)求是把參數(shù)數(shù)據(jù)隊(duì)列添加到表單的action屬性所指向的url中,值和表單里的name屬性一一對(duì)應(yīng),在url中可以看到。通過(guò)url模塊中的parse()來(lái)處理發(fā)過(guò)來(lái)的req.url。
我們通過(guò)form表單來(lái)發(fā)送get請(qǐng)求:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>get</title> </head> <body> <form action="http://localhost:8080/index" method="get"> 用戶(hù):<label> <input type="text" name="user" value=""> </label><br> 密碼:<label> <input type="password" name="pass" value=""> </label><br> <input type="submit" value="提交"> </form> </body> </html>
對(duì)應(yīng)的node.js代碼如下:
const http=require('http'); const urlLib=require('url'); http.createServer(function (req, res){ //req獲取前臺(tái)請(qǐng)求數(shù)據(jù) //req.url的值是:/index?user=Kity&pass=32412 var obj=urlLib.parse(req.url, true); var url=obj.pathname;//url的值是:"/index" var GET=obj.query; //GET的值是:{user:'Kity',pass:'232312'} console.log(url, GET); res.write('success'); res.end(); }).listen(8080);
運(yùn)行node.js代碼后結(jié)果如下:
liyabin@liyabin-ThinkPad-Edge-E430:~/下載/node$ node server3.js /index { user: 'Kity', pass: '231312' }
POST請(qǐng)求
POST請(qǐng)求的內(nèi)容全部的都在請(qǐng)求體中,所有node.js 默認(rèn)是不會(huì)解析請(qǐng)求體的。通過(guò)querystring模塊中的parse()來(lái)處理post請(qǐng)求。post傳輸?shù)臄?shù)據(jù)量比get大得多,不會(huì)一次傳輸完畢,需分段到達(dá)。
發(fā)送post請(qǐng)求的表單只需把上面的method="get"改成method="post"即可。
const http=require('http'); const querystring=require('querystring'); http.createServer(function (req, res){ //POST——req var str = ''; //接收數(shù)據(jù) //data——有一段數(shù)據(jù)到達(dá)(很多次) req.on('data', function (data){ let i = 0; console.log(`第${i++}次收到數(shù)據(jù)`); str += data; }); //end——數(shù)據(jù)全部到達(dá)(一次) req.on('end', function (){ let POST = querystring.parse(str); console.log(POST); res.write("success"); res.end(); }); }).listen(8080);
運(yùn)行node代碼后的結(jié)果如下:
liyabin@liyabin-ThinkPad-Edge-E430:~/下載/node$ node server.js 第0次收到數(shù)據(jù) { user: 'fdf', pass: '21341412' }
get 和 post 的區(qū)別
GET和POST請(qǐng)求的優(yōu)缺點(diǎn):
(1) get傳輸?shù)臄?shù)據(jù)量非常小,一般在2k左右,但是執(zhí)行效率比post好;
(2)post傳輸?shù)臄?shù)據(jù)量較大,它是等待服務(wù)器來(lái)讀數(shù)據(jù),不過(guò)也有字節(jié)限制,這是為了防止對(duì)服務(wù)器用大量數(shù)據(jù)進(jìn)行攻擊,微軟對(duì)用Request.Form()接收的最大數(shù)據(jù)有限制,IIS4為80kB,IIS5為100kB;
(3)form表單提交一般用post,因?yàn)槿绻胓et提交數(shù)據(jù),用戶(hù)名和密碼會(huì)出現(xiàn)在url上,如果頁(yè)面可以被緩存或者其他用戶(hù)可以訪問(wèn)客戶(hù)端,就可以從歷史記錄里看到用戶(hù)名和密碼,帶來(lái)數(shù)據(jù)的安全性問(wèn)題。