Protocolo HTTP
O acrônimo HTTP significa Hypertext Transfer Protocol ou, em português Protocolo de Transferência de Hipertexto. Esta é a tecnologia que permite que uma pessoa navegue pelas páginas de um site na internet. Por exemplo, clicando sobre um link em uma página HTML o usuário tem acesso ao conteúdo (outra página HTML) associado ao link. Esta mesma tecnologia é usada no contexto de aplicações para web.
Em uma aplicação para web há sempre pelo menos dois programas envolvidos: o programa cliente e o programa servidor. Estes programas interagem por meio do protocolo HTTP. O programa cliente é um navegador (um browser) e o programa servidor qualquer capaz de "falar" HTTP como, por exemplo, o servidor Apache.
HTTP é um protocolo de comunicação do tipo requisição-resposta baseado no modelo cliente-servidor. O programa cliente sempre toma a iniciativa de enviar uma requisição ao programa servidor que, após processá-la, enviará uma resposta ao programa cliente.
HTTP1.1
A versão 1.1 do protocolo define que o programa cliente envia um texto, formado por diversas linhas, ao programa servidor que, por sua vez, envia de volta outro texto. Portanto, requisições e respostas HTTP nada mais são do mensagens trocadas entre o programa cliente e o programa servidor.
Requisição
Uma requisição HTTP é um texto formado por:
- uma linha inicial (obrigatória)
- cabeçalho (opcional)
- corpo (opcional)
A linha inicial contém 3 informações: o método desejado (GET, POST, etc), o recurso solicitado (por exemplo, qual a página solicitada) e a versão do protocolo HTTP. Por exemplo:
GET /index.html HTTP/1.1
O cabeçalho é formado por 0 a N linhas que contém informações adicionais que são enviadas ao programa servidor. Cada linha é formada por um par nome-valor. Por exemplo, o cabeçalho User-Agent abaixo indica que a requisição partiu de um computador da Apple rodando o sistema operacional Mac OS X versão 10.13 e o navegador usado foi o Firefox versão 58.
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:58.0) Gecko/20100101 Firefox/58.0
O corpo da mensagem, que é opcional, pode conter dados necessários para que o servidor possa atender ao que está sendo solicitado. O exemplo típico é quando o usuário envia os dados de um formulário que acabou de preencher. A mensagem representada pela resquisição, neste caso, deveria ser ententendida como "servidor, processe os dados que eu estou lhe enviando".
Métodos
O protocolo define 8 métodos: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS e CONNECT. Um servidor HTTP deve, no mínimo, implementar ao menos os métodos GET e HEAD. O método define o que se deseja fazer com o recurso contido da requisição.
Método GET
O método GET indica que se deseja obter o recurso solicitado sem causar nenhuma modificação/alteração de informação armazenada no servidor.
Método HEAD
Semelhante ao GET, o método HEAD indica que só se está interessado no cabeçalho da resposta, isto é, não é necessário enviar o corpo da mensagem.
Método POST
O método POST é usado quando se deseja que novos dados sejam processados no servidor (por exemplo incluir uma nova informação no banco de dados).
Método PUT
O método PUT é usado quando se deseja alterar dados que já existem no servidor.
Método DELETE
O método DELETE é usando quando se deseja remover dados que existem no servidor.
Método TRACE
O método TRACE é usado para depurar aplicações (verificar como as requisições são tratadas pelo servidor). No entanto, recomenda-se não usar este método devido aos riscos de segurança que ele cria.
Método OPTIONS
O método OPTIONS é usando quando se deseja saber quais métodos são aceitos pelo servidor.
Método CONNECT
O método CONNECT é usado quando se deseja criar um túnel SSL para estabelecer uma conexão segura.
Resposta
Uma resposta HTTP é um texto enviado pelo programa servidor ao programa cliente. Este texto contém as seguintes informações:
- uma linha inicial (obrigatória)
- cabeçalho (opcional)
- corpo (opcional)
Observe que a estrutura (linha inicial + cabeçalho + corpo) é a mesma das requisições.
A linha inicial contendo o código de estado (status code) que indica, entre outras informações, se a requisição solicitada foi atendida ou não e uma mensagem explicativa. Dois exemplos de código de estado bem conhecidos são o 200 (a requisição foi atendida com sucesso) e o 404 (o recurso solicitado não existe).
O cabeçalho contendo de 0 a N informações adicionais enviadas pelo servidor.
O corpo da mensagem contendo o recurso solicitado, tipicamente o texto HTML ou a imagem.
Importância dos Cabeçalhos
Os cabeçalhos, tanto na requisição quanto na resposta, são muito importantes, especialmente em relação a aspectos de segurança das aplicações para web.
HTTP/2
A comunicação via HTTP versão 1.1 implica, como escrito acima, no envio e recebimento de textos. A cada ciclo requisição-processamento-resposta gera-se texto que não fazem muito sentido em aplicações para web e trazem alguma ineficiência.
A resposta para os problemas foi a criação da versão 2.0 do protocolo HTTP, definida em maio de 2015 (a versão 1.1 é de 1997).
As principais características dezta nova versão do protocolo são:
- O protocolo passa a ser binário e não mais texto.
- Completamente compatível com a versão 1.1. Tudo continua funcionando quando os servidores passam a executar a versão 2.0.
- Melhora no desempenho das aplicações para web mesmo que elas tenham sido criadas pensando na versão 1.1.
- Foi pensado levando-se em consideração que as comunicações entre cliente e servidor em aplicações para web são diferentes das navegações em sites, embora utilizem as mesmas tecnologias.
- Para explorar 100% dos benefícios da versão 2.0 as aplicações para web precisam ser alteradas.
O post de Kamran Ahmed faz um excelente resumo da história do protocolo HTTP e das motivações e características do TTP/2.
Leitura Obrigatória |
---|
Sobre o HTTP |
Cabeçalhos HTTP |
HTTP/2 - post de Kamran Ahmed |
Leitura Sugerida |
---|
HTTP/1.1 - Message Syntax and Routing |
HTTP/1.1 - Semantics and Content |
HTTP/1.1 - Conditional Requests |
HTTP/1.1 - Range Requests |
HTTP/1.1 - Caching |
HTTP/1.1 - Authentication |