- Node中提供了http模块,其中封装了高效的http服务器和http客户端
var http = require('http');
// http server 例子
var server = http.createServer(function(serverReq, serverRes){
var url = serverReq.url;
serverRes.end( '您访问的地址是:' + url );
});
server.listen(3000);
// http client 例子
var client = http.get('http://127.0.0.1:3000', function(clientRes){
clientRes.pipe(process.stdout);
});
- server: http.Server实例,用来提供服务,处理客户端的请求。
- client: http.ClientReques实例,用来向服务端发起请求。
- serverReq/clientRes: 其实都是 http.IncomingMessage实。serverReq 用来获取客户端请求的相关信息,如request header;而clientRes用来获取服务端返回的相关信息,比如response header。
- serverRes: http.ServerResponse实例
属性
-
METHODS: 解析器支持的 HTTP 方法列表。
-
STATUS_CODES: 所有标准 HTTP 响应状态码的集合,以及每个状态码的简短描述。。
-
globalAgent: Agent 的全局实例,作为所有 HTTP 客户端请求的默认 Agent。
-
maxHeaderSize:
-
close:
方法
-
createServer([options][, requestlistener]): 返回一个新建的
http.Server实例。- options
<Object>- IncomingMessage
- ServerResponse
- requestListener 是一个自动添加到 'request' 事件的函数。
- 返回:
<http.Server>返回新建的 http.Server 实例。
- options
-
http.get(options[, callback]):
-
http.get(url[, options][, callback]):
- url
<string>|<URL> - options
<Object>接受与 http.request() 相同的 options,且 method 始终设置为 GET。从原型继承的属性将被忽略。 - callback
- 返回: <http.ClientRequest>
- url
-
http.request(options[, callback]):
-
http.request(url[, options][, callback]):
-
url |
-
options
<Object>- agent
<http.Agent>|<boolean>控制 Agent 的行为。可能的值有:- undefined (默认): 对此主机和端口使用 http.globalAgent。
- Agent 对象: 显式地使用传入的 Agent。
- false: 使用新建的具有默认值的 Agent。
- auth
<string>基本的身份验证,即 'user:password',用于计算授权请求头。 - createConnection 当 agent 选项未被使用时,用来为请求生成套接字或流的函数。这可用于避免创建自定义的 Agent 类以覆盖默认的 createConnection 函数。详见 agent.createConnection()。任何双工流都是有效的返回值。
- defaultPort 协议的默认端口。 如果使用 Agent,则默认值为 agent.defaultPort,否则为 undefined。
- family 当解析 host 或 hostname 时使用的 IP 地址族。有效值为 4 或 6。如果没有指定,则同时使用 IP v4 和 v6。
- headers
<Object>包含请求头的对象。 - host 请求发送至的服务器的域名或 IP 地址。默认值: 'localhost'。
- hostname host 的别名。为了支持 url.parse(),如果同时指定 host 和 hostname,则使用 hostname。
- localAddress 为网络连接绑定的本地接口。
- method 一个字符串,指定 HTTP 请求的方法。默认值: 'GET'。
- path 请求的路径。应包括查询字符串(如果有)。例如 '/index.html?page=12'。当请求的路径包含非法的字符时,则抛出异常。目前只有空格被拒绝,但未来可能会有所变化。默认值: '/'。
- port 远程服务器的端口。默认值: defaultPort(如果有设置)或 80。
- protocol 使用的协议。默认值: 'http:'。
- setHost : 指定是否自动添加 Host 请求头。默认值: true。
- socketPath Unix 域套接字。如果指定了 host 或 port 之一(它们指定了 TCP 套接字),则不能使用此选项。
- timeout : 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。
- agent
-
callback
-
返回: <http.ClientRequest>
-
一、http.Agent 类
- Agent 负责为 HTTP 客户端管理连接的持续与复用。
构造函数
-
new Agent([options]):
-
options<Object>代理的配置选项。有以下字段:keepAlive保持 socket 可用即使没有请求,以便它们可被将来的请求使用而无需重新建立一个 TCP 连接。默认为false。keepAliveMsecs当使用了keepAlive选项时,该选项指定 TCPKeep-Alive数据包的 初始延迟。 当keepAlive选项为false或undefined时,该选项无效。 默认为1000。maxSockets每个主机允许的最大 socket 数量。 默认为Infinity。maxFreeSockets在空闲状态下允许打开的最大 socket 数量。 仅当keepAlive为true时才有效。 默认为256。
属性
- freeSockets:
- maxFreeSockets:
- maxSockets:
- requests:
- sockets:
方法
- createConnection(options[, callback]):
- //todo
二、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]):