HTTP e a Web
Video da aula estara disponivel em breve
HTTP: o protocolo da Web
HTTP (HyperText Transfer Protocol) e o protocolo de camada de aplicacao que sustenta a World Wide Web. Ele define como clientes (navegadores) e servidores trocam mensagens. HTTP e um protocolo request-response: o cliente envia um request, o servidor responde.
Anatomia de um request HTTP
GET /api/users/42 HTTP/1.1 <-- Linha de request (metodo, path, versao)
Host: api.example.com <-- Header obrigatorio em HTTP/1.1
Accept: application/json <-- Tipo de resposta aceito
Authorization: Bearer eyJ... <-- Autenticacao
User-Agent: python-requests/2.31 <-- Identificacao do cliente
Connection: keep-alive <-- Manter conexao TCP aberta
<-- Linha em branco (separa headers do body)
<-- Body (vazio em GET)
Anatomia de uma resposta HTTP
HTTP/1.1 200 OK <-- Linha de status (versao, codigo, texto)
Content-Type: application/json <-- Tipo do conteudo
Content-Length: 127 <-- Tamanho do body em bytes
Cache-Control: max-age=3600 <-- Politica de cache
Date: Thu, 08 May 2026 12:00:00 GMT
<-- Linha em branco
{"id": 42, "name": "Marco"} <-- Body (payload)
Metodos HTTP
Metodo Semantica Idempotente? Body?
────── ────────────────── ──────────── ─────
GET Buscar recurso Sim Nao
POST Criar recurso Nao Sim
PUT Substituir recurso Sim Sim
PATCH Atualizar parcial Nao Sim
DELETE Remover recurso Sim Opcional
HEAD GET sem body Sim Nao
OPTIONS Capacidades Sim Opcional
Codigos de status
Faixa Significado Exemplos
───── ────────────────── ────────────────────────
1xx Informativo 100 Continue
2xx Sucesso 200 OK, 201 Created, 204 No Content
3xx Redirecionamento 301 Moved Permanently, 304 Not Modified
4xx Erro do cliente 400 Bad Request, 401 Unauthorized, 404 Not Found
5xx Erro do servidor 500 Internal Server Error, 503 Service Unavailable
Evolucao do HTTP
HTTP/1.1 (1997)
Conexoes persistentes (keep-alive), pipelining (enviar multiplos requests sem esperar resposta — pouco usado na pratica devido ao head-of-line blocking).
HTTP/2 (2015)
Framing binario, multiplexacao (multiplos requests na mesma conexao TCP sem bloquear), compressao de headers (HPACK), server push.
HTTP/1.1: HTTP/2:
Req1 ------> Req1 --\
<------ Res1 Req2 ---+---> Multiplexado
Req2 ------> Req3 --/ na mesma conexao TCP
<------ Res2 <--- Res2
Req3 ------> <--- Res1
<------ Res3 <--- Res3
(sequencial) (paralelo, sem HOL blocking na camada HTTP)
HTTP/3 (2022)
Usa QUIC em vez de TCP. QUIC roda sobre UDP e implementa sua propria confiabilidade. Elimina o head-of-line blocking na camada de transporte. Handshake mais rapido (0-RTT em reconexoes).
REST: principios de design de APIs
REST (Representational State Transfer) nao e um protocolo — e um estilo arquitetural para APIs HTTP. Principios:
- Recursos identificados por URIs:
/users/42,/projects/build-ai/sessions - Metodos HTTP para operacoes: GET (ler), POST (criar), PUT (substituir), DELETE (remover)
- Stateless: cada request contem toda a informacao necessaria
- Representacoes: o mesmo recurso pode ser JSON, XML, HTML
import requests
# GET — buscar recurso
r = requests.get("https://api.github.com/repos/python/cpython")
print(r.status_code) # 200
print(r.headers["content-type"]) # application/json; charset=utf-8
print(r.json()["full_name"]) # python/cpython
# POST — criar recurso (exemplo ficticio)
r = requests.post(
"https://api.example.com/sessions",
json={"project_slug": "build-ai", "agent": "claude"},
headers={"Authorization": "Bearer token123"}
)
print(r.status_code) # 201 Created
# Inspecionando headers da resposta
for key, value in r.headers.items():
print(f" {key}: {value}")
Servidor HTTP simples em Python
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class SimpleAPI(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/health":
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.end_headers()
self.wfile.write(json.dumps({"status": "ok"}).encode())
else:
self.send_response(404)
self.end_headers()
server = HTTPServer(("", 8080), SimpleAPI)
print("Servidor rodando em http://localhost:8080")
server.serve_forever()
No harness.os
O MCP (Model Context Protocol) usa HTTP como transporte para comunicacao remota. Quando um MCP server roda em modo remoto (nao stdio), ele expoe endpoints HTTP com Server-Sent Events (SSE) para streaming.
MCP Tool Call via HTTP/SSE:
Claude CLI ----HTTP POST----> MCP Server (Fly.io)
| |
| POST /mcp/v1/tools/call | Processa tool call
| Content-Type: application/json| Consulta Neon DB
| {"tool": "get_knowledge", |
| "args": {"domain": "build"}}|
| |
| <----SSE Stream--------- |
| event: result |
| data: {"knowledge": [...]} |
| |
| event: done |
| data: {} |
Entender HTTP profundamente = entender como seus MCP tools
se comunicam quando deployados remotamente.
Resumo
- HTTP e request-response: cliente envia request, servidor responde
- Metodos (GET, POST, PUT, DELETE) definem a semantica da operacao
- Status codes comunicam o resultado (2xx sucesso, 4xx erro cliente, 5xx erro servidor)
- HTTP/1.1 (persistente), HTTP/2 (multiplexado), HTTP/3 (QUIC/UDP)
- REST e um estilo arquitetural, nao um protocolo
Exercicio pratico
Trace uma chamada MCP tool call pelo layer HTTP.
- Use
curl -vpara inspecionar headers de um request HTTP real - Identifique: metodo, path, headers enviados, status code, headers de resposta
- Descreva como um MCP tool call seria representado como HTTP request (metodo, path, body)
- Mostre como a resposta SSE seria formatada (event stream)
Verifique seu entendimento
Qual a principal vantagem do HTTP/2 sobre o HTTP/1.1?