Referencia HTTP¶
Estado verificado al 28 de marzo de 2026. Nota de runtime: FastFN resuelve dependencias y build por función según el runtime: Python usa
requirements.txt, Node usapackage.json, PHP instala desdecomposer.jsoncuando existe, y Rust compila handlers concargo. Enfastfn dev --nativenecesitas runtimes y herramientas del host;fastfn devdepende de un daemon de Docker activo. Referencia formal de endpoints publicos e internos.
Vista rápida¶
- Complejidad: Referencia
- Tiempo típico: 15-30 minutos
- Úsala cuando: necesitas contrato exacto de endpoints y comportamiento por código de estado
- Resultado: llamadas reproducibles para rutas públicas y operaciones
/_fn/*
Convenciones¶
- Base URL local:
http://127.0.0.1:8080 - Formato de error comun:
Endpoints publicos¶
FastFN sirve funciones en rutas normales como /hello y /users/123.
Estas rutas son las que ves en:
GET /openapi.jsonGET /docs(Swagger UI)
GET|POST|PUT|PATCH|DELETE /<ruta>¶
Invoca la funcion mapeada detras de esa ruta.
Las rutas se generan desde:
- file routes (estilo Next.js),
fn.routes.json,- o
fn.config.json -> invoke.routes.
Ejemplo GET¶
Ejemplo POST¶
curl -sS -X POST 'http://127.0.0.1:8080/risk-score?email=user@example.com' \
-H 'Content-Type: application/json' \
-d '{"source":"web"}'
Versionado (opcional)¶
FastFN soporta versiones lado-a-lado dentro de la carpeta de una función (por ejemplo v2/).
GET|POST|PUT|PATCH|DELETE /<name>@<version>¶
Invoca una versión específica por nombre.
Regla clave (aplica a todas):
- Los metodos permitidos salen de
fn.config.json -> invoke.methods. - Si el metodo no esta permitido:
405+ headerAllow.
Rutas custom via invoke.routes¶
Por defecto, una función en functions/mi-func/handler.py es accesible en /mi-func. Con invoke.routes puedes exponerla en una o más URLs públicas personalizadas — útil para APIs REST, rutas vanity, o montar una función en un prefijo específico.
routeses un array de rutas URL. Cada ruta se convierte en un endpoint público que invoca esta función.- Se soportan rutas wildcard:
"/api/v1/*"matchea/api/v1/cualquier/cosa. methodsrestringe qué métodos HTTP están permitidos (default: todos).- Después del discovery (inicio o hot-reload), el gateway registra estas rutas automáticamente.
- Si otra función ya mapea la misma ruta, la petición es rechazada a menos que
invoke.force-urlseatrue.
Debug headers (opt-in)¶
Cuando una función habilita debug headers, la respuesta puede incluir:
X-Fn-RuntimeX-Fn-Runtime-RoutingX-Fn-Runtime-Socket-IndexX-Fn-Worker-Pool-Max-WorkersX-Fn-Worker-Pool-Max-Queue
Sirven para confirmar qué runtime manejó la request y si el tráfico está rotando entre varios sockets.
Configuración de operaciones (equivalencias en FastFN)¶
FastFN no usa objetos de operación por decoradores como FastAPI. La configuración vive entre rutas por archivo y fn.config.json.
| Concepto estilo FastAPI | Equivalente en FastFN | Notas |
|---|---|---|
| método/path de operación | nombre de archivo + carpeta | la fuente de verdad es filesystem o fn.routes.json |
| métodos permitidos | invoke.methods |
gateway aplica regla y devuelve 405 + Allow |
| summary | invoke.summary o hint @summary |
se refleja en OpenAPI |
| ejemplos query/body | invoke.query, invoke.body, invoke.content_type |
usados en ejemplos de request OpenAPI |
| operationId | generado automáticamente | formato: <method>_<runtime>_<name>_<version> |
| tags | generadas (functions / internal) |
sin mapeo custom por ruta por ahora |
Nota no-1:1: si necesitas customización OpenAPI profunda por operación, usa FastFN como router runtime y aplica transformaciones de schema en tu pipeline de entrega.
Endpoints internos de plataforma (/_fn/*)¶
Salud y discovery¶
GET /_fn/healthPOST /_fn/reloadGET /_fn/catalogGET /_fn/packsGET /_fn/schedulesGET /_fn/jobsPOST /_fn/jobsGET /_fn/jobs/<id>DELETE /_fn/jobs/<id>GET /_fn/jobs/<id>/result
GET /_fn/health¶
Devuelve un snapshot del estado actual de runtimes y rutas.
Ejemplo:
Forma simplificada:
{
"python": {
"routing": "round_robin",
"health": { "up": true, "reason": "ok" },
"sockets": [
{ "index": 1, "uri": "unix:/tmp/fastfn/fn-python-1.sock", "up": true, "reason": "ok" },
{ "index": 2, "uri": "unix:/tmp/fastfn/fn-python-2.sock", "up": true, "reason": "ok" }
]
}
}
Sirve para confirmar:
- runtimes habilitados
- modo de routing (
singleoround_robin) - salud por socket
- cantidad de conflictos de rutas y resumen de estado de funciones
CRUD y configuracion¶
GET|POST|DELETE /_fn/functionGET|PUT /_fn/function-configGET|PUT /_fn/function-envPUT /_fn/function-code
Operacion de consola¶
POST /_fn/invokePOST /_fn/loginPOST /_fn/logoutGET|POST|PUT|PATCH|DELETE /_fn/ui-state
Reglas de /_fn/ui-state:
GETrequiere acceso a Console API.POST|PUT|PATCH|DELETErequieren acceso a Console API y permiso de escritura (FN_CONSOLE_WRITE_ENABLED=1o token admin).
/_fn/function-config PUT acepta campos de rutas y metodos tanto a nivel raiz como anidados:
Equivalente a la forma anidada:
{
"timeout_ms": 5000,
"invoke": {
"methods": ["GET", "POST"],
"routes": ["/alice/demo", "/alice/demo/{id}"]
}
}
Cuando ambos estan presentes, invoke.* tiene precedencia.
El payload de /_fn/function-env acepta:
- valores escalares:
"KEY":"value" - objetos secretos:
"KEY":{"value":"secret","is_secret":true} nullpara eliminar una clave
GET /_fn/function tambien puede devolver metadata de resolucion de dependencias cuando el runtime la emite (hoy sobre todo Python/Node):
metadata.dependency_resolution.mode(manifestoinferred)metadata.dependency_resolution.manifest_generatedmetadata.dependency_resolution.infer_backendmetadata.dependency_resolution.inference_duration_msmetadata.dependency_resolution.inferred_importsmetadata.dependency_resolution.resolved_packagesmetadata.dependency_resolution.unresolved_importsmetadata.dependency_resolution.last_install_status/last_error
/_fn/invoke (payload completo)¶
curl -sS 'http://127.0.0.1:8080/_fn/invoke' \
-X POST \
-H 'Content-Type: application/json' \
--data '{
"runtime":"node",
"name":"node-echo",
"version":null,
"method":"POST",
"query":{"name":"Node"},
"body":"{\"x\":1}",
"context":{"trace_id":"abc-123"}
}'
Campos:
runtimeopcional cuando nombre no es ambiguo- valores soportados:
python,node,php,rust nameobligatorioversionopcional (nullpara default)methodobligatorioqueryobjeto opcionalbodystring o JSON serializablecontextobjeto opcional inyectado aevent.context.user
OpenAPI y Swagger¶
GET /openapi.jsonGET /docs
OpenAPI es dinamico y refleja metodos permitidos por funcion/version en tiempo real.
Casos límite de serialización y encoding¶
FastFN normaliza salida de runtime a HTTP, pero el comportamiento de serialización depende del tipo de body y headers.
| Body devuelto por runtime | Estrategia de headers | Resultado en cliente |
|---|---|---|
| objeto/array | sin Content-Type explícito |
serialización JSON con application/json |
| string | sin Content-Type explícito |
salida como texto plano |
| string con JSON | application/json |
se envía como texto; cliente parsea si necesita |
| string binario/base64 | content type explícito + decode en handler | patrón seguro para binarios |
Patrón recomendado para comportamiento determinista:
{
"status": 200,
"headers": { "Content-Type": "application/json; charset=utf-8" },
"body": { "ok": true }
}
Tabla de errores¶
| Codigo | Significado | Caso tipico |
|---|---|---|
404 |
funcion/version no encontrada | nombre o version inexistente |
405 |
metodo no permitido | POST a funcion solo GET |
409 |
ambiguedad de ruta | mismo nombre en runtimes distintos o misma ruta mapeada en multiples funciones |
413 |
payload demasiado grande | body > max_body_bytes |
429 |
concurrencia excedida | supera max_concurrency |
502 |
respuesta runtime invalida | contrato runtime roto |
503 |
runtime caido | socket no disponible |
504 |
timeout | funcion excede timeout_ms |
500 |
error interno | excepcion gateway |
Diagrama de Ciclo HTTP¶
flowchart LR
A["Request HTTP"] --> B["Gateway"]
B --> C["Router público/admin interno"]
C --> D["Invocación runtime"]
D --> E["Respuesta HTTP"]
Contrato¶
Define la forma esperada de request/response, campos de configuración y garantías de comportamiento.
Ejemplo End-to-End¶
Usa los ejemplos de esta página como plantillas canónicas para implementación y testing.
Casos Límite¶
- Fallbacks ante configuración faltante
- Conflictos de rutas y precedencia
- Matices por runtime
Ver también¶
Extender OpenAPI: puntos y limites¶
Puntos de extension:
- metadata de ruta inferida por file routing + archivos por metodo
- ejemplos explicitos en docs alineados al runtime real
- agrupacion por tags/operaciones via convenciones de nombres
Limites:
- OpenAPI debe reflejar comportamiento real; no documentar estados que handlers no devuelven.
- La generacion avanzada de schemas cambia segun runtime.
Comando de validacion:
Validación¶
Ejecuta este smoke sequence:
curl -i -sS 'http://127.0.0.1:8080/_fn/health'
curl -sS 'http://127.0.0.1:8080/_fn/catalog' | jq '{mapped_routes, mapped_route_conflicts}'
curl -sS 'http://127.0.0.1:8080/openapi.json' | jq '.paths | keys | length'
Esperado:
- health responde
200 - catálogo devuelve rutas y conflictos de forma determinística
- OpenAPI tiene paths > 0 para proyectos con rutas públicas
Troubleshooting¶
- Si
/_fn/*responde401/403, revisa token admin y flags de acceso a consola. - Si OpenAPI sale vacío, verifica que exista al menos una ruta pública discoverable.
- Si una ruta devuelve
405, validainvoke.methodsenfn.config.json. - Si una ruta devuelve
503, revisa salud de sockets/runtime en/_fn/health.
Siguiente paso¶
Continúa con Ejecutar y probar para validar este contrato de punta a punta en local/CI.
Enlaces relacionados¶
- Ejecutar y probar
- Zero-config routing
- Plomería runtime/plataforma
- Especificación de funciones
- Contrato runtime
- Funciones de ejemplo
- Arquitectura
- Obtener ayuda