codex/web/httpx_requests.cat
# Requêtes HTTP avec httpx
# httpx est un client HTTP moderne (sync/async, HTTP/2)
#
# Services HTTP echo interchangeables (même API) :
# - https://httpbin.org (original, parfois instable)
# - https://httpbin.dev (clone fiable)
# - https://httpcan.org (clone Rust)
#
# Exécuter:
# catnip docs/codex/web/httpx_requests.cat
httpx = import("httpx")
json = import("json")
# Service de test (changer ici si besoin)
BASE_URL = "https://httpbin.dev"
# GET simple
print("⇒ GET request")
response = httpx.get(f"{BASE_URL}/get")
print(" Status:", response.status_code)
print(" Content-Type:", response.headers["content-type"])
# Parsing JSON de la réponse
print("\n⇒ Parsing JSON")
data = response.json()
print(" Origin IP:", data["origin"])
print(" URL:", data["url"])
# GET avec paramètres
print("\n⇒ GET avec paramètres")
params = dict(name = "catnip", version = "0.1")
response = httpx.get(f"{BASE_URL}/get", params = params)
data = response.json()
print(" Args reçus:", data["args"])
# GET avec headers
print("\n⇒ GET avec headers custom")
headers = dict(("X-Custom-Header", "catnip-test"), Accept = "application/json")
response = httpx.get(f"{BASE_URL}/headers", headers = headers)
data = response.json()
print(" Headers envoyés:")
for key in data["headers"].keys() {
if key.startswith("X-") {
print(" ", key, ":", data["headers"][key])
}
}
# POST avec JSON
print("\n⇒ POST JSON")
payload = dict(message = "Hello from Catnip", count = 42)
response = httpx.post(f"{BASE_URL}/post", json = payload)
data = response.json()
print(" JSON envoyé:", data["json"])
# POST form data
print("\n⇒ POST form data")
form_data = dict(username = "alice", password = "secret123")
response = httpx.post(f"{BASE_URL}/post", data = form_data)
data = response.json()
print(" Form data:", data["form"])
# Accès aux bytes bruts
print("\n⇒ Réponse en bytes")
response = httpx.get(f"{BASE_URL}/bytes/16")
print(" Bytes reçus:", len(response.content), "octets")
print(" Raw:", response.content)
# Gestion des erreurs HTTP
print("\n⇒ Gestion erreurs")
response = httpx.get(f"{BASE_URL}/status/404")
print(" Status 404:", response.status_code)
print(" Is error:", response.status_code >= 400)
# Timeout
print("\n⇒ Timeout")
response = httpx.get(f"{BASE_URL}/delay/1", timeout = 5.0)
print(" Requête avec délai: OK (status", response.status_code, ")")
print("\n⇒ Terminé")