前面的话
HTTP不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的。NodeJS作为一个宿主运行环境,以java script为宿主语言,它也有自己实现的一套标准,本文将详细介绍nodeJS中的Http模块
Agent
【new Agent([options])】
options <Object> 代理的配置选项。有以下字段:
keepAlive <boolean> 保持 socket 可用即使没有请求,以便它们可被将来的请求使用而无需重新建立一个 TCP 连接。默认为 false。
keepAliveMsecs <number> 当使用了 keepAlive 选项时,该选项指定 TCP Keep-Alive 数据包的 初始延迟。 当 keepAlive 选项为 false 或 undefined 时,该选项无效。 默认为 1000。
maxSockets <number> 每个主机允许的最大 socket 数量。 默认为 Infinity。
maxFreeSockets <number> 在空闲状态下允许打开的最大 socket 数量。 仅当 keepAlive 为 true 时才有效。 默认为 256
http.request() 使用的默认 http.globalAgent 的选项均为各自的默认值
若要配置其中任何一个,则需要创建自定义的 http.Agent 实例
【agent.createConnection(options[, callback])】
options <Object> 包含连接详情的选项
callback <Function> 接收被创建的 socket 的回调函数。callback 有 (err, stream) 参数
返回: <net.Socket>
创建一个用于 HTTP 请求的 socket 或流
默认情况下,函数类似于net.createConnection()。但如果期望更大的灵活性,自定义代理可重写该方法
socket 或流可以通过以下两种方式获取:从该函数返回或传入callback
【agent.destroy()】
销毁当前正被代理使用的任何socket
通常不需要这么做。但是如果使用的代理启用了keepAlive,则当确定它不再被使用时,最好显式地关闭代理。 否则,在服务器终止它们之前,socket 可能还会长时间保持打开
【agent.freeSockets】
返回一个对象,包含当前正在等待被启用了 keepAlive 的代理使用的 socket 数组。不要修改该属性
【agent.getName(options)】
options <Object> 为名称生成程序提供信息的选项。
host <string> 请求发送至的服务器的域名或 IP 地址。
port <number> 远程服务器的端口。
localAddress <string> 当发送请求时,为网络连接绑定的本地接口。
返回: <string>
为请求选项的集合获取一个唯一的名称,用来判断一个连接是否可以被复用。 对于 HTTP 代理,返回 host:port:localAddress。 对于 HTTPS 代理,名称会包含 CA、证书、密码、以及其他 HTTPS/TLS 特有的用于判断 socket 复用性的选项
【agent.maxFreeSockets】
默认为 256。 对于已启用 keepAlive 的代理,该属性可设置要保留的空闲 socket 的最大数量
【agent.maxSockets】
默认为不限制。 该属性可设置代理为每个来源打开的并发 socket 的最大数量。 来源是一个 'host:port' 或 'host:port:localAddress' 组合
【agent.requests】
返回一个对象,包含还未被分配到 socket 的请求队列。 不要修改
【agent.sockets】
返回一个对象,包含当前正被代理使用的 socket 数组。 不要修改
Request
【http.ClientRequest】
该对象在http.request()内部被创建并返回。它表示着一个正在处理的请求,其请求头已进入队列。请求头仍可使用setHeader(name, value)、getHeader(name) 和 removeHeader(name) API 进行修改。实际的请求头会与第一个数据块一起发送或当关闭连接时发送
要获取响应,需为 'response' 事件添加一个监听器到请求对象上。当响应头被接收到时,'response' 事件会从请求对象上被触发 。 'response'事件被执行时带有一个参数,该参数是一个 http.IncomingMessage 实例。在 'response' 事件期间,可以添加监听器到响应对象上,比如监听 'data' 事件
如果没有添加 'response' 事件处理函数,则响应会被整个丢弃。如果添加了 'response' 事件处理函数,则必须消耗完响应对象的数据,可通过调用 response.read()、或添加一个 'data' 事件处理函数、或调用.resume() 方法。数据被消耗完时会触发'end' 事件。在数据被读取完之前会消耗内存,可能会造成 'process out of memory' 错误
[注意]Node.js 不会检查 Content-Length 与已传输的请求主体的长度是否相等
var http = require('http');
var server = http.createServer(function(req, res){
console.log(req.url );//'/'
console.log(req.httpVersion );//1.1
console.log(req.method );//GET
//{"host":"127.0.0.1:5000","connection":"keep-alive","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36","accept":"image/webp,image/*,*/*;q=0.8","referer":"http://127.0.0.1:5000/","accept-encoding":"gzip, deflate, sdch, br","accept-language":"zh-CN,zh;q=0.8,en;q=0.6"}
console.log(JSON.stringify(req.headers) );
res.end('ok');
});
server.listen(5000);