# 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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://web101.leandronsp.com/construindo-um-simples-echo-web-server/entendendo-o-http.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
