在之前的篇章中,我们了解了http模块中的Server类和ServerResponse类。现在我们去了解一下http模块中的ClientRequest类与IncomingMessage类
http.ClientRequest类
http模块提供了 http.request()
和http.get()
两个方法,功能是作为客户端向http服务器发起请求。而ClientRequest类就是http.request()
和http.get()
两个方法方法是被创建的。ClientRequest类包含的事件和属性:
- abort事件:当请求被客户端中止时触发
- continue事件:当服务器发送 100 Continue HTTP 响应时触发,通常是因为请求包含 Expect: 100-continue。 这是客户端应发送请求主体的指令。
- response事件:当收到此请求的响应时触发。 此事件仅触发一次。
- aborted:用于判断请求是否已经中止,如果中止则为true
- request.end([data[, encoding]][, callback]):表明请求已经发送完毕。如果部分请求主体还未发送,则将它们刷新到流中
- request.write(chunk[, encoding][, callback]):发送一个请求主体的数据块。 通过多次调用此方法,可以将请求主体发送到服务器。
- request.setHeader(name, value)、request.removeHeader(name)、request.getHeader(name)、request.flushHeaders()等方法
了解完ClientRequest类,那我们去了解一下http.request。
具体语法格式:http.request(options[, callback])
或http.request(url[, options][, callback])
。如果同时指定了 url 和 options,则对象会被合并,其中 options 属性优先, options 表示的是请求头
const http=require('http');
options= {
host: 'localhost',
port: '3000',
method: 'GET',
path: '/aicanxxx',
headers: {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'en,zh-CN;q=0.8,zh;q=0.6',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Host': 'www.cnblogs.com',
'If-Modified-Since': 'Sat, 24 Jun 2017 04:38:48 GMT',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
};
var req=http.request(options,function (res) {
console.log(res.statusCode);
console.log(JSON.stringify(res.headers));
res.on('data',function (chunk,'utf8') {
console.log(chunk);
});
res.on('end',function () {
console.log('响应已结束');
});
});
req.on('error',function (err) {
console.log(err.message);
});
req.write('');//往请求体写入数据
req.end();//完成请求并发送
http.request()方法给服务器端发送请求,第二个参数是调用http.request()时给response事件添加的一个监听器,当客户端接收到响应信息后调用该监听器, 使用 http.request() 时,必须始终调用 req.end() 来表示请求的结束,即使没有数据被写入请求主体。
客户端发送的请求req是一个可写流的子类http.ClientRequest类的实例,接收到的响应信息res是一个可读流的子类http.IncomingMessage类的实例。
http.IncomingMessage类
http.IncomingMessage类是被动创建的,是由http.Server类或http.ClientRequest类创建的。并分别作为第一个参数传递给request事件和response事件的监听器。它可用于访问响应状态、消息头、以及数据。具体的事件和属性:
- aborted事件:当请求中止时触发。
- close事件:表明底层连接已关闭。
- aborted:如果请求已中止,则属性值为 true。
- headers:请求或响应的消息头对象。
- method:仅对从 http.Server 获取的请求有效。获取请求方式
- statusCode:仅对从 http.ClientRequest 获取的响应有效。获取三位数状态码
- statusMessage:仅对从 http.ClientRequest 获取的响应有效。HTTP 响应状态消息
- url:仅对从 http.Server 获取的请求有效。获取 HTTP 请求中存在的 URL
请求信息和响应信息
在客户端和服务器端中都存在请求信息和响应信息,但客户端中的请求信息req_client和服务器端中的请求信息req_server是不相同的。req_client是由http.ClientRequest类产生的,然后再传递到服务器端的过程中转化为了http.IncomingMessage类,也就是说req_server接收到的是http.IncomingMessage类的实例。
那么同理客户端中的响应信息res_client和服务器端中的请求信息res_server也不相同。res_serve是通过http.ServerResponse类产生,然后再转化为http.IncomingMessage类。