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.


Para saber mais…