http
模块是Node.js中非常重要的一个核心模块。通过http
模块,你可以使用其http.createServer
方法创建一个http
服务器,也可以使用其http.request
方法创建一个http
客户端。Node对HTTP协议及相关API的封装比较底层,其仅能处理流和消息,对于消息的处理,也仅解析成报文头和报文体,但是不解析实际的报文头和报文体内容。这样不仅解决了HTTP原本比较难用的特性,也可以支持更多的HTTP应用。
1. http
模块对HTTP服务端的支持
HTTP是一个用来传送数据的应用层协议,在其底层使用TCP传输协议。HTTP是互联网数据通信的基础,要响应客户端请求(如:浏览器访问),首先要布署HTTP服务器。在Node.js中,可以使用http
模块轻松的创建一个HTTP服务器。
1.1 http.createServer([requestListener])
创建HTTP服务器
实现HTTP服务端功能,要通过http.createServer
方法创建一个服务端对象http.Server
。这个方法接收一个可选传入参数requestListener
,该参数是一个函数,传入后将做为http.Server
的request
事件监听。不传入时,则需要通过在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
,会发射:request
、connection
、close
、checkContinue
、connect
、upgrade
、clientError
事件。其中request
事件监听函数为function (request, response) { }
,该方法有两个参数:request
是一个http.IncomingMessage实例,response
是一个http.ServerResponse实例。
http.Server
对象中还有一些方法,调用server.listen
后http.Server
就可以接收客户端传入连接。
1.3 类:http.ServerResponse
http.ServerResponse
对象用于响应处理客户端请求。 http.ServerResponse
是HTTP服务器(http.Server
)内部创建的对象,作为第二个参数传递给 'request'
事件的监听函数。http.ServerResponse
实现了Writable Stream接口,其对于客户端的响应,本质上是对这个可写流的操作。它还是一个EventEmitter,包含:close
、finish
事件。
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可以修改header
。header
将会随着第一个数据块发送,或在连接关闭时发送。http.ClientRequest
实现了Writable Stream接口,其对于向服务器发送数据,本质上是对这个可写流的操作。它还是一个EventEmitter,包含:response
、socket
、upgrade
、continue
事件。
为了获得服务器响应对象,需要给请求对象添加一个'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.Server
或http.ClientRequest
创建的,并作为第一参数分别传递给http.Server
的'request'
事件和http.ClientRequest
的'response'
事件。它也可以用来访问应答的状态、头文件和数据等。 IncomingMessage
对象实现了Readable Stream接口,对象中还有一些事件,方法和属性。在http.Server
或http.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服务器的响应状态,如:200
、404
等。
message.statusCode
:仅对http.ClientRequest
有效,表示HTTP服务器的响应状态信息,如:OK
、Internal Server Error
等。
message.socket
:与此连接关联的net.Socket
对象