node -- http

828 阅读9分钟
  • 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 实例。
  • http.get(options[, callback]):

  • http.get(url[, options][, callback]):

    • url <string> | <URL>
    • options <Object> 接受与 http.request() 相同的 options,且 method 始终设置为 GET。从原型继承的属性将被忽略。
    • callback
    • 返回: <http.ClientRequest>
  • 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 : 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。
    • callback

    • 返回: <http.ClientRequest>

一、http.Agent 类

  • Agent 负责为 HTTP 客户端管理连接的持续与复用。

构造函数

  • new Agent([options]):

  • options <Object>代理的配置选项。有以下字段:

    • keepAlive 保持 socket 可用即使没有请求,以便它们可被将来的请求使用而无需重新建立一个 TCP 连接。默认为 false
    • keepAliveMsecs  当使用了 keepAlive 选项时,该选项指定 TCP Keep-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]):