Ir al contenido

Referencias entre bloques

La expresión {{...}} resuelve en runtime dentro de bloques HTTP, DB y standalone. Esta página es la referencia de sintaxis completa. Para uso estilo how-to, ve Referencia valores entre bloques.

expression = "{{" reference "}}"
reference = alias-ref | env-ref | positional-ref
alias-ref = ALIAS "." FIELD ("." PATH)*
env-ref = KEY # sin puntos
positional-ref = "$prev" ("." PATH)*
FIELD = "body" | "status" | "headers" | "cookies" | "size" | "time"
| "row[" INT "]" | "rows" | "affected"
PATH = IDENTIFIER ("[" INT "]")* | "[" QUOTED "]"
ALIAS = identifier (letras, dígitos, _, -)
KEY = SCREAMING_SNAKE_CASE (convención, no enforced)
FieldTipoFuente
bodyJSON parseado (o fallback de texto)response body HTTP / resultado de query DB
statusnúmeroHTTP status code (DB: siempre 200 en éxito)
headers.<name>stringresponse header HTTP (case-insensitive)
cookies.<name>stringvalor Set-Cookie parseado
sizenúmerobytes del response body
timenúmerototal elapsed en ms
FieldTipoSignificado
row[N]objectn-ésima fila del result set (0-indexed)
rowsarrayarray completo de resultados
rows.lengthnúmerorow count
affectednúmerorow count de INSERT/UPDATE/DELETE

Después de body. o row[N]., drilea con . y [N]:

PathLee desde
body.user.id{ user: { id: 42 } }42
body.items[0].name{ items: [{ name: "x" }] }"x"
body.tags[2]{ tags: ["a", "b", "c"] }"c"
body["odd-key"]bracket-quoted para keys non-identifier
body['single quotes']también soportado

No soportado: wildcards (body[*]), filtros JSONPath (body[?(@.id > 5)]), recursive descent (body..name). Si los necesitas, encadena bloques en su lugar.

$prev resuelve al bloque ejecutado anterior por encima del actual en orden del documento, con la respuesta como root implícito:

EscribesEquivale a
{{$prev.body.id}}{{<previous-alias>.body.id}}
{{$prev.status}}{{<previous-alias>.status}}

Útil para scripts puntuales rápidos. Frágil para runbooks commiteados — reordena bloques y $prev resuelve diferente.

$prev NO aparece en el popover de autocomplete {{ (by design, para desincentivar). Los tooltips de hover sí lo heredan.

Las env refs no tienen puntos — son un lookup flat de string:

{{BASE_URL}} ✓
{{API_TOKEN}} ✓
{{BASE_URL.something}} ✗ — tratado como alias-ref, no env-ref

Si BASE_URL es A LA VEZ una env var Y un alias de bloque, el bloque gana. Ve “Prioridad” abajo.

Block typePosiciónNotas
HTTPURL path + queryEncoded si el valor contiene chars URL-special
HTTPHeader keysDebe resolver a un HTTP token válido (sin espacios)
HTTPHeader valuesCualquier string
HTTPBodyCualquier content type; resuelto antes de send
DBSQL bodyConvertido a bind parameter, no interpolado
StandaloneBlock bodyDepende del standalone block type

Las referencias NO resuelven en:

  • Tokens de info-string (alias=..., timeout=..., etc)
  • Comentarios dentro del body del bloque (líneas # en HTTP)
  • ¿Dentro de líneas # expect:? — SÍ resuelven ahí (así puedes verificar contra el valor de otro bloque)

Al resolver {{X}}:

  1. Alias de bloque — busca un bloque arriba del actual con alias=X. Si lo encuentra, trátalo como alias-ref.
  2. Env var — busca X en el [vars] del entorno activo. Si lo encuentra, trátalo como env-ref.
  3. Error — no encontró ninguno; subraya rojo en el editor, falla con “unknown alias X” en run.

Los aliases de bloque viven en file scope — las referencias solo pueden apuntar a bloques anteriores en el mismo archivo .md. Sin referencias cross-file.

Las env vars viven en vault scope — mismo valor a través de todos los archivos bajo el entorno activo.

Cuando disparas un bloque:

  1. Parsea todas las referencias {{...}} en el body, URL, headers del bloque.
  2. Construye el DAG de dependencias (solo alias-refs — las env-refs son flat).
  3. Para cada alias-ref upstream:
    • Chequea el cache. Si hit, usa la respuesta cacheada.
    • Si miss, ejecuta ese bloque (recursivo — puede tener sus propias deps).
  4. Sustituye todas las referencias con sus valores resueltos.
  5. Ejecuta el bloque actual.

Los ciclos son imposibles por construcción — las referencias solo pueden apuntar hacia arriba en el archivo. Si reordenas bloques y creas una forward reference, el editor subraya rojo.

Cuando B referencia A, ejecutar B puede ejecutar o no A:

Estado del cacheComportamiento
A nunca ejecutadoEjecuta A, luego B
A cacheado, inputs sin cambios desde el último runUsa A cacheado (instantáneo), luego B
A cacheado, pero env o upstream-of-A cambióRe-ejecuta A, luego B
Bloque de mutación (POST/PUT/DELETE)Siempre re-ejecuta, ignora cache

La cache key es sha256(method + URL + headers + body + env snapshot solo de vars referenciadas). Cambiar una env var no referenciada no invalida.

DóndeCómo
En el editorHover {{...}} — popover muestra valor resuelto o error
En el editorCtrl+click (o Cmd+click) — salta a la definición del alias
Pre-runPopover se actualiza en vivo a medida que el cache se llena
Post-runTab Raw en el response panel muestra la request literal con refs sustituidas
Per-blockToolbar → tab References — cada ref + valor actual

Tipea {{ en cualquier body de bloque → el popover muestra:

  • Todos los aliases arriba del bloque actual (con hint de tipo del body)
  • Todas las env vars del entorno activo

Filtra tipeando. Tab para completar. Esc para cancelar.

SíntomaCausaFix
path body.user.id not foundLa shape de la respuesta no matchea lo que escribisteRevisa la respuesta real del bloque upstream en el tab Body
La referencia resuelve a un valor viejoOlvidaste re-ejecutar el bloque upstreamEl cache invalida en cambio de input — generalmente auto
Bracket key no parsedbody[odd key] sin comillasComíllalo: body["odd key"]
$prev resuelve al bloque equivocadoReordenaste bloquesUsa aliases nombrados para runbooks commiteados
Env var resuelve literalEl env activo no tiene la keyEnv selector de la TopBar + revisa envs/<env>.toml
Alias de bloque resuelve pero querías envColisión de namingBloque gana; renombra alguno