Protocolo HTTP
Tags: http, webdev
Published: 2024-01-26 09:39:04

## Definições Relacionadas
**- Protocolo:** Conjunto de regras e convenções que define como a comunicação deve ocorrer entre sistemas. Um protocolo estabelece as directrizes para a troca de informações entre dispositivos.
**- Word Wide Web:** Sistema de informações interconectado na internet que permite o acesso a documentos, imagens, vídeos e outros recursos por meio de navegadores web.
**- HTTP:** Sigla para Hypertext Transfer Protocol, ou Protocolo de Transferência de Hipertexto em português. É um protocolo utilizado para transferir dados na World Wide Web.
**- Hipertexto:**  Sistema de organização de informações que permite a navegação não linear através de documentos interconectados.
**- Hipermídia:** Ampliação do conceito de hipertexto, além de texto, inclui também outros elementos de mídia, como gráficos, áudio, vídeo e outros formatos multimedia.
**- Cliente HTTP:** Software que envia solicitações HTTP a servidores para recuperar e exibir conteúdo web. É o ponto de origem para solicitar recursos de um servidor HTTP.
**- Servidor HTTP:** Software que recebe e processa solicitações HTTP de clientes, fornecendo recursos, como páginas web, imagens ou documentos, em resposta a essas solicitações. 
**- TCP:** Sigla para Transmission Control Protocol, ou Protocolo de Controle de Transmissão em português. É um protocolo que garante a entrega de dados de forma confiável e ordenada entre dispositivos em uma rede.


## Conceito
O HTTP é um protocolo de comunicação utilizado para sistemas de informação de hipermídia, distribuídos e colaborativos. Ele é a base para a comunicação de dados da World Wide Web.
O protocolo HTTP tem como objetivo permitir a comunicação entre clientes (geralmente navegadores web) e servidores, possibilitando o acesso e a transferência de recursos, como páginas HTML, imagens, vídeos, entre outros, pela internet.
O HTTP é fundamental para o funcionamento da World Wide Web, sendo a base para a comunicação entre navegadores e servidores, permitindo o acesso e a troca de informações que caracterizam a experiência online que conhecemos hoje.


## Origem do HTTP
O HTTP foi desenvolvido por **Tim Berners-Lee** no CERN (Organização Europeia para Pesquisa Nuclear) durante o início da década de 1990. 
A primeira versão, **HTTP/0.9**, foi introduzida em 1991, principalmente como um protocolo simples para transferência de documentos hipertexto na World Wide Web.
O HTTP evoluiu ao longo do tempo com o lançamento de várias versões, sendo a versão **HTTP/1.1** a mais amplamente utilizada.
A padronização e evolução do HTTP são gerenciadas pelo **IETF** (Internet Engineering Task Force) e pelo W3C (World Wide Web Consortium), organizações que desempenham papéis significativos na definição de padrões para a internet e a web.


## Características Principais
**- Sem estado (Stateless):** Cada solicitação entre o cliente e o servidor é tratada independentemente, sem que o servidor retenha informações sobre solicitações anteriores.
**- Baseado em Texto:** As mensagens HTTP são, em sua essência, texto legível por humanos. Isso facilita a depuração e o desenvolvimento, permitindo que desenvolvedores visualizem facilmente as solicitações e respostas.
**- Conexões Persistentes:** Capacidade de manter conexões persistentes, permitindo que várias requisições e respostas sejam enviadas pela mesma conexão TCP (introduzida pelo HTTP/1.1).
**- Simples:** Foi projectado para ser simples e de fácil implementação. Isso facilita a compreensão e implementação tanto para desenvolvedores quanto para sistemas.
**- Extensível:** É extensível, permitindo a introdução de novas funcionalidades através do acordo entre cliente e servidor utilizando a semântica de cabeçalhos HTTP.


## Fluxo de Funcionamento do HTTP
A comunicação entre cliente e servidor no protocolo HTTP segue as etapas a seguir:
**1 - Abertura da conexão TCP:** Inicia a conexão entre o cliente e o servidor por meio do protocolo TCP.
**2 - Envio da Requisição:** O cliente envia uma requisição ao servidor contendo as informações necessárias para a solicitação desejada.
**3 - Recepção da Requisição:** O servidor recebe a requisição do cliente e inicia o processamento para atender à solicitação.
**4 - Processamento da Resposta:** O servidor processa a requisição, executando as operações necessárias para gerar uma resposta adequada.
**5 - Envio da Resposta:** Após o processamento, o servidor envia a resposta ao cliente, contendo os dados ou informações solicitados.
**6 - Recepção da Resposta:** O cliente recebe a resposta do servidor, podendo ser uma página web, um arquivo ou outro conteúdo solicitado.
**7 - Fechamento da Conexão TCP:** Após a troca de informações, a conexão TCP entre o cliente e o servidor é encerrada.

