> For the complete documentation index, see [llms.txt](https://web101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://web101.leandronsp.com/construindo-um-simples-echo-web-server/entendendo-o-http.md).

# Entendendo o HTTP

Primeiro, vamos entender o formato da mensagem HTTP. Basicamente, existem 2 tipos de mensagens neste protocolo:

* **Request**, que representa a mensagem enviada do cliente para o servidor
* **Response**, que representa a mensagem, ou resposta, enviada do servidor para o cliente

### Request

A seguir descrevemos o formato padrão de uma mensagem HTTP Request:

```
GET /index.html HTTP/1.1
Content-Type: plain/text

PING
```

1. a primeira linha, conhecida como headline, define o método ou verbo, em seguida o caminho para o recurso, e por último a versão do protocolo.
2. (opcional) a segunda linha define o cabeçalho, ou header. Os headers no HTTP são opcionais e representam metadados que podem ser lidos tanto pelo server quanto pelo client.
3. a terceira linha é uma linha em branco, mandatória para separação entre headers e payload
4. (opcional) a última linha refere-se ao payload, ou body, que representa o conteúdo principal a ser enviado na mensagem HTTP. O body é opcional.

### Response

E agora demonstramos o formato do HTTP Response:

```
HTTP/1.1 200
Content-Type: plain/text
Content-Length: 4

PONG
```

1. a primeira linha, conhecida como headline, define o versão, seguida do status code, que representa um código de sucesso ou falha.
2. (opcional) a segunda linha define o cabeçalho, ou header. Os headers no HTTP são opcionais e representam metadados que podem ser lidos tanto pelo server quanto pelo client.
3. a terceira linha é uma linha em branco, mandatória para separação entre headers e payload
4. (opcional) a última linha refere-se ao payload, ou body, que representa o conteúdo principal a ser enviado na mensagem HTTP. O body é opcional.

Vamos agora entender mais alguns conceitos do HTTP.

### Versão

A versão do protocolo vai depender em como o server e client suportam, mas a primeira versão de 1989 era **HTTP/0.9.**

Anos mais tarde, o protocolo foi sofrendo melhorias, subindo para a versão **1.0**.

Em 1997 foi lançada a versão **HTTP/1.1** com diversas melhorias, o que predominou em todos os web browsers até 2015.

A versão **HTTP/2** é publicada em 2015 com suporte a uma web mais semântica, e hoje é utilizada em 45% dos websites e suportada por 96% dos web browsers.

Então em 2022 é publicada a versão **HTTP/3**, que traz notórias mudanças, dentre elas a utilização de outro protocolo de transporte, o **QUIC**, lançado em 2012 e que utiliza UDP com uma implementação de conexão leve e tem menos latência que TCP. HTTP/3 é utilizado por 24% dos websites.

Em testes de performance, HTTP/3 se mostrou mais rápido que HTTP/2 e até 3x mais rápido que HTTP/1.1.

Para fins didáticos neste guia, vamos utilizar **HTTP/1.1**, pois ainda assim é utilizado por mais de 80% dos websites.&#x20;

### Status code

Status code é um indicativo de sucesso, falha no servidor ou até mesmo falha na mensagem do cliente.&#x20;

Operações de sucesso costumam ficar na família **200, ou 2xx** de status codes.

Se o servidor não conseguir interpretar a mensagem do cliente por algum motivo ou validação de dados, é caracterizado um *erro de cliente*, ou **client error**. Client errors costumam ficar na família **400, ou 4xx** de status codes.

Se o servidor não conseguir processar a resposta por algum erro interno, seja o erro esperado ou não, é caracterizado um **server error**. Server errors costumam ficar na família **500, ou 5xx** de status codes.

Há também outra família de status codes, que é a **300 ou 3xx,** que indica que o aquele caminho específico não tem o recurso mas que o recurso foi modificado/redirecionado para outro caminho no servidor.

### Body&#x20;

O corpo da mensagem é o conteúdo principal. No HTTP, pode ser desde um simples texto, a um hypertexto, um arquivo PDF, uma imagem, JSON, XML etc, qualquer formato de conteúdo, desde que especificado nos metadados (headers) da mensagem.

Ou seja, embora foi concebido para, o conteúdo do HTTP não precisa ser necessariamente hypertexto (HTML).

### **HTTP headers**

O HTTP é um protocolo bastante versátil, e não à toa, se tornou o padrão para a Web. Esta versatilidade não seria possível sem o uso de metadados, ou headers, para que servidor e cliente possam trocar informação necessária sobre tipo do conteúdo, tamanho, regras de segurança, cache de dados entre outras informações extremamente relevantes.
