Page 81 - Node.js开发指南
P. 81
4.5 HTTP 服务器与客户端 73
path: '/user?name=byvoid&email=byvoid@byvoid.com', 1
href: '/user?name=byvoid&email=byvoid@byvoid.com' }
通过 url.parse ,原始的 path 被解析为一个对象,其中 query 就是我们所谓的 GET
①
请求的内容,而路径则是 pathname。
4. 获取 POST 请求内容 2
HTTP 协议 1.1 版本提供了8种标准的请求方法,其中最常见的就是 GET 和 POST。相比
GET 请求把所有的内容编码到访问路径中,POST 请求的内容全部都在请求体中。
http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件
3
耗时的工作,譬如上传文件。而很多时候我们可能并不需要理会请求体的内容,恶意的 POST
请求会大大消耗服务器的资源。所以 Node.js 默认是不会解析请求体的,当你需要的时候,
需要手动来做。让我们看看实现方法:
4
//httpserverrequestpost.js
var http = require('http');
var querystring = require('querystring');
var util = require('util');
5
http.createServer(function(req, res) {
var post = '';
req.on('data', function(chunk) {
post += chunk; 6
});
req.on('end', function() {
post = querystring.parse(post);
7
res.end(util.inspect(post));
});
}).listen(3000);
上面代码并没有在请求响应函数中向客户端返回信息,而是定义了一个 post 变量,用
8
于在闭包中暂存请求体的信息。通过 req 的 data 事件监听函数,每当接受到请求体的数据,
就累加到 post 变量中。在 end 事件触发后,通过 querystring.parse 将 post 解析为
真正的 POST 请求格式,然后向客户端返回。
9
不要在真正的生产应用中使用上面这种简单的方法来获取 POST 请
求,因为它有严重的效率问题和安全问题,这只是一个帮助你理解的示例。
—————————— 10
① url 模块的说明参见 http://nodejs.org/api/url.html。