标签:
通过require("http")来使用HTTP的客户端和服务端。
Node.js中的HTTP接口用于提供对传统协议中难以使用的特性的支持。 尤其是那些庞大或者是块编码的信息。该接口不会缓冲整个请求或者响应——用户可以自己使用流来处理数据。
HTTP头信息会被以如下的对象格式来表示:
{ ‘content-length‘: ‘123‘, ‘content-type‘: ‘text/plain‘, ‘connection‘: ‘keep-alive‘, ‘host‘: ‘mysite.com‘, ‘accept‘: ‘*/*‘ }
键都是小写的。值没有被修改。
为了尽可能的支持HTTP应用的全部范围,Node.js的API是很低级的。 它只会处理流和信息的解析。它只是将一个信息解析成HTTP头或者HTTP体但是不会去解析实际的HTTP头或HTTP体。
想了解如何处理重复的http头的细节请参考message.headers。
原生的http头被保留在rawHeaders
属性中,并以[key, value, key2, value2, ...]的数组形式呈现。比如, 之前的信息头对象就含有一个如下形式的rawHeaders列表:
[ ‘ConTent-Length‘, ‘123456‘, ‘content-LENGTH‘, ‘123‘, ‘content-type‘, ‘text/plain‘, ‘CONNECTION‘, ‘keep-alive‘, ‘Host‘, ‘mysite.com‘, ‘accepT‘, ‘*/*‘ ]
HTTP代理用于作为一个HTTP客户端请求的socket池。
HTTP代理默认对客户端请求使用keep-alive连接。如果一个空闲的socket没有待定处理的http请求,那么这个socket会被关闭。这意味着当服务器处于低负荷状态时开发者不需要去关闭每一个使用KeepAlive的连接,这是一个好消息。
如果你选择使用KeepAlive,你可以将设置一个标识设置为true来创建一个代理对象(详细信息参考constructor options)。然后,代理对象会在池中保存空闲的socket用于以后来使用。他们会被打上明确的标记所以Node.js的进程不会一直处于运行状态。无论如何,当不需要再使用KeepAlive代理时用destroy()来取消它不失为一个好主意,那样所有的sockets也会被关闭。
socket会被从代理池中移除当socket发生一个‘close‘事件或者一个特殊的‘agentRemove‘事件。这意味着如果你试图去维持一个HTTP请求一段时间而又不愿意将其放入池中,你可以像下面这样来处理:
http.get(options, function(res) { // Do stuff }).on("socket", function (socket) { socket.emit("agentRemove"); });
又或者,你可以选择使用agent:false来完全脱离池:
http.get({ hostname: ‘localhost‘, port: 80, path: ‘/‘, agent: false // create a new agent just for this one request }, function (res) { // Do stuff with response })
options对象用于配置agent
. 可以设置以下几个属性:
keepAlive
布尔型,在池中保持sockets可以在之后给其他请求使用。默认值是false
keepAliveMsecs
整型,当使用HTTP KeepAlive,TCP KeepAlive包要发送多久socket就会保持连接多久,默认是1000. 只有当keepalive为true的时候才会起作用。maxSockets
number型,每个主机能够接受的最大的sockets数量,默认是infinity。maxFreeSockets
number型,处于空闲状态的socket的最大值。只有当keepAlive设置为true才会起作用。默认值是256。当这些属性被设置为各自的默认值并被http.request()使用时,默认的
http.globalAgent
才会被使用。
配置其中的任何一个值,你必须创建一个自己的http.Agent
对象。
var http = require(‘http‘); var keepAliveAgent = new http.Agent({ keepAlive: true }); options.agent = keepAliveAgent; http.request(options, onResponseCallback);
销毁任何一个正在被agent使用的sockets。
通常情况下并不需要这么做。不管怎么说,如果你正在使用开启了keepAlive的agent,最好明确的关闭一个即将不被使用的agent。除此以外,sockets会维持一段时间直到服务器关闭他们。
当使用HTTP KeepAlive时,agent.freeSockets对象会包含一个当前空闲的sockets数组。不要修改它。
标签:
原文地址:http://www.cnblogs.com/A-dam/p/5043324.html