Como funciona uma requisição HTTP
HTTP é um protocolo baseado em streams de texto. Muito resumidamente, o cliente abre um socket para falar com o servidor e, nesse socket, envia requisições (requests), as quais o servidor responderá com respostas (responses).
O texto da requisição HTTP tem, basicamente, três partes: request line, headers e body. Esse texto é lido linha a linha, sendo que cada linha é separada por CR+LF (carriage return + line feed). (line feed = newline = ‘\n’).
O formato geral é o seguinte:
request line
headers
headers
headers…
body
Repare que o body começa depois da primeira linha em branco.
Apenas a request line é obrigatória.
Request line
O formato da request line é o seguinte:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
(SP = blank space separator)
Method pode ser “GET” (o que geralmente usamos para baixar o HTML das páginas da web), “POST” (o que geralmente usamos para enviar dados de formulários para o servidor), “PUT”, “DELETE” e outros.
Eis um exemplo:
GET http://google.com/ HTTP/1.1
Nesse caso, estamos fazendo um GET em http://google.com/ usando HTTP versão 1.1.
Headers
Ah, os headers são muitos. Alguns exemplos são: Accept-Charset, Accept-Encoding e User-Agent. O formato dos headers é o seguinte:
chave: valor
Exemplo:
Accept-Encoding: gzip, deflate
Body
Não usa-se, normalmente, body nas requisições GET. Ele é mais útil em POSTs e PUTs. (Mas também não é “proibido”…)
Quando você envia os dados de um formulário de uma página HTML, o body da requisição é “encodado” em formato “form-urlencoded”, geralmente. Exemplo:
Headers:
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Body:
search=isso+eh+um+teste&children_filter=1
Mas lembre-se: nem sempre o body é nesse formato. Se você está trabalhando com uma API, por exemplo, o body pode estar, simplesmente, no formato de serialização escolhido. XML, JSON, YAML são alguns exemplos.