Descargar

Internet: Http

Http hace peticiones a servidores web (HTTP y HTTPS): consultar APIs, descargar archivos o enviar datos. En Windows usa el sistema (WinHTTP); en Linux y macOS, la orden curl.

Pedir datos

var r = Http.get("https://example.com")
print(r.status, r.ok, r.body.length, r.headers["content-type"])

var repo = Http.getJson("https://api.github.com/repos/microsoft/vscode")
print(repo.full_name, repo.stargazers_count)

get, post y request devuelven {status, ok, body, headers}; ok es true si el código está entre 200 y 299. getJson y postJson devuelven directamente los datos convertidos (y lanzan un error si el servidor responde con un código de error).

Enviar datos

// un mapa o una lista se envía como JSON automáticamente
var respuesta = Http.postJson("https://httpbin.org/post", { jugador: "Ana", puntos: 120 })

// cabeceras y tiempo máximo de espera
var r = Http.get("https://api.ejemplo.com/datos", {
    headers: { Authorization: "Bearer MI_CLAVE" },
    timeout: 10,
})

// cualquier método
Http.request("DELETE", "https://api.ejemplo.com/partidas/7")

Descargar archivos

var bytes = Http.download("https://example.com/imagen.png", "descargas/imagen.png")
print("Descargados", bytes, "bytes")

Construir direcciones

print("https://www.google.com/search?" + Http.query({ q: "lenguaje HyperEZ", hl: "es" }))
print(Http.encode("ñandú & café"))
▶ Probar en el editor

Errores de red

Sin conexión, con una dirección mal escrita o si el servidor no responde, Http lanza un error con un mensaje claro. Captúralo con try para que el programa siga:

try {
    Http.get("https://servidor-que-no-existe.invalid", { timeout: 5 })
} catch e {
    print("Sin conexión:", e.message.length > 0)
}
▶ Probar en el editor

Ejemplo: usar una API de inteligencia artificial

Muchas APIs de IA reciben y devuelven JSON por HTTPS, así que se usan directamente con Http.postJson. Guarda la clave en una variable de entorno, nunca en el código:

var clave = System.env("MI_API_KEY")
var r = Http.postJson("https://api.ejemplo-ia.com/v1/chat", {
    model: "modelo",
    messages: [{ role: "user", content: "Escribe un haiku sobre HyperEZ" }],
}, { headers: { Authorization: "Bearer " + clave } })
print(r)

El ejemplo examples/red/api_web.hz consulta servicios web reales y funciona también sin conexión.