详解Node.js的http模块之http模块概述

 2015年08月24日    2536     声明


http模块是Node.js中非常重要的一个核心模块。通过http模块,你可以使用其http.createServer方法创建一个http服务器,也可以使用其http.request方法创建一个http客户端。Node对HTTP协议及相关API的封装比较底层,其仅能处理流和消息,对于消息的处理,也仅解析成报文头和报文体,但是不解析实际的报文头和报文体内容。这样不仅解决了HTTP原本比较难用的特性,也可以支持更多的HTTP应用。


  1. http模块对HTTP服务端的支持
  2. http模块对HTTP客户端的支持
  3. http.IncomingMessage对象


1. http模块对HTTP服务端的支持

HTTP是一个用来传送数据的应用层协议,在其底层使用TCP传输协议。HTTP是互联网数据通信的基础,要响应客户端请求(如:浏览器访问),首先要布署HTTP服务器。在Node.js中,可以使用http模块轻松的创建一个HTTP服务器。

1.1 http.createServer([requestListener])创建HTTP服务器

实现HTTP服务端功能,要通过http.createServer方法创建一个服务端对象http.Server。这个方法接收一个可选传入参数requestListener,该参数是一个函数,传入后将做为http.Serverrequest事件监听。不传入时,则需要通过在http.Server对象的request事件中单独添加。

下面是两种创建http.Server对象及添加request事件监听器的示例:

var http = require('http');

// 创建server对象,并添加request事件监听器
var server = http.createServer(function(req, res) {
    res.writeHeader(200,{'Content-Type':'text/plain'});
    res.end('itbilu.com');
});
 
// 创建server对象,通过server对象的request事件添加事件事件监听器
var server = new http.Server();
server.on('request', function(req, res){
    res.writeHeader(200,{'Content-Type':'text/plain'});
    res.end('itbilu.com');
});


1.2 类:http.Server

http.Server对象是一个事件发射器EventEmitter,会发射:requestconnectionclosecheckContinueconnectupgradeclientError事件。其中request事件监听函数为function (request, response) { },该方法有两个参数:request是一个http.IncomingMessage实例,response是一个http.ServerResponse实例。

http.Server对象中还有一些方法,调用server.listenhttp.Server就可以接收客户端传入连接。


1.3 类:http.ServerResponse

http.ServerResponse对象用于响应处理客户端请求。 http.ServerResponse是HTTP服务器(http.Server)内部创建的对象,作为第二个参数传递给 'request'事件的监听函数。http.ServerResponse实现了Writable Stream接口,其对于客户端的响应,本质上是对这个可写流的操作。它还是一个EventEmitter,包含:closefinish事件。


2. http模块对HTTP客户端的支持

http模块不仅做为HTTP服务器使用,也适合使用这些服务。 http模块提供了创建HTTP客户端对象的方法,使用客户端对象可以创建对HTTP服务的访问。

2.1 http.request(options[, callback]):创建HTTP请求

http.request()方法用于创建HTTP请求,该方法会返回一个http.ClientRequest对象, 是http.createClient()方法的替代方法。在其options参数中,options.agent选项用于控制HTTP请求的Agent的行为,其默认为http.globalAgent,也可以自定义一个http.Agent对象。

http.request()会返回一个http.ClientRequest类的实例,ClientRequest实例是一个可写流对象。当使用POST请求给服务器发送数据时,就要将其写入到ClientRequest对象。

http.get(options[, callback])http.request()方法的快捷方法,这个方法自动设置HTTP的请求方式为GET,请求完成自动调用req.end()方法。

示例,创建一个HTTP客户端,GET请求itbilu.com网站的根目录:

var http = require('http');

var options = {
    host: 'itbilu.com',
    method: 'GET',
    path: '/'
}
var req = http.request(options);
req.on('response', function(res){
    res.setEncoding('utf8');
    res.on('data', function(chunk){
        console.log('收到数据:%s', chunk);
    });
});
req.end();


