http.ClientRequest
类继承自 Stream.Writable
表示已经产生并且正在进行的 HTTP 请求。该类实例由调用 http.request()
或 http.get()
时内部创建返回。
当设置好请求头和请求体后,调用 client.end()
方法完成发送请求。
事件 | 描述 |
---|---|
abort | 请求被客户端中止时触发(仅首次调用时触发) |
connect | 每次服务器使用 CONNECT 方法响应请求时都会触发 |
continue | 服务器发送 100 Continue HTTP 响应时触发 |
information | 服务器发送 1xx 响应时触发(不包括 101 Upgrade ) |
response | 收到此请求的响应时触发(仅首次调用时触发) |
socket | 将套接字分配给此请求后触发 |
timeout | 底层套接字因不活动而超时时触发 |
upgrade | 每次服务器响应升级请求时触发 |
当收到来自服务端的响应时触发,其实跟 http.get(url, callback)
中的回调是一样的。
var http = require('http');var url = 'http://id.qq.com/';var client = http.get(url, function(res){console.log('1. response event');});client.on('response', function(res){console.log('2. response event');});client.end();
当给 Client 分配 Socket 的时候触发,如果熟悉 net
模块对这个事件应该不陌生。
当请求中断时触发,差异在于中断的发起方。
当收到服务端的响应 100 Continue
时触发。熟悉 HTTP 协议的同学应该对 100 Continue
有所了解。当客户端向服务端发送首部 Expect: 100-continue
,服务端经过一定的校验后,决定对客户端的后续请求放行,于是返回返回 100 Continue
,知会客户端,可以继续发送数据。
同样是跟 HTTP 协议密切相关。当客户端向客户端发起请求时,可以在请求首部里声明 'Connection': 'Upgrade'
,以此要求服务端,将当前连接升级到新的协议。如果服务器同意,那么就升级协议继续通信。这里不打算展开太多细节,直接上官方文档的代码。
request.end([data[, encoding]][, callback])
完成发送请求。如果部分请求主体还未发送,则将它们刷新到流中。如果请求被分块,则发送终止符 '0\r\n\r\n'
。
如果指定了 data
,则相当于调用 request.write(data, encoding)
之后再调用 request.end(callback)
。
如果指定了 callback
,则当请求流完成时将调用它。
标记请求是否已经完成。
如果调用了 request.end()
,则 request.finished
属性将为 true
。 如果请求是通过 http.get()
发起的,则会自动调用 request.end()
。
标准示例:模拟 GET 请求
var http = require('http');var options = {protocol: 'http:',hostname: 'www.google.com',port: '80',path: '/',method: 'GET',};var client = http.request(options, function(res) {var data = '';res.setEncoding('utf8');res.on('data', function(chunk) {data += chunk;});res.on('end', function() {console.log(data);});});client.end();
当然,也可以使用便捷方法 http.get(options)
实现。
var http = require('http');http.get('http://www.google.com/', function(res) {var data = '';res.setEncoding('utf8');res.on('data', function(chunk) {data += chunk;});res.on('end', function() {console.log(data);});});
在下面例子中,首先创建了个 HTTP 服务器,负责将客户端发送过来的数据回传。
接着,创建客户端 POST 请求,向服务端发送数据。需要注意的点有:
method
指定为 POST。headers
里声明了 content-type
为 application/x-www-form-urlencoded
。数据发送前,用 querystring.stringify(obj)
对传输的对象进行了格式化。