首页 > 代码库 > node.js模块之http模块
node.js模块之http模块
如果你想向远程服务器发起HTTP 连接,Node 也是很好的选择。Node 在许多情景下都很适合使用,如使用Web service,连接到文档数据库,或是抓取网页。你可以使用同样的http 模块来发起HTTP 请求,但应该使用http.ClientRequest 类。该类有两个工厂方法:一个通用的方法和一个便捷的方法。
var http = require(‘http‘);
var opts = {
host: ‘www.google.com‘
port: 80,
path: ‘/‘,
method: ‘GET‘
};
var req = http.request(opts, function(res) {
console.log(res);
res.on(‘data‘, function(data) {
console.log(data);
});
});
req.end();
(method)是可选项,如果没有指定,默认会设置为GET。最后需要注意的一点是,需要结束(end())该请求。因为这是一个GET 请求,所以我们并不会往服务器发送任何数据。但对于其他的HTTP 方法,比如PUT 或POST,你可能需要发送数据。request 会等待end() 方法调用后,才初始化HTTP请求,因为在那之前,它不确定我们是否还会发送数据。
GET 是很常见的HTTP 使用方式,因此提供了一个专门的工厂方法来更方便地使用
它,如例4-10 所示。
var http = require(‘http‘);
var opts = {
host: ‘www.google.com‘
port: 80,
path: ‘/‘,
};
var req = http.get(opts, function(res) {
console.log(res);
res.on(‘data‘, function(data) {
console.log(data);
});
});
这个例子的http.get() 和之前的例子做了一样的事情,但更加明确。我们把method属性从配置对象中去掉了,还把request.end() 也移除了,因为这些都已经隐含说明了。如果运行了这两个例子,你得到的结果将是Buffer 对象的裸数据。本章后续会介绍到,Buffer 是Node 特殊定义的类,用来支持任意二进制数据的存储。虽然你也可以直接使用这些内容,但通常要指定编码方式,如UTF-8(一种Unicode 字符的编码格式),这可以通过response.setEncoding() 方法来指定.
> var http = require(‘http‘);
> var req = http.get({host:‘www.google.com‘, port:80, path:‘/‘},
function(res) {
... console.log(res);
... res.on(‘data‘, function(c) { console.log(c); });
... });
> <Buffer 3c 21 64 6f 63 74 79 70
...
65 2e 73 74>
<Buffer 61 72 74 54 69
...
69 70 74 3e>
>
> var req = http.get({host:‘www.google.com‘, port:80, path:‘/‘},
function(res) {
... res.setEncoding(‘utf8‘);
... res.on(‘data‘, function(c) { console.log(c); });
... });
> <!doctype html><html><head><meta http-equiv="content-type
...
load.t.prt=(f=(new Date).getTime());
})();
</script>
发送HTTP POST 和PUT 数据
不是所有的HTTP 请求都是用GET 方法的,你还需要调用POST、PUT 和其他HTTP
方法,它们会改变对方的数据。这和发送GET 请求的功能一样,只不过你还需要往
上发送一些数据(例4-12)。
var options = {
host: ‘www.example.com‘,
port: 80,
path: ‘/submit‘,
method: ‘POST‘
};
var req = http.request(options, function(res) {
res.setEncoding(‘utf8‘);
res.on(‘data‘, function (chunk) {
console.log(‘BODY: ‘ + chunk);
});
});
req.write("my data");
req.write("more of my data");
req.end();
这个例子和例4-10 很相似, 但增加了http.ClientRequest.write() 方法。可以用这个方法发送上行数据流。之前解释过, 它要求你显式地调用http.ClientRequest.end() 方法来表示数据发送完毕。每当调用ClientRequest.write() 时,数据会马上上传(不会被缓存),但服务器在ClientRequest.end()调用之前是不会响应你的数据请求的。你可以把一个流(Stream)的data 事件和ClientRequest.write() 绑定在一起,这样就能把数据以流的形式发送给服务器了。比如当需要把硬盘上的一个文件通过HTTP 发送给远程服务器时,这会是个好主意。
node.js模块之http模块