2.2 类:http.ClientRequest

http.ClientRequest对象由http.request()创建并返回。它是一个正在处理的HTTP请求,其头部已经在队列中。使用setHeader(name, value), getHeader(name), removeHeader(name)等API可以修改headerheader将会随着第一个数据块发送,或在连接关闭时发送。http.ClientRequest实现了Writable Stream接口,其对于向服务器发送数据,本质上是对这个可写流的操作。它还是一个EventEmitter,包含:responsesocketupgradecontinue事件。

为了获得服务器响应对象,需要给请求对象添加一个'response'监听器。当接收到响应头时,请求对象将会触发'response'事件。'response'事件执行时有一个参数,该参数为http.IncomingMessage的一个实例。


2.3 类:http.Agent

http.Agent是会把套接字做成资源池,用于HTTP客户端请求,当需要自定义一些自定义的代理参数(如:主机的套接字并发数、套接字发送TCP KeepAlive包的频率等),可以设置此对象。该对象由构选函数new Agent([options])创建返回。


2.4 类:http.globalAgent

Agent的全局实例,是HTTP客户端的默认请求代理对象。其结构类似如下:

{ domain: null,
    _events: { free: [Function] },
    _maxListeners: undefined,
    defaultPort: 80,
    protocol: 'http:',
    options: { path: null },
    requests: {},
    sockets: {},
    freeSockets: {},
    keepAliveMsecs: 1000,
    keepAlive: false,
    maxSockets: Infinity,
    maxFreeSockets: 256 }


3. 类:http.IncomingMessage对象

IncomingMessage对象是由http.Serverhttp.ClientRequest创建的,并作为第一参数分别传递给http.Server'request'事件和http.ClientRequest'response'事件。它也可以用来访问应答的状态、头文件和数据等。 IncomingMessage对象实现了Readable Stream接口,对象中还有一些事件,方法和属性。在http.Serverhttp.ClientRequest中略有不同。

3.1 事件:'close'

'close'事件表示在response.end()被调用或强制刷新之前,底层的连接已经被终止了。


3.2 message.setTimeout(msecs, callback)

设置连接超时,参数msecs为超时时间(秒)。该方法本质是调用message.connection.setTimeout(msecs, callback)方法。


3.3 http.IncomingMessage对象中的属性

message.httpVersion:在http.Server中表示客户端向服务器发出请求时,客户端发送的HTTP版本;在http.ClientRequest中表示服务器向客户端返回应答时,服务器的HTTP版本。通常是 '1.1''1.0'

message.headers:请求/响应头对象。只读的文件头信息的键值对的集合,全小写。类似如下:

{host: '127.0.0.1:80',
  'content-type': 'text/html; charset=utf-8',
  'content-length': '18044'
}

message.rawHeaders:原始请求/响应头对象。数据类型是一个数组,偶数偏移量为键,奇数偏移量为对应的值。头名称没有转换为小写,也没有合并重复的头。类似如下:

[ 'Host',
  '127.0.0.1:80',
  'Content-Type',
  'text/html; charset=utf-8',
  'Content-Length',
  '18044']

message.trailers:请求/响应 的尾部对象。只在'end'事件中存在。

message.trailers:请求/响应 的尾部对象的原始值。只在'end'事件中存在。

message.method:仅对http.Server有效,表示客户端的HTTP请求方式,如:'GET', 'DELETE'

message.url:仅对http.Server有效,表示客户端请求的URL字符串。它仅包含实际HTTP请求中所提供的URL。例如:

GET /status?name=itbilu.com HTTP/1.1\r\n
Accept: text/plain\r\n
\r\n

request.url为:

/status?name=itbilu.com

message.statusCode:仅对http.ClientRequest有效,表示HTTP服务器的响应状态,如:200404等。

message.statusCode:仅对http.ClientRequest有效,表示HTTP服务器的响应状态信息,如:OKInternal Server Error等。

message.socket:与此连接关联的net.Socket对象