As imagens abaixo, ilustram o funcionamento do HTTP:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/egumkc3q2onsa62glq8t.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r02sjatad9008v3i8ont.png)



## Mensagem HTTP
Mensagem HTTP é um pacote de dados transmitido entre o cliente e o servidor usando o HTTP. As mensagens são utilizadas para trocar recursos como páginas web, texto, imagens, vídeos, documentos, etc. 
Uma mensagem HTTP é um conjunto estruturado de dados transmitidos entre um cliente e um servidor. Essas mensagens desempenham um papel vital na comunicação online, permitindo a troca eficiente de recursos como páginas web, texto, imagens, vídeos e documentos.
As mensagens HTTP seguem um formato padronizado, sendo compostas por linhas de texto. Cada linha consiste em um campo e um valor, separados por dois pontos (**:**). 
Essa estrutura facilita a interpretação tanto para desenvolvedores quanto para os sistemas envolvidos, proporcionando uma base sólida para a comunicação eficaz na web.

Exemplo de mensagem:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/42hmlw94lrxoop4cnflf.png)


### Tipos de Mensagens HTTP
Existem 2 tipos de mensagens : 
**- Requisição:** Mensagem enviada pelo cliente para solicitar um recurso ao servidor.
**- Resposta**: Mensagem enviada pelo servidor em resposta a solicitação do cliente.

### Requisição
As requisições HTTP são usadas pelos clientes para solicitar recursos aos servidores. Uma requisição geralmente contém as seguintes informações:
**- Linha de Requisição:** Linha de texto composta pelo  método, o recurso solicitado, e a versão do protocolo HTTP.
**- Método:**  Define o que o cliente solicita ao servidor. Pode ser a visualização do conteúdo, substituição, alteração ou exclusão de recursos.
**- Recurso:** Página web, arquivo, serviço ou outro item solicitado ao servidor.
**- Cabeçalho:** Informações adicionais sobre a requisição. Ex: Navegador, tipo de conteúdo, etc.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0szq5bgq5ymda51m3lg.png)

### Resposta
As respostas são usadas pelo servidor para responder às requisições dos clientes. Uma resposta, geralmente contém as seguintes informações:
**- Código da resposta:** Status da requisição. Indica o resultado de uma requisição, pertencendo a uma classe.
**- Cabeçalho:** Informações adicionais da resposta. Ex: Tipo de conteúdo, tempo de resposta, data, etc.
**- Corpo da resposta:** Conteúdo da requisição feita. Ex: HTML, TXT, JSON, XML, etc.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pk6adp7vu2ltidqxg066.png)


## Métodos HTTP
**- GET:** Recupera o conteúdo de um recurso especificado. É o método mais comum para solicitar páginas web e dados. É seguro e geralmente utilizado para recuperação de informações.
**- POST:** Envia dados ao servidor para **criar** ou atualizar um recurso. Pode ter efeitos colaterais e não é projetado para ser repetido da mesma maneira. Espera que a requisição contenha a representação completa do recurso.
**- PUT:** Substitui a representação actual de um recurso especificado com o conteúdo da requisição.
**- DELETE:** Exclui o recurso especificado.
**- PATCH:** Aplica modificações parciais a um recurso existente. Permite actualizações incrementais.
**- OPTIONS:** Obtem informações sobre as opções de comunicação disponíveis para o recurso especificado. Fornece metadados sobre a requisição.
**- HEAD:** Verifica a existência de um recurso e obter informações sobre o cabeçalho sem recuperar o conteúdo completo.
**- CONNECT:** Estabelece um **túnel** seguro de comunicação entre o cliente e o servidor. Geralmente é usado em conjunto com o protocolo **SSL/TLS** para criar uma conexão segura.
**- TRACE:** Testa a conectividade e diagnóstico de problemas na comunicação entre o cliente e o servidor. Este método é utilizado principalmente para fins de **depuração**.


## Idempotência dos Métodos HTTP
Um método idempotente é um método que retorna o mesmo resultado depois várias requisições idênticas.  Isto é, uma requisição pode ser feita várias vezes não causa **nenhum efeito colateral** no servidor.
Os métodos idempotentes são projetados para garantir que a repetição da requisição não cause alterações inesperadas no estado do servidor. Isso é particularmente importante em situações em que uma requisição pode ser repetida devido a falhas de rede, timeouts ou outras condições imprevisíveis.

Os métodos comuns que possuem a propriedade de idempotência são:
**- GET:** Apenas solicita um recurso sem modificar o estado do servidor.
**- PUT:** Actualiza um recurso. Se usarmos os mesmos dados, o resultado será o mesmo.
**- DELETE:** A remoção de um recurso, resulta no mesmo estado, independente do número de solicitações.

