web参数提交方式为get和post
get方法的参数接收
例如我们的login页面中存在一个表单, 用户可以输入email和password
<form action="./login" method="get">
<table>
<tr>
<td>Email</td>
<td><input type="text" name="email"></td>
</tr>
<tr>
<td>password</td>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td><input type="submit" value="login"></td>
</tr>
</table>
</form>
当用户输入email和password提交后, 我们知道get方法会将提交的信息显示在url中, 例如提交的信息为email:Nicolas@email.com, password:123456, 则url就会成为http://localhost/login?email=Nicolas%40email.com&pwd=123456
(当然这不是一个安全的方法)。 由此, 我们可以利用之前学过的url标准模块对此时的url进行解析, 提取出前端提交的信息。
运行url.parse('http://localhost/login?email=Nicolas%40email.com&pwd=123456', true)
的到的结果为
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'localhost',
port: null,
hostname: 'localhost',
hash: null,
search: '?email=Nicolas%40email.com&pwd=123456',
query: { email: 'Nicolas@email.com', pwd: '123456' },
pathname: '/login',
path: '/login?email=Nicolas%40email.com&pwd=123456',
href: 'http://localhost/login?email=Nicolas%40email.com&pwd=123456' }
得到一个对象(命名为rdata), 这样我们可以通过rdata.email (或rdata[‘email’])和rdata.pwd(或rdata[‘pwd’])获取到提交的信息,具体代码如下
//get提交方式
var rdata=url.parse(req.url,true).query;
if (rdata['email'] != undefined){
console.log(rdata['email']);
console.log(rdata['pwd']);
}
post方法的参数接收
还是几乎相同的前端表单, 只是methd改为post。 post为匿名请求方式, 所以请求内容不显示在url上, 所以不可以用get方法提取请求信息。我们要利用request对象中的“data”事件和“end”事件实现我们的目的。 首先在“data”事件回调函数中接收前端的传过来的数据(全部数据), “end”事件在数据已经传完后唤醒, 我们可以在“end”事件回调函数中对得到的数据进行解析。
//post 提交方式
//post 提交方式
var post='';//定义一个post变量, 用于暂存请求信息
req.on('data', function(chunk){ //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
post += chunk;
});
//-------注意异步-------------
req.on('end', function(){ //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
post = querystring.parse(post);
if (post['email'] != undefined){
console.log('email:'+post['email']+'\n');
console.log('pwd:'+post['pwd']+'\n');
}
function recall(data) {
res.write(data.toString())
res.end()
}
optfile.readfile('./views/login.html', recall)
});
});
这里注意, post方法提交属于异步提交(get为同步), “data”,”end”事件均为异步事件, 所以要不最后对提取出信息的处理放到“end”事件回调函数里面, 保证所需信息都准备好之后再进行处理 。