Node http模块的功能介绍

102 阅读5分钟

HTTP核心模块是Node网络的一个关键模块。

它可以用

const http = require('http')

该模块提供了一些属性和方法,以及一些类。

属性

http.METHODS

这个属性列出了所有支持的HTTP方法。

> require('http').METHODS
[ 'ACL',  'BIND',  'CHECKOUT',  'CONNECT',  'COPY',  'DELETE',  'GET',  'HEAD',  'LINK',  'LOCK',  'M-SEARCH',  'MERGE',  'MKACTIVITY',  'MKCALENDAR',  'MKCOL',  'MOVE',  'NOTIFY',  'OPTIONS',  'PATCH',  'POST',  'PROPFIND',  'PROPPATCH',  'PURGE',  'PUT',  'REBIND',  'REPORT',  'SEARCH',  'SUBSCRIBE',  'TRACE',  'UNBIND',  'UNLINK',  'UNLOCK',  'UNSUBSCRIBE' ]

http.STATUS_CODES

该属性列出了所有的HTTP状态代码及其描述。

> require('http').STATUS_CODES
{ '100': 'Continue',
  '101': 'Switching Protocols',
  '102': 'Processing',
  '200': 'OK',
  '201': 'Created',
  '202': 'Accepted',
  '203': 'Non-Authoritative Information',
  '204': 'No Content',
  '205': 'Reset Content',
  '206': 'Partial Content',
  '207': 'Multi-Status',
  '208': 'Already Reported',
  '226': 'IM Used',
  '300': 'Multiple Choices',
  '301': 'Moved Permanently',
  '302': 'Found',
  '303': 'See Other',
  '304': 'Not Modified',
  '305': 'Use Proxy',
  '307': 'Temporary Redirect',
  '308': 'Permanent Redirect',
  '400': 'Bad Request',
  '401': 'Unauthorized',
  '402': 'Payment Required',
  '403': 'Forbidden',
  '404': 'Not Found',
  '405': 'Method Not Allowed',
  '406': 'Not Acceptable',
  '407': 'Proxy Authentication Required',
  '408': 'Request Timeout',
  '409': 'Conflict',
  '410': 'Gone',
  '411': 'Length Required',
  '412': 'Precondition Failed',
  '413': 'Payload Too Large',
  '414': 'URI Too Long',
  '415': 'Unsupported Media Type',
  '416': 'Range Not Satisfiable',
  '417': 'Expectation Failed',
  '418': 'I\'m a teapot',
  '421': 'Misdirected Request',
  '422': 'Unprocessable Entity',
  '423': 'Locked',
  '424': 'Failed Dependency',
  '425': 'Unordered Collection',
  '426': 'Upgrade Required',
  '428': 'Precondition Required',
  '429': 'Too Many Requests',
  '431': 'Request Header Fields Too Large',
  '451': 'Unavailable For Legal Reasons',
  '500': 'Internal Server Error',
  '501': 'Not Implemented',
  '502': 'Bad Gateway',
  '503': 'Service Unavailable',
  '504': 'Gateway Timeout',
  '505': 'HTTP Version Not Supported',
  '506': 'Variant Also Negotiates',
  '507': 'Insufficient Storage',
  '508': 'Loop Detected',
  '509': 'Bandwidth Limit Exceeded',
  '510': 'Not Extended',
  '511': 'Network Authentication Required' }

http.globalAgent

指向代理对象的全局实例,它是http.Agent 类的一个实例。

它被用来管理HTTP客户端的连接持久性和重复使用,它是Node HTTP网络的一个关键组件。

更多内容请见后面的http.Agent 类描述。

方法

http.createServer()

返回一个新的http.Server 类的实例。

使用方法。

const server = http.createServer((req, res) => {
  //handle every single request with this callback
})

http.request()

向服务器发出一个HTTP请求,创建一个http.ClientRequest 类的实例。

http.get()

类似于http.request() ,但自动将HTTP方法设置为GET,并自动调用req.end()

HTTP模块提供了5个类。

  • http.Agent
  • http.ClientRequest
  • http.Server
  • http.ServerResponse
  • http.IncomingMessage

http.Agent

Node创建了一个http.Agent 类的全局实例来管理HTTP客户端的连接持久性和重复使用,这是Node HTTP网络的一个关键组成部分。

这个对象确保每一个向服务器发出的请求都是排队的,并且一个套接字被重复使用。

它还维护一个套接字池。这是性能方面的关键。

http.ClientRequest

http.request()http.get() 被调用时,会创建一个http.ClientRequest 对象。

当收到一个响应时,response 事件被调用,并以一个http.IncomingMessage 实例作为参数。

响应的返回数据可以通过两种方式读取。

  • 你可以调用response.read() 方法
  • response 事件处理程序中,你可以为data 事件设置一个事件监听器,这样你就可以监听流进的数据。

http.Server

这个类通常在使用http.createServer() 创建一个新的服务器时被实例化并返回。

一旦你有一个服务器对象,你就可以访问它的方法。

  • close() 停止服务器接受新的连接
  • listen() 启动HTTP服务器并监听连接

http.ServerResponse

由一个http.Server ,并作为第二个参数传递给它所触发的request 事件。

在代码中通常被称为和使用的是res

const server = http.createServer((req, res) => {
  //res is an http.ServerResponse object
})

在处理程序中你总是要调用的方法是end() ,它关闭了响应,消息已经完成,服务器可以把它发送给客户端。它必须在每个响应上被调用。

这些方法是用来与HTTP头信息交互的。

  • getHeaderNames() 获取已经设置的HTTP头文件的名称列表
  • getHeaders() 获得一份已经设置的HTTP头的副本
  • setHeader('headername', value) 设置一个HTTP头的值
  • getHeader('headername') 获取一个已经设置的HTTP头
  • removeHeader('headername') 删除一个已经设置的HTTP头像
  • hasHeader('headername') 如果响应中设置了该头信息,则返回true
  • headersSent() 如果头信息已经被发送到客户端,则返回true。

在处理完头信息后,你可以通过调用response.writeHead() ,将它们发送给客户端,它接受 statusCode 作为第一个参数、可选的状态信息和头信息对象。

要在响应体中向客户端发送数据,你可以使用write() 。它将发送缓冲的数据到HTTP响应流中。

如果使用response.writeHead() ,还没有发送头信息,它将首先发送头信息,其中的状态代码和信息是在请求中设置的,你可以通过设置statusCodestatusMessage 属性值来编辑。

response.statusCode = 500
response.statusMessage = 'Internal Server Error'

http.IncomingMessage

一个http.IncomingMessage 对象是由创建的。

  • http.Server 当监听 事件时request
  • http.ClientRequest 当监听 事件时response

可以用它来访问响应。

  • 使用它的statusCodestatusMessage 方法访问状态
  • 使用它的headers 方法访问头文件,或rawHeaders
  • HTTP方法,使用其method 方法
  • 使用httpVersion 方法的HTTP版本
  • 使用url 方法的URL
  • 使用socket 方法的底层套接字

数据使用流来访问,因为http.IncomingMessage 实现了可读流接口。