Antes de empezar
- Una configuración de provider para el servicio y un node executor que la referencie. Consulta Referenciar la configuración de provider desde un node de workflow.
- Los nombres de los campos que espera el servicio. Cuando el documento OpenAPI del servicio está en el registro, Derivar el esquema de una operación devuelve
inputSchema— el cuerpo de la solicitud de la operación — youtputSchema— su respuesta correcta. Ambos te dan los nombres de campo que escribes como target y como source de tus mapeos. - Un workflow en estado
draft. Un workflow activo queda bloqueado, así que usa Mover el workflow a draft antes de editar un node y actívalo de nuevo después.
No envíes
executorId en un node que llama a una operación de un documento OpenAPI subido. Ese node nombra la operación con operation_path y operation_method. Flowker rellena el executorId por ti, a partir de la configuración de provider a la que apunta el node, antes de validar el workflow. Lo hace cuando creas el workflow y cuando lo actualizas. Conectar tu propia API recorre todo ese camino. Los nodes de esta página nombran http, el conector HTTP genérico, que sí necesita un executorId explícito.Paso 1: Conoce lo que puede leer un mapeo
Todo mapeo lee del contexto del workflow, un único objeto JSON que crece a medida que avanza la ejecución:
Direcciona un valor por su ruta desde una de esas claves de primer nivel:
El
source de un mapeo es una ruta simple. No lo envuelvas en ${...}: las llaves pertenecen a los campos de plantilla del node (body, headers, query, path), y dentro de un mapeo una cadena ${...} se lee como un nombre de ruta literal que no selecciona nada.Paso 2: Declara el mapeo de entrada
Los mapeos de entrada viven en un array
inputMapping dentro del objeto data del node executor. Cada entrada mueve un valor al cuerpo de la solicitud saliente.
El resultado del mapeo es el cuerpo de la solicitud. Escribe cada
target exactamente como el servicio espera recibirlo: no hay objeto envolvente ni prefijo que agregar.
Ejemplo — mapear el payload del trigger a una verificación de fraude
Ejemplo — mapear el payload del trigger a una verificación de fraude
{"transactionId":"txn-98765","amount":1500.00,"customer":{"document":"12345678900"}}, el servicio recibe:Cuando un source no selecciona nada
Una ruta de origen ausente del contexto no es un error. El target se escribe igualmente, con el valornull, y la solicitud sale.
Usa required: true cuando el node no deba llamar al servicio sin un valor. Flowker revisa entonces cada ruta de origen de ese node antes de armar la solicitud y falla el paso cuando alguna está ausente: la ejecución se detiene con FLK-0504 y el paso informa input transformation failed.
required aplica al node, no solo a la entrada que lo lleva. Si alguna entrada del inputMapping de un node pone required: true, cada ruta de origen de ese array debe resolverse. Para mantener algunos campos opcionales, deja required fuera en todo el node.target una sola entrada. Cuando dos entradas escriben el mismo target, gana la última.
Paso 3: Decide qué arma el cuerpo de la solicitud
Un node tiene tres formas de producir un cuerpo de solicitud. Flowker las revisa en un orden fijo y se detiene en la primera que esté presente:
1
data.body
Una plantilla de cuerpo explícita gana por completo. Flowker resuelve sus referencias
${...} contra el contexto del workflow y envía el resultado. Mientras data.body está presente, inputMapping, transforms y config no aportan nada al cuerpo.Cada referencia ${...} aquí debe resolverse. Una que no lo hace falla el node con FLK-0143, antes de hacer ninguna llamada — lo contrario de un source de mapeo, que se resuelve como null. Usa data.body cuando un valor ausente deba detener el workflow, y un mapeo cuando la solicitud deba salir de todos modos.2
inputMapping o transforms
En caso contrario, Flowker arma una capa a partir de
inputMapping. Cuando inputMapping está vacío, la arma a partir de transforms. Los dos son mutuamente excluyentes: un node con al menos una entrada en inputMapping nunca ejecuta sus transforms sobre la entrada.3
Literales de config
Los valores literales de
data.config siembran el cuerpo. Con una capa presente, los literales son la base y la capa gana en cualquier clave que ambos definan, así un mismo node puede combinar valores fijos con valores mapeados. Sin capa, los literales son el cuerpo por sí solos.config pueda sembrar el cuerpo, Flowker elimina de ahí estos nombres: method, path, url, endpointName, query, headers, auth, retry, timeout, timeout_seconds, request_format, success_status_codes, allowedHosts y allowedPrivateHosts. Por eso un node que guarda transporte en config por error no envía nada de eso al destino, y un bloque auth colocado ahí nunca puede viajar como contenido de la solicitud.
El node lee su propio transporte en el primer nivel de su objeto data: path, endpointName, method, headers, query, auth, timeout_seconds, retry, success_status_codes y request_format. Las listas de hosts permitidos de salida no están entre ellos: allowedHosts y allowedPrivateHosts se definen en la configuración de provider, y cada una aplica a todos los nodes que llaman a través de ella.
Ejemplo — valores fijos junto con valores mapeados
Ejemplo — valores fijos junto con valores mapeados
Paso 4: Ajusta un valor en tránsito
Cuando el servicio necesita un valor en otra forma, agrega una
transformation a la entrada del mapeo. Se aplica al valor después de que llega al target.
Estos cinco son todo el conjunto. Un
type fuera de él se rechaza cuando guardas el workflow, con FLK-0140.
Dos reglas para escribirlas:
- Actúan sobre texto. Un valor que no es texto llega al target sin cambios.
prefixysuffixnecesitan al menos un carácter cada uno, y un solo espacio cuenta.charactersnecesita al menos un carácter que no sea un espacio, un tabulador ni un salto de línea. Un valor que no cumple esto falla el paso en tiempo de ejecución conFLK-0504.
Ejemplo — normalizar un documento y sellar una referencia
Ejemplo — normalizar un documento y sellar una referencia
{"customer":{"document":"123.456.789-00","name":"ada lovelace"},"transactionId":"txn-98765"}, el node envía:Transformaciones sobre todo el documento
Para el trabajo que el mapeo entrada por entrada no expresa — combinar dos campos, elegir el primer valor presente, rellenar un valor por defecto — declara un arraytransforms. Cada operación lee todo el contexto del workflow y escribe toda la capa.
Flowker acepta shift (mover o renombrar), concat (unir valores), coalesce (primer valor presente), default (rellenar una clave ausente), extract (subir un subárbol a la raíz), delete (eliminar una clave), timestamp, uuid y pass. Los cinco tipos de transformación de arriba también están disponibles aquí; como operaciones, reciben la ruta de destino en la spec como path.
Ejemplo — un shift y un default en un mismo node
Ejemplo — un shift y un default en un mismo node
require: true para exigir que exista cada ruta que nombra su spec, igual que required funciona en una entrada de mapeo.transforms se ejecuta solo cuando el node no tiene inputMapping. Usa uno u otro en un mismo node, nunca ambos.Paso 5: Lee la respuesta de vuelta
Los mapeos de salida extraen campos de la respuesta y los guardan en el contexto del workflow bajo el ID del node, para que los nodes posteriores lean nombres cortos y estables. Decláralos en un array
outputMapping dentro del data del node, con los mismos cuatro campos de entrada que un mapeo de entrada.
Un source de salida es una ruta dentro del envoltorio de respuesta, no dentro del cuerpo de la respuesta:
Por eso los campos de la respuesta están bajo
body:
score-transaction, eso guarda:
${score-transaction.score} y ${score-transaction.httpStatus}.
Un node que no declara outputMapping guarda todo el envoltorio bajo su ID, y los nodes posteriores leen la ruta del envoltorio directamente: ${score-transaction.body.score}. Agrega un mapeo de salida cuando quieras el nombre corto; omítelo cuando la ruta del envoltorio sea suficientemente clara.
Un source de salida que no selecciona nada se comporta como uno de entrada: el target se guarda como null, salvo que una entrada de ese node ponga required: true.
Paso 6: Revisa el mapeo antes de llamar al servicio
Previsualizar la solicitud de un executor arma la solicitud que enviaría un node y te la devuelve. Ejecuta el mismo armado de mapeos, transformaciones y autenticación que ejecuta una ejecución real, y nunca abre una conexión con el servicio, así que puedes iterar sobre un mapeo sin que salga una sola llamada de tu despliegue. Ninguna credencial aparece en lo que devuelve, ni siquiera en el
curl.
Envía el node, la configuración de provider a la que apunta y un payload de muestra. La configuración de provider va en la propia solicitud, así que la previsualización no depende de nada más que de lo que envías:
sampleInput se convierte en el payload del trigger, así que los source del mapeo lo leen como workflow.*, exactamente como lo harán en tiempo de ejecución.
La respuesta es la solicitud armada:
1
Revisa la URL
Es la URL base de la configuración de provider más el
path del node. Una ruta que no esperabas es un campo del node por corregir, no un mapeo.2
Revisa el cuerpo contra los nombres de campo que espera el servicio
Cada
target debe aparecer donde el servicio lo quiere. Un campo con null es una ruta source que no selecciona nada.3
Revisa `unresolved`
Lista las referencias
${...} de los campos de plantilla del node que tu payload de muestra no resolvió. Quedan literales en la solicitud armada. Un array vacío significa que cada referencia encontró un valor.config y, en mappedTargets, las rutas de target que aporta tu inputMapping. Flowker las cuenta como satisfechas, así que un node que mapea un campo requerido desde el trigger pasa la revisión.
Qué puede salir mal
Consulta la lista de errores de Flowker para ver todos los códigos.
Qué sigue
Guía de integración
Crea la configuración de provider por la que llama un node y define su autenticación.
Configurar un trigger de webhook
Elige el contrato de payload que llena el espacio de nombres
workflow que leen tus mapeos.
