--- name: http_get_json kind: function lang: py domain: infra version: "1.0.0" purity: impure signature: "http_get_json(url: str, headers: dict[str, str] | None = None, params: dict[str, str] | None = None, timeout: float = 30.0) -> dict" description: "GET request que espera JSON. Agrega Accept: application/json automaticamente. Lanza RuntimeError si status >= 400 con status code, url truncada y primeros 200 chars del body." tags: [http, json, get, client, network, stdlib, infra, pendiente-usar, extractor] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: ["json", "urllib.error", "urllib.parse", "urllib.request"] params: - name: url desc: "URL base para la solicitud GET" - name: headers desc: "diccionario opcional de headers HTTP personalizados" - name: params desc: "diccionario opcional de parametros de query" - name: timeout desc: "timeout en segundos para la solicitud (defecto 30.0)" output: "diccionario con la respuesta JSON parseada" tested: true tests: - "mock de respuesta 200 con JSON" - "mock de respuesta 404 → error con status code" - "mock de respuesta con JSON invalido → error descriptivo" - "params serializados como query string" - "headers custom enviados" test_file_path: "python/functions/infra/http_get_json_test.py" file_path: "python/functions/infra/http_get_json.py" --- ## Ejemplo ```python data = http_get_json( "https://api.example.com/users", params={"page": "1", "limit": "50"}, headers={"X-Api-Key": "secret"}, ) print(data["total"]) ``` ## Notas Solo usa stdlib (urllib). Sin dependencias externas. El error incluye los primeros 200 chars del body para facilitar debugging en produccion. Params se serializa con urlencode antes de concatenar a la URL.