创建http客户端

有两种方式创建http客户端,http.request(options, callback) 和 http.get(options, callback) 。

http.request(options, callback)

options 可以是一个字符串或者是个json,字符串可以是一个有效网址,json内容就比较多了,看如下配置项。

host 域名或者ip地址,默认localhost

hostname 主机名称,这个设置优先于host

port 端口号,默认80

localAddress 

method 请求方法名,GET/POST。默认是GET。

path 请求路径,默认“/”。

headers 请求头部。

auth 基本的身份验证,“名字:密码”。 下面举两个例子:

// 客户端
var http = require("http");
var req = http.request("http://www.google.com"
,function(res){
    console.log(res.headers)
})
req.end();
// 客户端
var http = require("http");
var req = http.request({host:"www.google.com"}
,function(res){
    console.log(res.headers)
})
req.end();



这里要说明的是,设置options时不会替换整个options,比如设置host只会设置这一个值,其他还保持其默认值。

一旦服务器端有响应了,那么callback会被调用,传入的res值是一个http.IncomingMessage对象,callback其实就是“response”事件监听器,这里的callback是可选参数。

方法会返回http.clientRequest对象。

http.get(options, callback)

这个方法是起到方便作用的,它无非就是设置 options.method = GET, 还会调用一下 req.end。 下面写两段代码,作用都是一样的。

var http = require("http");
var req = http.get("http://www.google.com"
,function(res){
    console.log(res.headers)
})
var http = require("http");
var req = http.request({host:"www.google.com"}
,function(res){
    console.log(res.headers)
})
req.end();

yellow通过http.request方法返回了一个http.ClientRequest对象,ClientRequest对象是stream.Writable子类。下面就对该对象进行详细讲解。god

"response"事件

当服务器有响应时会产生response事件。此事件的监听器会接收到一个响应对象,这个响应对象是一个http.IncomingMessage对象。http.request方法的第二个参数实际上就是这个事件的监听器。

var http = require("http");
var req = http.request({host:"www.google.com"})
req.on("response",function(res){
     ... ...
})
req.end();

"socket" 事件

请求对象建立好后,内部会创建一个net.Socket对象,然后会激发该事件,socket事件的监听器接收的参数就是该socket对象,该事件无论是否调用req.end()都会产生。

req.on("socket",function(socket){ ... })

"connect","upgrade"和"continue" 事件

参看“HTTP服务器”一节的connect,upgrade和continue事件部分,客户端通过connect,upgrade或continue方式访问服务器,如果收到服务器的回应,就会激发对应的事件。

req.on('connect', function(res, socket, head) {
  console.log('got connected!');
}
req.on('upgrade', function(res, socket, head) {
  console.log('got upgraded!');
}
req.on('continue',function(){

})

request.write(chunk, [encoding])

这个方法会发送一大块的数据chunk,chunk可以是Buffer或String类型,可多次调用这个方法,encoding[可选]参数,chunk是字符串时是通过这个参数进行编码后发送出去的,encoding默认是utf8。

request.end([data], [encoding])

这个方法的意思是完成请求的发送。

request.abort()

这个方法表示终止请求。