上一节-node.js学习(4)— form提交数据(get)
上节我们讲解了form使用get传输数据的方式,这节我们讲post请求。
相比get请求,post请求有以下几个优点:
- get所发送的数据是 URL 的一部分,对所有人可见,post不会显示在url上,安全性好。
- get数据长度最大为2048个字符。post无限制。
- get发送的数据类型只允许 ASCII 字符。post无限制。
了解了其优点后,我们来进行post讲解。
1.post的分段传输
前面我们讲过,post由于可传输数据长度很大,所以当需要发送的数据过长时候,post会采用分段传输,这样可以避免发送一半出错,从而需要再次从头发送。我们通过下面例子证明下post的分段传输特性。
我们在form.html增加下面代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form action="http://localhost:1000/a" method="post">
账号:<input type="text" name="account"/>
密码:<input type="text" name="pass"/>
备注:<textarea name="note" id="" cols="30" rows="10"></textarea>
<input type="submit" value="提交">
</form>
</body>
</html>
form-post.js增加下面代码:
const http = require('http');
const fs=require('fs');
http.createServer(function (req, res) {
//假设账号密码备注都输入为1
let str='',i=0; //str——用于保存提交的数据,初始化为空, i——传送次数,用于计算传输的次数,初始化为0
req.on('data',function(data){
//每执行一次,对data进行拼接,i进行+1
str+=data;
console.log(`第二步${++i}`,data,data.toString());
//1,<Buffer 61 63 63 6f 75 6e 74 3d 31 26 70 61 73 73 3d 31 26 6e 6f 74 65 3d 31>,account=1&pass=1¬e=1
})
req.on('end',function(){
const postData=querystring.parse(str);
console.log('第三步end:',postData); //第三步end: { account: '1', pass: '1', note: '1' }
})
console.log('第一步');
const path = `./www${req.url}`;
fs.readFile(path, function (err, data) {
console.log('第四步');
if (err) {
res.write('404')
} else {
res.write(data)
}
res.end()
})
}).listen(1000)
- req.on('data',fn)表示,数据传输过程中执行的函数。如果数据传输量很大,会执行很多次,数据量很小,只会执行一次。
- req.on('end',fn)表示,数据全部到达执行的函数,只会执行一次。
- 上面标注第几步表示代码的执行顺序。这里最好用火狐测试,因为谷歌/favicon.ico也会执行上面步骤,影响测试。
- 因为传输数据很长的时候才会出现分段,所以我们可以在备注里面输入很多字符测试下,会发现第二步执行很多遍。这里假设三个框都输入为1为分段传输(实际这么短是不可能分段,只会执传输一次),可能第一次为account=1&pass=1&n,第二次为ote=1。
- 我们在后台可以在end事件里面获取全部接收完的数据。然后通过前面所讲的querystring将查询字符串转化为json对象。
2.post不会在url后拼接字符串
这个很简单,直接放图。