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 eventodata
, 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õeslisten()
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á definidasgetHeaders()
obtêm uma cópia das headers HTTP já definidassetHeader('headername', value)
define uma header HTTP e seu valorgetHeader('headername')
obtêm uma header HTTP já definidaremoveHeader('headername')
remove uma header HTTP já definidahasHeader('headername')
retorna true se a response já contêm aquela headerheadersSent()
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 = 500response.statusMessage = 'Internal Server Error'
http.IncomingMessage
Um objeto http.IncomingMessage
é criado quando:
http.Server
está escutando o eventorequest
http.ClientRequest
está escutando o eventoresponse
Pode ser usado para acessar da response:
- status usando os métodos
statusCode
estatusMessage
- headers usando o método
headers
ourawHeaders
- 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.