Node.js核心模块http客户端

来源:互联网 发布:java怎样输出数组 编辑:程序博客网 时间:2024/05/21 22:59

HTTP客户端

http模块提供了两个函数http.request和http.get,功能是作为客户端想HTTP服务器发送请求。

  • http.request(options,callback)发起HTTP请求。接受两个参数,option是一个类似关联数组的对象,表示请求的参数,callback是请求的回调函数。option常用的参数如下所示。
名称 含义 host 请求网站的域名或IP地址 port 请求的网站的端口,默认80 method 请求方法,默认是GET path 请求的相对于根的路径,默认是“/”。QueryString应该包含在其中。例如/search?query=byvoid headers 一个关联数组对象,为请求头的内容

callback传递一个参数,为http.ClientResponse的实例。
http.request返回一个http.ClientRequest的实例。
下面是通过http.request发送POST请求的代码

//httprequest.jsvar http = require('http');var querystring = require('querystring');var contents = querystring.stringify({  name: 'byvoid',  email: 'byvoid@byvoid.com',  address: 'Zijing 2#, Tsinghua University',});var options = {  host: 'www.byvoid.com',  path: '/application/node/post.php',  method: 'POST',  headers: {    'Content-Type': 'application/x-www-form-urleccoded',    'Content-Length': contents.length  }};var req = http.request(options, function(res){  res.setEncoding('utf-8');  res.on('data', function(data){    console.log(data);  });});req.write(contents);req.end();
  • http.get(options,callback)http模块还提供了一个更加简便的方法用于处理GET请求:http.get。它是http.request的简化版,唯一的区别在http.get自动将请求方法设为了GET请求,同时不需要手动调用req.end()。
//httpget.jsvar http = require('http');http.get({host: 'www.byvoid.com'}, function(res){  res.setEncoding('utf-8');  res.on('data', function(data){    console.log(data);  });});

1.http.clientRequest
http.ClientRequest是由http.request或http.get返回产生的对象,表示一个已经产生而且正在进行中的HTTP请求。它提供了一个response事件,即http.request或http.get第二个参数指定的回调函数的绑定对象。我们也可以显示地绑定这个事件的监听函数:

//httpresponse.jsvar http = require('http');var req = http.get({host: 'www.byvoid.com'});req.on('response', function(res){  res.setEncoding('utf-8');  res.on('data', function(data){    console.log(data);  });});

http.ClientRequest像http.ServerResponse一样也提供了write和end函数,用于向服务器发送请求体,通常用于POST、PUT等操作。所有写结束以后必须调用end函数以通知服务器,否则请求无效。http.ClientRequest还提供了以下函数。

  • request.abort():终止正在发送的请求。
  • request.setTimeout(timeout, [callback]):设置请求超时时间,timeout为毫秒数。当请求超时以后,callback将会被调用。
    此外,还有其他函数,具体内容参见Node.js文档。

2.http.ClientResponse
http.ClientResponse与http.ServerRequest相似,提供了三个时间data、end、和close,分别在数据到达、传输结束和连接结束时出发,其中data时间传递一个参数chunk,表示接收到的数据。
http.ClientResponse也提供了一些属性,用于表示请求的结果状态,如下表。

名称 含义 statusCode HTTP状态码,如200,404,500 httpVersion HTTP协议版本,通常是1.0或1.1 headers HTTP请求 trailers HTTP请求尾(不常见)

http.ClientResponse还提供了一下几个特殊的函数。

  • response.setEncoding([encoding]):设置默认的编码,当data事件被触发时,数据将以encoding编码。默认值是null,即不编码,以Buffe的形式存储。常用编码为utf-8.
  • response.pause():暂停接受数据和发送事件,方便实现下载功能。
  • response.resume():从暂停的状态中恢复。

总结
当学习完Node.js的服务器端和客户端后,发现node.js的服务器端-客户端模式和以前学习的java框架有些类似,也有些不同。不同之处在于,node.js明确地将客户端和服务器端分别换分出request、response两个对象,即客户端包含了http.ClientRequest,http.ClientResponse对象;服务器端包含了http.ServerRequest,http.ServerResponse对象。而以前学习时request对象就表示了客户端,response就表示了服务器端。
服务器端产生ServerRequest和ServerResponse对象的方法时,出发Server对象的request事件,在回调函数中第一个参数表示ServerRequest对象,第二个参数表示ServerResponse对象。客户端产生ClientRequest对象的方法时通过调用http.request或http.get方法。ClientResponse对象是在其回调函数中唯一的参数。
似乎ClientRequest和ServerReponse,ServerRequest和ClientResponse这两对,每对的两个对象有着相似之处。这是因为他们通过向另一方发送数据和接受数据。据此,我还画了个图,表明他们各自的位置和作用。这里写图片描述

原创粉丝点击