Node.js http 模块
目录
HTTP 核心模块是 Node.js 网络的关键模块。
可以使用以下代码引入:
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
指向 Agent 对象的全局实例,该实例是 http.Agent
类的实例。
用于管理 HTTP 客户端连接的持久性和复用,它是 Node.js HTTP 网络的关键组件。
稍后会在 http.Agent
类的说明中提供更多描述。
方法
http.createServer()
返回 http.Server
类的新实例。
用法:
const server = http.createServer((req, res) => {
//使用此回调处理每个单独的请求。
})
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.js 会创建 http.Agent
类的全局实例,以管理 HTTP 客户端连接的持久性和复用,这是 Node.js HTTP 网络的关键组成部分。
该对象会确保对服务器的每个请求进行排队并且单个 socket 被复用。
它还维护一个 socket 池。 出于性能原因,这是关键。
http.ClientRequest
当 http.request()
或 http.get()
被调用时,会创建 http.ClientRequest
对象。
当响应被接收时,则会使用响应(http.IncomingMessage
实例作为参数)来调用 response
事件。
返回的响应数据可以通过以下两种方式读取:
- 可以调用
response.read()
方法。 - 在
response
事件处理函数中,可以为data
事件设置事件监听器,以便可以监听流入的数据。
http.Server
当使用 http.createServer()
创建新的服务器时,通常会实例化并返回此类。
拥有服务器对象后,就可以访问其方法:
close()
停止服务器不再接受新的连接。listen()
启动 HTTP 服务器并监听连接。
http.ServerResponse
由 http.Server
创建,并作为第二个参数传给它触发的 request
事件。
通常在代码中用作 res
:
const server = http.createServer((req, res) => {
//res 是一个 http.ServerResponse 对象。
})
在事件处理函数中总是会调用的方法是 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()
会先发送消息头,其中包含在请求中已被设置的状态码和消息,可以通过设置 statusCode
和 statusMessage
属性的值进行编辑:
response.statusCode = 500
response.statusMessage = '内部服务器错误'
http.IncomingMessage
http.IncomingMessage
对象可通过以下方式创建:
http.Server
,当监听request
事件时。http.ClientRequest
,当监听response
事件时。
它可以用来访问响应:
- 使用
statusCode
和statusMessage
方法来访问状态。 - 使用
headers
方法或rawHeaders
来访问消息头。 - 使用
method
方法来访问 HTTP 方法。 - 使用
httpVersion
方法来访问 HTTP 版本。 - 使用
url
方法来访问 URL。 - 使用
socket
方法来访问底层的 socket。
因为 http.IncomingMessage
实现了可读流接口,因此数据可以使用流访问。