O nosso amiguinho HTTP
Tags: braziliandevs, beginners, programming, webdev
Published: 2023-06-01 21:20:19

> O HTTP se tornou a base para a comunicação da internet. Neste post, vou escrever um pouquinho do que aprendi sobre o assunto. 

O **Hypertext Transfer Protocol (HTTP)** é um dos protocolos disponíveis na camada de aplicação, que não possui estado e foi projetado para sistemas distribuídos e colaborativos.

Sua estrutura foi feita olhando para os protocolos da Internet, permitindo que elementos de redes aprimorem ou habilitem suas comunicações entre cliente e servidor, esse modelo de comunicação é chamado de 'client-server'.

Essa comunicação entre `cliente` e `servidor` é feita a partir da implementação de outro protocolo conhecido como `request-response`.

## Requisitando informações do servidor

Um `request` ou `requisição` é uma mensagem enviada pelo cliente para um servidor em busca de um recurso específico.

A requisição é formada de várias informações para que o servidor consiga entender a solicitação e assim responder com os dados solicitados. 

Essas informações são conhecidas como: métodos da requisição, corpos da requisição (opcionais), URL ou URI e cabeçalho.

### O que o servidor precisa fazer ? 

Os métodos ou verbos da requisição indicam qual ação o servidor deve realizar para responder adequadamente. E estes são os métodos utilizados: 

- **GET:** solicita a recuperação de informações do recurso especificado pela **URL** no servidor;

- **HEAD:** semelhante ao **GET**, mas solicita apenas os cabeçalhos da resposta, sem o corpo da mensagem;

- **POST:** envia dados ao servidor para criar um novo recurso;

- **PUT:** envia dados ao servidor para atualizar ou substituir um recurso já existente na URL especificada;

- **DELETE:** solicita a exclusão permanente de um recurso específico no servidor;

- **CONNECT:** estabelece uma conexão de túnel com o servidor;

- **OPTIONS:** obtém as opções de comunicação permitidas para um recurso específico no servidor;

- **TRACE:** usado para diagnosticar problemas de rede;

- **PATCH:** envia apenas as alterações para que modificações parciais sejam aplicadas no recurso;

Falarei um pouco mais sobre cada um dos métodos HTTP em outro post sobre **APIs** :dizzy: :rocket:.

### Enviando informações para o servidor

Apesar de ser opcional, o corpo da requisição é bem utilizado nos métodos **POST**, **PUT** e **PATCH** e indica as informações adicionais enviadas pelo cliente para recursos específicos no servidor.

Essas informações podem ser enviadas como texto, JSON, XML e até mesmo binários. Tanto o formato quanto a estrutura a serem enviados dependem do tipo de conteúdo e do acordo entre cliente e servidor.

Para indicar o formato do corpo na requisição, podemos incluir no cabeçalho o seguinte valor:  `Content-Type`.

Por exemplo:
`Content-Type: application/json`

Nesses exemplos, estamos indicando que o corpo da requisição será no formato **JSON**.

### Iguais, mas diferentes: URL e URI

