Node中提供了http模块,其中封装了高效的http服务器和http客户端
属性
-
http.METHODS:
-
http.STATUS_CODES:返回标准的 HTTP 响应状态码的集合,以及各自的简短描述。
-
globalAgent:Agent 的全局实例,作为所有 HTTP 客户端请求的默认 Agent。
-
close:
方法
-
createServer([requestListener]):返回一个新建的
http.Server
实例。
一、http.Agent 类
Agent 负责为 HTTP 客户端管理连接的持续与复用。
构造函数
- new Agent([options]):
options
<Object>代理的配置选项。有以下字段:
-
keepAlive
<boolean>保持 socket 可用即使没有请求,以便它们可被将来的请求使用而无需重新建立一个 TCP 连接。默认为false
。 -
keepAliveMsecs
<number> 当使用了keepAlive
选项时,该选项指定 TCPKeep-Alive
数据包的 初始延迟。 当keepAlive
选项为false
或undefined
时,该选项无效。 默认为1000
。 -
maxSockets
<number>每个主机允许的最大 socket 数量。 默认为Infinity
。 -
maxFreeSockets
<number>在空闲状态下允许打开的最大 socket 数量。 仅当keepAlive
为true
时才有效。 默认为256
。
属性
- close:
- close:
方法
二、http.Server 类
该类继承自 net.Server.
事件
- checkContinue:每当接收到一个带有 HTTP Expect: 100-continue 请求头的请求时触发。
- checkExpectation:每当接收到一个带有 HTTP Expect 请求头(值不为 100-continue)的请求时触发
- clientError:如果客户端触发了一个 'error' 事件,则它会被传递到这里
- connect:每当客户端发送 HTTP CONNECT 请求时触发.
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- request:每次接收到一个请求时触发。 注意,每个连接可能有多个请求(在 HTTP keep-alive 连接的情况下)
* `request` <http.IncomingMessage>
* `response` <http.ServerResponse>
// req 是 http.IncomingMessage 的实例,这是一个 Readable Stream
// res 是 http.ServerResponse 的实例,这是一个 Writable Stream
- upgrade:每当客户端发送 HTTP upgrade 请求时触发。
属性
- timeout:socket 被认定为超时的空闲毫秒数。
- keepAliveTimeout:超时毫秒. 默认为 5000 (5秒).
- maxHeadersCount:限制请求头的最大数量,默认为 2000。 如果设为 0,则没有限制。
方法
- setTimeout([msecs][, callback]):设置 socket 的超时时间。
三、http.ClientRequest 类
该对象在 http.request()
内部被创建并返回。 它表示着一个正在处理的请求,其请求头已进入队列。 请求头仍可使用 setHeader(name, value)
、getHeader(name)
和 removeHeader(name)
API 进行修改。 实际的请求头会与第一个数据块一起发送或当调用 request.end()
时发送。
-
http.request(options[, callback]):
http.request()
返回一个http.ClientRequest
类的实例。ClientRequest
实例是一个可写流。 如果需要通过 POST 请求上传一个文件,则写入到ClientRequest
对象。
* `options` <Object>| <string> | <URL>
* `protocol` <string>使用的协议。默认为 `http:`。
* `host` <string>请求发送至的服务器的域名或 IP 地址。默认为 `localhost`。
* `hostname` <string>`host` 的别名。为了支持 `url.parse()`,`hostname` 优先于 `host`。
* `family` <number>当解析 `host` 和 `hostname` 时使用的 IP 地址族。 有效值是 `4` 或 `6`。当未指定时,则同时使用 IP v4 和 v6。
* `port` <number>远程服务器的端口。默认为 `80`。
* `localAddress` <string>为网络连接绑定的本地接口。
* `socketPath`[<string>Unix 域 Socket(使用 host:port 或 socketPath)。
* `method` <string>指定 HTTP 请求方法的字符串。默认为 `'GET'`。
* `path` <string>请求的路径。默认为 `'/'`。 应包括查询字符串(如有的话)。如 `'/index.html?page=12'`。 当请求的路径中包含非法字符时,会抛出异常。 目前只有空字符会被拒绝,但未来可能会变化。
* `headers` <Object> 包含请求头的对象。
* `auth` <string> 基本身份验证,如 `'user:password'` 用来计算 `Authorization` 请求头。
* `agent` <http.Agent> | <boolean> 控制 `Agent`的行为。 可能的值有:
* `undefined` (默认): 对该主机和端口使用 `http.globalAgent`
* `Agent` 对象:显式地使用传入的 `Agent`。
* `false`: 创建一个新的使用默认值的 `Agent`。
* `createConnection` <Function>当不使用 `agent` 选项时,为请求创建一个 socket 或流。 这可以用于避免仅仅创建一个自定义的 `Agent` 类来覆盖默认的 `createConnection` 函数。详见 `agent.createConnection()`。
* `timeout` <number>: 指定 socket 超时的毫秒数。 它设置了 socket 等待连接的超时时间。
* `callback` <Function>
const postData = querystring.stringify({
'msg' : 'Hello World!'
});
const options = {
hostname: 'www.google.com',
port: 80,
path: '/upload',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`响应主体: ${chunk}`);
});
res.on('end', () => {
console.log('响应中已无数据。');
});
});
req.on('error', (e) => {
console.error(`请求遇到问题: ${e.message}`);
});
// 写入数据到请求主体
req.write(postData);
req.end();
-
get(options[, callback]):因为大多数请求都是 GET 请求且不带请求主体,所以 Node.js 提供了该便捷方法。 该方法与
http.request()
唯一的区别是它设置请求方法为 GET 且自动调用req.end()
。 注意,回调函数务必消耗掉响应数据,
事件
-
abort:当请求已被客户端终止时触发。
-
response:当请求的响应被接收到时触发。 该事件只触发一次。
-
socket:当 socket 被分配到请求后触发。
-
timeout:当底层 socket 超时的时候触发
-
connect:每当服务器响应 CONNECT 请求时触发。
-
continue:当服务器发送了一个 100 Continue 的 HTTP 响应时触发,通常是因为请求包含 Expect: 100-continue。
-
upgrade:每当服务器响应 upgrade 请求时触发。
属性
-
aborted:如果请求已被终止,则该属性的值为请求被终止的时间
-
socket:引用底层socket。
方法
-
abort():
-
end([data[, encoding]][, callback]):
-
flushHeaders():
-
etHeader(name):
-
removeHeader(name):
-
setHeader(name, value):
-
setNoDelay([noDelay]):
-
setSocketKeepAlive([enable][, initialDelay]):一旦 socket 被分配给请求且已连接,
socket.setKeepAlive()
会被调用。 -
setTimeout(timeout[, callback]):一旦 socket 被分配给请求且已连接,
socket.setTimeout()
会被调用。 -
write(chunk[, encoding][, callback]):发送请求主体的一个数据块
四、http.IncomingMessage 类
由 http.Server
或 http.ClientRequest
创建,并作为第一个参数分别递给 'request'
和 'response'
事件。 它可以用来访问响应状态、消息头、以及数据。它实现了 可读流接口,http.IncomingMessage是HTTP请求的信息,
事件
- aborted:当请求已被终止且网络 socket 已关闭时触发。
- close:当底层连接被关闭时触发。
属性
-
headers:请求头或响应头的对象。
-
httpVersion:在服务器请求中,该属性返回客户端发送的 HTTP 版本。 在客户端响应中,该属性返回连接到的服务器的 HTTP 版本。
-
method:
-
rawHeaders:接收到的原始的请求头或响应头列表。
-
rawTrailers:接收到的原始的 Trailer 请求头或响应头的的键和值。 只在 'end' 事件时被赋值。
-
socket:通过 HTTPS 的支持,使用
request.socket.getPeerCertificate()
获取客户端的认证信息。 -
statusCode:
-
statusMessage:
-
url:****仅在
http.Server
返回的请求中有效。 -
close:
方法
- destroy([error]):
- setTimeout(msecs, callback):
五、http.ServerResponse 类
该对象在 HTTP 服务器内部被创建。 它作为第二个参数被传入 'request'
事件。这个类实现了(而不是继承自)可写流接口。 它是一个有以下事件的 EventEmitter
:
事件
-
close:当底层连接在
response.end()
被调用或能够刷新之前被终止时触发。 -
finish:当响应已被发送时触发。
属性
-
finished:返回一个布尔值,表示响应是否已完成。
-
headersSent:返回一个布尔值(只读)。 如果响应头已被发送则为 true,否则为 false。
-
sendDate:当为 true 时,如果响应头里没有日期响应头,则日期响应头会被自动生成并发送。默认为 true。
-
socket:引用底层socket。
-
statusCode:当使用隐式的响应头时(没有显式地调用
response.writeHead()
,该属性控制响应头刷新时将被发送到客户端的状态码。 -
statusMessage:当使用隐式的响应头时(没有显式地调用
response.writeHead()
,该属性控制响应头刷新时将被发送到客户端的状态信息。
方法
-
addTrailers(headers):该方法会添加 HTTP 尾部响应头(一种在消息尾部的响应头)到响应。
-
end([data][, encoding][, callback]):该方法会通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为已完成。
-
getHeader(name):
-
getHeaderNames():
-
getHeaders():返回当前响应头文件的浅拷贝。
-
hasHeader(name):
-
removeHeader(name):
-
setHeader(name, value):
-
setTimeout(msecs[, callback]):
-
write(chunk[, encoding][, callback]):
-
writeContinue():
-
writeHead(statusCode[, statusMessage][, headers]):
网友评论