Protocolo HTTP
O protocolo HTTP é a base da troca de dados na Web, sendo responsável por transmitir documentos de hipertexto - como o HTML -, imagens, vídeos e resultados de formulários entre cliente e servidor.
O HTTP é um protocolo stateless (comunicação feita por meio de mensagens individuais) cliente-servidor que segue o seguinte modelo de comunicação: um cliente (geralmente o browser) abre uma conexão por meio de uma requisição feita ao servidor, que recebe a requisição e envia uma resposta ao cliente. Entretanto, entre o navegador que faz a requisição e o servidor que envia a resposta existem vários dispositivos tratando e retransmitindo a mensagem (roteadores, modems, computadores e outras máquinas).

Etapas de comunicação - Fluxo HTTP

Conforme dito anteriormente, a comunicação entre cliente e servidor ocorre por meio de mensagens individuais. Porém, quando um cliente quer comunicar-se com um servidor ele realiza os seguintes passos: 1. Abrir uma conexão TCP: essa conexão é utilizada para enviar uma ou várias requisições e receber respostas.
  1. 1.
    Enviar uma mensagem HTTP: um detalhe importantíssimo do protocolo HTTP é que essa mensagem não é criptografada, ou seja, ela pode ser lida por qualquer um que esteja monitorando o fluxo de pacotes da rede. A mensagem segue esse padrão:
  1. 1.
    Ler a mensagem de resposta do servidor: após enviar uma requisição, se não houver problemas, o servidor enviará uma resposta. Essa resposta também não é criptografada e segue esse padrão:
  1. 1.
    Fechar ou reutilizar a conexão TCP que foi aberta.

Requisições

Conforme mostrado nas duas últimas imagens, as requisições e as respostas são compostas de certos elementos.
Os elementos das requisições são:
  • Método HTTP: operação que o cliente deseja fazer;
  • O caminho do recurso a ser buscado: em outras palavras, a parte da URL que vem após o ".com", ".br", ".org" etc. (ou seja, a URL sem os elementos de contexto*), indicando a localização do recurso no servidor;
  • A versão do protocolo HTTP;
  • Headers opcionais: são cabeçalhos que contém informações adicionais para os servidores, como cookies, data, linguagem aceita, tamanho da requisição e outros. Headers padrões podem ser encontrados aqui;
  • Corpo de dados: contém recursos requisitados (ou enviados). Normalmente, eles vêm em respostas, mas também se fazem presentes, geralmente, em requisições do tipo POST por exemplo.
E os elementos das respostas são:
  • Versão do protocolo HTTP utilizada pelo servidor;
  • Código de status: indica se a requisição foi bem sucedidade ou não (e o porquê);
  • Mensagem de status: breve descrição do código de status;
  • Headers (cabeçalhos) HTTP: iguais aos da requisição;
  • Corpo com dados do recurso requisitado (se algo foi requisitado).
* Elementos de contexto são coisas como: protocolo (http://), domínios e subdmínios (www.google.com) e a porta da conexão TCP (após a URL pode vir um:80 por exemplo)

Tipos de requisições (métodos HTTP)

As requisições HTTP podem ser de vários tipos, indicando a ação que deve ser realizada com determinado conteúdo. Os principais tipos são GET e POST, mas também há: HEAD, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH e outros.
  • GET é utilizado para requisitar certo conteúdo (normalmente a apresentação desse conteúdo no navegador). Esse método serve para reaver/solicitar dados.
  • POST é utilizado para enviar algum conteúdo para o servidor (como os dados de um formulário preenchido ou uma tentativa de login).
    Obs.: Esses métodos podem ser usados em outros contextos, pois o servidor decide como interpretar as requisições. O servidor pode esperar um POST que simplesmente solicite conteúdo, sem enviar nada para o próprio servidor.

Respostas HTTP (status codes)

Os códigos de status presentes em respostas HTTP (HTTP responses) indicam se a requisição foi realizada com sucesso ou não. Esses códigos são divididos em:
  • Informational responses (100–199),
  • Successful responses (200–299),
  • Redirects (300–399),
  • Client errors (400–499),
  • Server errors (500–599).

Os códigos que mais aparecem são:

  • 200 OK: a requisição foi um sucesso, ou seja, o conteúdo da requisição foi obtido ou transmitido sem erros.
  • 301 Moved Permanently: código de redirecionamento indicando que a recurso solicitado foi movido permanentemente para outro local - indicado no header Location. O browser é redirecionado para lá automaticamente. O código 308 funciona da mesma forma.
  • 302 Found: código de redirecionamento indicando que o conteúdo procurado está temporáriamente em outro local - também indicado no header de resposta Location. O browser é redirecionado para lá automaticamente. O código 307 funciona da mesma forma.
  • 400 Bad Request: erro de sintaxe na requisição, ou seja, o servidor não conseguiu processar bem a requisição.
  • 401 Unauthorized: requisição não autorizada. O cliente precisa se autenticar (ex.: fazer login) para conseguir o acesso ao que foi requisitado.
  • 403 Forbidden: o cliente não pode acessar o conteúdo solicitado, ou seja, ele não está autorizado a ver certa informação (mesmo que autenticado, já que o servidor sabe a identidade do cliente).
  • 404 Not Found: o servidor não encontrou o que foi requisitado - e o conteúdo buscado provavelmente não existe. Em browsers, isso significado que a URL passada não foi reconhecida.
  • 500 Internal Server Error: erro interno do servidor, ou seja, o servidor está com problemas para lidar com certa situação.
  • 502 Bad Gateweay: erro que indicado que o servidor, atuando como gateway (buscando a resposta para retransmitir ao cliente), recebeu uma resposta inválida.
  • 503 Service Unavailable: o servidor não está pronto para processar a requisição. Normalmente, isso indica que o servidor está desligado ou sobrecarregado.