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.

Status code

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

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

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.

Last updated