表单中的Get请求解析
先创建一个node.js的服务器,代码如下:
var http = require('http');
http.createServer(function (req, res) {
if (req.method == "GET") {
doGet(req, res);
} else if (req.method == "POST") {
doPost(req, res);
} else {
res.end();
}
}).listen(8000);
console.log('server is running at http://localhost:8000');
function doGet (req,res) {
res.writeHeader(200, {'Content-Type': 'text/html'});
res.write('<!doctype html>');
res.write('<meta charset="utf-8">');
res.write('<title>demo</title>');
res.write('<form method="post">');
res.write('user: <input type="text" name="user">');
res.write('pwd: <input type="password" name="pwd">');
res.write('<input type="submit" value="submit">');
res.write('</form>');
res.end();
}
function doPost (req,res) {
res.end();
}
将其保存为server.js
我们通过判断浏览器request的方法menthod是Get还是Post,进行不同的处理。浏览器(客户端)打开的时候默认是Get方法进行的请求,此时服务器发送一个表单(‘html5中部分标签可省略’)给客户端。
接着我们在浏览器中输入http://localhost:8000
,检测程序是否出错,如果出现如下截图,说明程序运行正常。
接着我们在server.js的最前面引入url模块相关代码如下。var url = require('url');
然后在地址栏输入/?name=zhangshan&pwd=aaa
,在doGet()中添加代码,doGet()修改后的代码为:
function doGet (req, res) {
var u = url.parse(req.url);
console.log(u);
res.writeHeader(200, {'Content-Type': 'text/html'});
res.write('<!doctype html>');
res.write('<meta charset="utf-8">');
res.write('<title>demo</title>');
res.write('<form method="post">');
res.write('user: <input type="text" name="user">');
res.write('pwd: <input type="password" name="pwd">');
res.write('<input type="submit" value="submit">');
res.write('</form>');
res.end();
}
我们在控制台会得到如下输出
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: ‘?name=zhangshan&pwd=aaa’,
query: ‘name=zhangshan&pwd=aaa’,
pathname: ‘/‘,
path: ‘/?name=zhangshan&pwd=aaa’,
href: ‘/?name=zhangshan&pwd=aaa’ }
Url {
protocol: null,
slashes: null,
auth: null,
host: null,
port: null,
hostname: null,
hash: null,
search: null,
query: null,
pathname: ‘/favicon.ico’,
path: ‘/favicon.ico’,
href: ‘/favicon.ico’ }
分析后我们可以发现,这和nodejs官网中关于url模块给出的示例不同,经过一系列的研究才知道官网的代码如果要进行实践应该如此:
var eg = 'http://user:pass@host.com:8080/p/a/t/h?query=string#hash';
console.log(url.parse(eg).href);
console.log(url.parse(eg).protocol);
console.log(url.parse(eg).slashes);
console.log(url.parse(eg).auth);
console.log(url.parse(eg).host);
console.log(url.parse(eg).hostname);
console.log(url.parse(eg).port);
console.log(url.parse(eg).search);
console.log(url.parse(eg).query);
console.log(url.parse(eg).hash);
我们运行上面的代码片段的话会得到如下输出。
是不是与官网相同了?
回到主题。
我们知道url.parse(req.url)
后拥有这些
search: ‘?name=zhangshan&pwd=aaa’,
query: ‘name=zhangshan&pwd=aaa’,
pathname: ‘/‘,
path: ‘/?name=zhangshan&pwd=aaa’,
href: ‘/?name=zhangshan&pwd=aaa’
我们就可以直接调用了。例如我想获取query的值就用u.query
或者直接url.parse(req.url).query
调用;
我们可以看到
现在我想获取name的值,我只需要将url.parse()的第二个值改为true即可代码如下:url.parse(req.url, true).query
可以得到如下结果
得到了jsno数据后我们就可以存入数据库或者使用它了。
表单中的get请求解析的部分就到此结束了,关于post请求的解析我们下节再说。:)
这里是本次的实验的代码
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
if (req.method == "GET") {
doGet(req, res);
} else if (req.method == "POST") {
doPost(req, res);
} else {
res.end();
}
}).listen(8000);
function doGet (req, res) {
var u = url.parse(req.url, true).query;
console.log(u);
res.writeHeader(200, {'Content-Type': 'text/html'});
res.write('<!doctype html>');
res.write('<meta charset="utf-8">');
res.write('<title>demo</title>');
res.write('<form method="post">');
res.write('user: <input type="text" name="user">');
res.write('pwd: <input type="password" name="pwd">');
res.write('<input type="submit" value="submit">');
res.write('</form>');
res.end();
}
function doPost (req, res) {
res.end();
}