O módulo http do Node.js

O módulo HTTP é um módulo essencial para aplicações de rede em Node.js.

Ele pode ser importado assim:

const http = require('http')

O módulo disponibiliza algumas propriedades e métodos, e também algumas classes.

Properties

http.METHODS

Essa propriedade lista todos os métodos HTTP suportados:

> 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

Essa propriedade lista todos os códigos de status HTTP e suas descrições:

> 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

Aponta para a instância global do objeto Agente, que é uma instÂncia da classe http.Agent.

É usado para gerenciar persistência de conexões e reuso para clientes HTTP.

Veremos mais da descrição da classe http.Agent.

Methods

http.createServer()

Retorna uma nova instância da classe http.Server.

Uso:

const server = http.createServer((req, res) => {
// gerencie cada requisição com essa callback
})

http.request()

Faz uma requisição HTTP para um servidor, criando uma instância da classe http.ClientRequest.

http.get()

Parecido com o http.request(), mas define automaticamente o verbo HTTP para GET, e chama req.end() automaticamente.

Classes

O módulo HTTP provê 5 classes:

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

http.Agent

O Node.js cria uma instância global da classe http.Agent para gerenciar persistência de conexões e reuso para clientes HTTP.

Esse objeto garante que toda requisição feita ao servidor seja enfileirada e um único socket seja reusado.

Também mantém um pool de sockets. Isso é necessário por razões de performance.

http.ClientRequest

Um objeto http.ClientRequest é criado quando http.request() ou http.get() são chamados.

Quando uma resposta é recebida, o evento response é chamado com a resposta, contendo uma instância de http.IncomingMessage como argumento.

Os dados retornados de uma resposta podem lidos de 2 formas:

  • você pode chamar o método response.read()
  • na callback do evento response você pode preparar um event listener para o evento data, assim você pode ouvir os dados transmitidos.

http.Server

Essa classe é comumente instanciada e retornada quando se cria um novo servidor usando http.createServer().

Uma vez que você tenha um objeto server, você pode acessar os métodos dele:

  • close() impede o servidor de aceitar novas conexões
  • listen() inicia o servidor HTTP e escuta as conexões

http.ServerResponse

Criado por um http.Server e passado como segundo parâmetro para o evento request acionado.

Normalmente é usado com o res:

const server = http.createServer((req, res) => {
// res é um objeto http.ServerResponse
})

Você sempre deve chamar o método end() na callback, que fecha a response, a mensagem está completa e o servidor pode enviá-la ao client. Deve ser chamado em cada response.

Esses métodos são usados para interagir com headers HTTP:

  • getHeaderNames() obtêm a lista de nomes das headers HTTP já definidas
  • getHeaders() obtêm uma cópia das headers HTTP já definidas
  • setHeader('headername', value) define uma header HTTP e seu valor
  • getHeader('headername') obtêm uma header HTTP já definida
  • removeHeader('headername') remove uma header HTTP já definida
  • hasHeader('headername') retorna true se a response já contêm aquela header
  • headersSent() retorna true se as headers já foram enviadas ao client

Depois de processar as headers você pode enviá-las ao client chamando response.writeHead(), que aceita o statusCode como primeiro parâmetro, e mensagem do status de forma opcional, e o objeto de headers.

Para enviar os dados ao client pelo body da response, você usa write(). Ele enviará os dados armazenados em buffer para a stream de resposta HTTP.

Se os headers ainda não foram enviados usando response.writeHead(), as headers serão enviadas primeiro, com o código de status e a mensagem que foram definidos na request, que você pode editar definindo os valores das propriedades statusCode e statusMessage:

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

http.IncomingMessage

Um objeto http.IncomingMessage é criado quando:

  • http.Server está escutando o evento request
  • http.ClientRequest está escutando o evento response

Pode ser usado para acessar da response:

  • status usando os métodos statusCode e statusMessage
  • headers usando o método headers ou rawHeaders
  • método HTTP usando o método method
  • versão HTTP usando o método httpVersion
  • URL usando o método url
  • socket subjacente usando o método socket

Os dados são acessados usando streams, uma vez que http.IncomingMessage implementa a interface Readable Stream.