### Exemplos de Idempotência
**- Acessar uma página web:** Ao acessar uma página web várias vezes, verá o mesmo conteúdo todas as vezes. Isso ocorre porque o método  **GET** é idempotente.
**- Atualizar um perfil:** Ao atualizar seu perfil várias vezes com os mesmos dados, o servidor substituirá o conteúdo do perfil com os mesmos dados todas as vezes. Isso ocorre porque o método **PUT** é idempotente.
**- Excluir um recurso:** Ao excluir um recurso várias vezes, o servidor excluirá o recurso apenas uma vez e ao realizar chamadas subsequentes, o recurso já terá sido removido sem causar efeitos colaterais. Isso ocorre porque o método  **DELETE** é idempotente.


## Códigos de Resposta HTTP
Os códigos de resposta HTTP são utilizados para comunicar o status de uma solicitação entre o cliente e o servidor web. Esses códigos são enviados no cabeçalho da resposta HTTP.
Os códigos ajudam na comunicação eficaz entre o cliente e servidor, informando sobre o estado da solicitação e permitindo a tomada de decisões apropriadas.

Os Códigos HTTP são compostos por três dígitos e são divididos em cinco categorias principais. 

Cada categoria representa uma classe de respostas. As principais categorias são:

**1xx (Informação):** Indicam que a requisição foi recebida, entendida e está sendo processada.

- 100 Continue: O servidor recebeu os cabeçalhos da requisição e o cliente deve prosseguir com o corpo da requisição.
- 101 Switching Protocols: O servidor concorda em mudar os protocolos solicitados pelo cliente.

**2xx (Sucesso):** Indicam que a requisição foi recebida, entendida, aceita e processada com sucesso.

- 200 OK: A solicitação foi bem-sucedida.
- 201 Created: A solicitação foi bem-sucedida e resultou na criação de um novo recurso.
- 204 No Content: A solicitação foi bem-sucedida, mas não há conteúdo a ser retornado.

**3xx (Redirecionamento):** Indicam que o cliente precisa realizar ações adicionais para completar a solicitação.
   - 301 Moved Permanently: O recurso solicitado foi movido permanentemente para outra localização.
   - 302 Found (ou 303 See Other): O recurso solicitado foi encontrado em uma nova localização temporária.
   - 304 Not Modified: Indica que o recurso não foi modificado desde a última solicitação.

**4xx (Erro no Cliente):** Indicam que ocorreu um erro na solicitação do cliente. 

- 400 Bad Request: A solicitação do cliente é inválida.
- 401 Unauthorized: A solicitação requer autenticação.
- 403 Forbidden: O servidor entende a solicitação, mas o acesso não é permitido.
- 404 Not Found: O recurso solicitado não foi encontrado.

**5xx (Erro no Servidor):** Indicam que o servidor falhou ao atender uma requisição.

- 500 Internal Server Error: Erro genérico do servidor.
- 502 Bad Gateway: O servidor, enquanto agindo como um gateway ou proxy, recebeu uma resposta inválida do servidor upstream.
- 503 Service Unavailable: O servidor não está pronto para lidar com a solicitação. Geralmente, isso é temporário.



## Ferramentas para Visualizar Mensagens HTTP
**- Curl:** Ferramenta CLI que permite fazer solicitações HTTP e visualizar as respostas diretamente no terminal.
**- Navegador (Developer Tools):** Navegadores modernos oferecem ferramentas de desenvolvedor que permitem visualizar detalhes de requisições e respostas HTTP.
**- Postman:** Ferramenta colaborativa que fornece uma interface gráfica fácil de usar para criar e enviar solicitações HTTP, visualizando as respostas, e permite organizar e automatizar testes de API.


## Conclusão
Concluindo, é altamente recomendado que os desenvolvedores se aprofundem no estudo dos vários aspectos do Protocolo HTTP. Dado que é o protocolo mais amplamente utilizado nas aplicações do mundo real, compreender os seus conceitos é crucial para o desenvolvimento eficaz de aplicações web.
 Um sólido entendimento do HTTP não apenas facilita a criação de aplicações mais eficientes, mas também aprimora a capacidade de compreender e solucionar problemas relacionados à troca de requisições e respostas entre clientes e servidores.
 O conhecimento profundo do HTTP proporciona uma base sólida para o desenvolvimento web e contribui para a construção de sistemas mais robustos e eficazes.

## Referências
- https://www.w3.org/Protocols/Specs.html
- https://developer.mozilla.org/pt-BR/docs/Web/HTTP
- https://en.wikipedia.org/wiki/HTTP