![same_but_different](https://media.tenor.com/tm4JV1Qs15AAAAAC/the-interview-james-franco.gif)

O destino de uma requisição **HTTP** é chamado de **recurso**, e estes podem ser identificados como **URIs** ou **URLs**.

O termo **URI** ou **Uniform Resource Identifier** engloba as **URLs** e é definido como uma sequência única de caracteres que identifica um recurso lógico ou físico, podendo ser usado para identificar qualquer coisa.

Por exemplo:

`https://www.exemplo.com.br/recurso?parametro=valor`

Vale lembrar que a estrutura das **URIs** pode variar dependendo do contexto.

Por sua vez, uma **URL** ou **Uniform Resource Locator** é uma forma específica de **URI** para referenciar um recurso de maneira precisa, contendo as informações necessárias para localização e recuperação na rede.

Por exemplo:

`https://meu-site-exemplo.com.br/index.html`

Como podemos ver, a URL possui o protocolo, domínio e caminho do recurso específico.

## Conhecendo o HTTP header

> Assim como a armadura do Homem de Ferro, os cabeçalhos HTTP possuem diferentes módulos e funcionalidades, pois ambos são componentes vitais que permitem a comunicação e fornecem recursos específicos.

![Iron Man with his Modular Armor](https://qph.cf2.quoracdn.net/main-qimg-4e394f8859704027beff50abe8d70b18)

Um dos componentes essenciais para as solicitações e respostas do protocolo HTTP são os cabeçalhos ou Headers.

Projetado para ter várias responsabilidades e conter diversas informações relacionadas a diferentes aspectos da comunicação 'client-server', os cabeçalhos têm como característica principal a extensibilidade, que permite definir novos cabeçalhos para atender os novos requisitos. 

Aqui tem uma listinha de algumas responsabilidades que um cabeçalho pode ter:
1.  Controle de cache.
2.  Autenticação e segurança.
3.  Negociação de conteúdo.
4.  Controle de redirecionamento.
5.  Controle de codificação.
6.  Controle de conexão.
7.  Controle de tipo de conteúdo.
8.  Controle de compressão.
9.  Controle de acesso.
10.  Rastreamento e análise.

Além dos citados acima, também temos muitos outros disponíveis e cada um com sua função específica para que a comunicação seja eficiente e segura.

## Respondendo a requisição do cliente

> Anotações breves sobre respostas HTTP e seus principais elementos.

A resposta HTTP é enviada pelo servidor para o cliente, assim completando o ciclo `request-response` proposto pelo protocolo **HTTP**.

Assim como as requisições, as respostas também podem adicionar cabeçalhos, como `Content-Type`, `Last-Modified` e muitos outros.

Além dos cabeçalhos, temos outro componente muito importante: o **`status code`**.

O `status code` possui cinco classes:

-   1xx - Informativa
-   2xx - Sucesso
-   3xx - Redirecionamento
-   4xx - Erro do lado do cliente
-   5xx - Erro do lado do servidor

O `status code` permite que o servidor se comunique com o cliente de forma padronizada sobre o resultado da requisição. Também indica se a requisição foi bem-sucedida, se ocorreu algum problema ou se são necessárias ações adicionais. Portanto, o `status code` torna-se uma ferramenta importante para o tratamento de erros e permite que o cliente identifique e lide com diferentes situações de falha de forma apropriada.

## Alô, quem tá falando ?

O DNS ou Domain Name System é um sistema de nomenclatura, funciona de forma hierárquica e distribuída para qualquer recurso na internet ou em outras redes. 

Sua responsabilidade é converter nomes de domínios legíveis para humanos ([www.exemplo.com.br](http://www.exemplo.com.br/)) em endereços IP (192.168.0.2), que são legíveis para máquinas.

## Construindo um ambiente seguro

> Precisamos de mais segurança na hora de enviar informações entre o `cliente` e `servidor`

Com o crescimento da internet e o aumento das transações online, tornou-se evidente que a segurança era uma questão vital. Houve a necessidade de proteger informações sensíveis, como senhas, informações bancárias e outros detalhes pessoais, durante a conversa entre os clientes e os servidores. E para atender a essa demanda, o **HTTPS** surgiu.

O **HTTPS** utiliza uma camada de segurança que realiza a criptografia dos dados transmitidos através dos protocolos **SSL** ou **TLS**, tornando os dados ilegíveis para quem tenta interceptá-los.

Além dessa camada de segurança, o **HTTPS** possui um mecanismo de autenticação para verificar a fidelidade do servidor, evitando ataques como: phishing, man-in-the-middle, injeção de conteúdos maliciosos e outros.

## Todo pokémon evolui

> Um pouquinho sobre as versões do HTTP ao longo do tempo: `HTTP/1.1`, `HTTP/2` e `HTTP/3`

O **HTTP** recebeu sua primeira revisão e foi nomeado como **HTTP/1.1**.

O **HTTP/1.1** foi pensado como um protocolo em que as mensagens são enviadas no formato de texto e também introduziu diversas funcionalidades, como conexões persistentes, pipelining, chunked transfer encoding e cabeçalho do host.

Mesmo com todas as inovações apresentadas pelo **HTTP/1.1**, com o passar do tempo surgiram novas necessidades e então o **HTTP/2** apareceu.

Esta versão foi desenvolvida pensando em melhorar a performance da web e superar as limitações de sua versão anterior. Com isso, o novo protocolo **HTTP** introduziu o formato binário, a multiplexação, o server push, compressão de headers e a priorização de requisições.

O **HTTP/2** apresentou uma melhoria muito significativa em relação à versão anterior e foi amplamente adotado por servidores e navegadores.

Contudo, uma nova versão foi apresentada ao mundo: o **HTTP/3**, originalmente chamado de **HTTP-over-QUIC**. Esta versão possui redução de latência, priorização de stream e multiplexação, melhorias em segurança e também foi construída para lidar com a mudança de rede de forma eficiente e permitir rápida adaptação a diferentes condições de rede.

### QUIC, quem é esse pokémon ?

Você deve ter notado que no nome original do **HTTP/3** uma nova palavrinha foi introduzida, o **QUIC**.

Desenvolvido pelo Google em 2012, o QUIC foi projetado para uso pesado da internet móvel, no qual as pessoas carregam smartphones que mudam constantemente de uma rede para outra à medida que se movem durante o dia. Assim, o QUIC depende do protocolo UDP e não do TCP. Essa dependência faz com que as conexões sejam mais rápidas, resultando em uma experiência melhor para o usuário final.

## No fim do dia...

Aprendi a importância do HTTP e como ele impacta a internet.

Também achei várias coisinhas interessantes no meio do caminho, principalmente sobre headers, versões do HTTP, segurança, sessions, cookies e criptografia. Planejo escrever sobre alguns destes assuntos no futuro também.

Espero que te ajude ou pelo menos estimule você a procurar mais sobre o HTTP e assuntos ligados a ele. 


![bob esponja saindo de fininho](https://jellynotjam.files.wordpress.com/2018/05/de4d0147111d879b4fbdaf1b7b529d8c.gif)

Me siga no [Twitter](https://twitter.com/uminocelo), [Github](https://github.com/uminocelo) ou [LinkedIn](https://www.linkedin.com/in/marcelo-muniz-da-luz/) para acompanhar minhas aventuras no mundo tech :dizzy:.

_p.s: todo feedback é bem vindo!_