一蝶棋、關于POST請求
post方法作為http請求很重要的一部分,幾乎所有的網(wǎng)站都有用到它忽妒,與get不同玩裙,post請求更像是在服務器上做修改操作,它一般用于數(shù)據(jù)資源的更新段直。
相比于get請求吃溅,post所請求的數(shù)據(jù)會更加安全。上一章中我們發(fā)現(xiàn)get請求會在地址欄顯示輸入的用戶名和密碼(有中文時會轉化為BASE64加密)鸯檬,而post請求則會將數(shù)據(jù)放入http包的包體中决侈,這使得別人無法直接看到用戶名和密碼!
二喧务、Express如何設置POST請求
1.我們的知道赖歌,首先我們得知道在form表單進行post請求,enctype屬性一般設置為“application/x-www-form-urlencoded”功茴,如果設置成multipart/form-data庐冯,則多用于文件上傳,如下:
<form action="#" method="post" enctype="application/x-www-form-urlencoded">
</form>
之后坎穿,我們可以使用npm提供的body-parser或者connect-multiparty來獲取post數(shù)據(jù)展父。我也會把兩種方式都進行演示:
(1)、body-parser
Express中默認都使用body-parser作為請求體解析post數(shù)據(jù)赁酝,這個模塊也能解析:JSON犯祠、Raw、文本酌呆、URL-encoded格式的請求體衡载。
首先在項目目錄安裝body-parser:
cnpm install body-parser --save
在項目app.js中,引用和設置該模塊:
const bodyParser=require("body-parser");
// 解析以 application/json 和 application/x-www-form-urlencoded 提交的數(shù)據(jù)
var jsonParser = bodyParser.json();
var urlencodedParser = bodyParser.urlencoded({ extended: false });
bodyParser.json()很明顯是將json作為消息主題,再且常見的語言和瀏覽器大都支持json規(guī)范隙袁,使得json處理起來不會遇上兼容性問題痰娱。
application/x-www-form-urlencoded:
如果form表單不設置enctype屬性,那么他默認就會是這種菩收。
之后獲取數(shù)據(jù):
app.post("/",urlencodedParser,function(req,res){
? ? res.send(req.body);
? ? });
在中間添加urlencodedParser梨睁,請求是依然使用req.body獲取數(shù)據(jù)。
下面是一個完整的實例:
index.html:
<!DOCTYPE html>
<html>
? ? <head>
? ? ? ? <meta charset="utf-8">
? ? ? ? <title></title>
? ? </head>
? ??<body>
? ? ? ? <form action="http://localhost:8080/" method="post" enctype="application/x-www-form-urlencoded">
? ? ? ? ? ? 用戶:
? ? ? ? ? ? <input type="text" name="user" id="user" placeholder="用戶名"><br>
? ? ? ? ? ? 密碼:
? ? ? ? ? ? <input type="password" name="password" id="password" placeholder="密碼"/><br>
? ? ? ? ? ? <input type="submit" value="提交"/>
? ? ? ? </form>
? ? </body>
</html>
app.js:
const express=require("express");
const bodyParser=require("body-parser");
var app=express();
// 解析application/json數(shù)據(jù)
var jsonParser = bodyParser.json();
// 解析application/x-www-form-urlencoded數(shù)據(jù)
var urlencodedParser = bodyParser.urlencoded({ extended: false });
app.post('/',urlencodedParser,function(req,res){
res.send(req.body);
});
app.listen(8080);
(2)娜饵、connect-multiparty
雖然connect-multiparty多用于文件上傳坡贺,但也可以訪問到post請求的數(shù)據(jù),先安裝
cnpm install connect-multiparty --save
再引入和構建函數(shù):
const multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
同樣我們也采用req.body來獲取參數(shù):
app.post('/',multipartMiddleware,function(req,res){
res.send(req.body);
});
完整的:
const express=require("express");
const multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
var app=express();
app.post('/',multipartMiddleware,function(req,res){
res.send(req.body);
});
app.listen(8080);
相比于body-parser,代碼量似乎更少一些遍坟,但我還是建議使用body-parser拳亿,根據(jù)官方說法,他會在服務器上創(chuàng)建臨時文件愿伴,并且永遠不會去清理它們肺魁,這會相當兩會系統(tǒng)資源,所以不到萬不得已請不要去使用它隔节。
總結
post數(shù)據(jù)在網(wǎng)頁開發(fā)時經(jīng)常使用鹅经,請務必掌握它,只有這樣網(wǎng)頁的交互設計才能夠做到游刃有余怎诫,今天就到這里瘾晃,也希望大家以后多多支持。