SAP BTP (Cloud Integration) como origem
Como conectar um endpoint de iFlow do SAP Integration Suite (CPI) como origem REST — Basic Auth para PoC, service key OAuth para produção, e os erros comuns do BTP.
https://<subconta>.it-cpitrial06-rt.cfapps.<região>.hana.ondemand.com/http/<path> — é uma API REST comum. No Lefia ele entra como conexão de protocolo REST / HTTP (não OData: OData é para as APIs do S/4HANA; o endpoint do CPI é o iFlow que VOCÊ publicou).Quando usar
- O sistema SAP real não é acessível e o CPI expõe/simula os dados (PoC, trial).
- O cliente já concentra as saídas do SAP no Integration Suite e libera endpoints HTTP por iFlow.
Configurar a conexão de origem
Siga o tutorial "Integração REST / API" (Ajuda → Tutoriais) com estes valores:
- Protocolo: REST / HTTP · Papel: Origem · paradigma Polling (Lefia busca)
- Base URL: a URL completa do iFlow (termina no path do adapter HTTPS, ex.:
/http/customer-data) - Autenticação:
- OAuth 2.0 (client credentials) — recomendado para produção: no BTP Cockpit crie uma instância de Process Integration Runtime (plano
integration-flow, role API.invoke), gere uma Service Key e use clientid / clientsecret / tokenurl nos campos OAuth. O tokenurl termina em /oauth/token.
- Testar → verde (HTTP 200) → Detectar campos: o Lefia amostra o JSON, encontra o array de registros automaticamente (mesmo embrulhado, ex.:
{"records": [...]}) e registra o formato no catálogo.
Requisitos do iFlow como origem
- Estar deployado e com runtime Started (Monitor → Manage Integration Content).
- Responder ao método configurado (em geral GET) com JSON — idealmente um array de objetos, um por registro.
- Ter um campo de id único por registro (vira o campo-chave do documento; sem ele, a deduplicação usa o hash do conteúdo).
- Devolver os dados crus da origem, não pré-formatados para o destino — a transformação origem→destino é papel do mapping do Lefia.
Erros comuns
- 401 → usuário sem a role collection do adapter (contendo
APIInvoke/MessagingSend), senha alterada, ou service key errada. Após mudar roles no BTP: logout/login. - 403 → o campo User Role do adapter HTTPS não confere com a role atribuída (ex.: adapter exige
API.invoke). - 404 → iFlow não deployado ou path diferente do configurado no adapter.
- 503 / timeout → runtime hibernado (comum em contas trial) — reabra o Integration Suite e redeploye o iFlow.
- Token exchange falhou (OAuth) →
tokenurlsem o sufixo/oauth/tokenouclientsecrettruncado ao copiar.
Atenção com contas trial
Subcontas trial do BTP expiram em 90 dias (ou 30 de inatividade) e o runtime hiberna — para produção use a subconta BTP do cliente; os passos são os mesmos, só mudam as URLs.
Veja também: "Integração REST / API" (tutorial), "Mensagens de erro de conexão" e "OData: Carga Inicial + Sincronização Delta" (quando a origem for a API OData do S/4 em vez de um iFlow).
Histórico de versões
- 1.7.0
Upsert por chave externa no destino REST (#424): options.upsertPathTemplate com placeholders resolvidos do corpo por mensagem + PATCH (upsertMethod override); chave ausente/array = erro claro sem fallback pra POST. Reenvio deixa de duplicar (caso Salesforce External ID).
8/28/2026 · updated
- 1.6.1
Heartbeat de jobs externos: alerta também quando o job NUNCA registrou sucesso. Nova coluna system_heartbeats.watch_since + last_success_at nullable; idade sai de COALESCE(last_success_at, watch_since), então a graça inicial expira sozinha. Job monitorado sem linha na tabela também alerta; erro de leitura vira 500 em vez de "0 stale". Regra extraída para lib/monitoring/heartbeats com 7 testes.
8/26/2026 · updated
- 1.6.0
Auditoria Onda 4 (zero-risco): setCachedSuggestions em after(); 5 managers admin com toast no catch dos loaders; heartbeat de backup (tabela system_heartbeats + cron heartbeat-check detecta ausência do backup semanal); wizard revela webhook_secret one-time antes de sair.
8/25/2026 · updated
- 1.5.0
Auditoria Onda 2: fire-and-forget → after(); timeouts token exchange/Slack; reaper de execuções presas; execute-integrations checa erro da query e remove file_polling no-op; cron process-notification-emails.
8/25/2026 · updated
- 1.4.0
Logs de execucao uteis: (P1) run com erros agrega os MOTIVOS distintos no log (N× motivo + docnums) nos executores REST e OData; (P2) messages.execution_id (migration) carimbado por insert/update/event — card do run ganha "Ver mensagens →" abrindo o monitor filtrado por ?executionId= com banner/limpar; (P3) timestamps dos logs de run com data+hora. Dor real da DQ: "como descubro o erro da execucao?".
7/30/2026 · updated
- 1.3.0
Auto-adaptacao do Idempotency-Key: destino que rejeita o header (Salesforce sobjects -> 400 IDEMPOTENCY_NOT_SUPPORTED) recebe reenvio automatico SEM o header (seguro: o 400 garante que nada foi criado) e a connection memoriza options.idempotencyKeyUnsupported — proximas mensagens pulam o header direto. Match estrito (codigo ou frase explicita); 400 comum de payload nao dispara reenvio. Causa real dos 3x400 do cenario 3 da DQ.
7/30/2026 · updated
- 1.2.2
Tabela do monitor: docnum de hash trunca em 220px com tooltip do valor completo (antes empurrava a tabela); status origem/destino com tooltip do texto completo; status destino alargado 150->240px (carrega o motivo real do provider).
7/30/2026 · updated
- 1.2.1
Logs da mensagem no monitor: ordem DESC (evento mais novo em cima — com reprocessamentos o resultado recente e o que importa) + timestamp com DATA alem da hora (ciclos atravessam dias).
7/30/2026 · updated
- 1.2.0
Detalhe de erro do DESTINO no monitor: o extractor de erro agora entende os shapes comuns de provider — ARRAY na raiz [{message,errorCode}] (Salesforce, prefixa o codigo), errors[] aninhado (GitHub/JSON:API), error_description (OAuth), alem do {message|error|detail} classico. dest_status_text passa a mostrar o motivo real (ex. INVALID_FIELD: No such column...) em vez de so "400 Bad Request".
7/30/2026 · updated
- 1.1.0
Envio de lote em PARALELO: pool de workers com concorrencia limitada (default 4, teto 10, configuravel na UI do perfil REST em "Envios em paralelo"; 1 = sequencial legado). Antes o pipeline era 1 por vez — lote de 15 a ~1,5s/msg deixava a ultima esperando 25s (medido Dataquantica 27/07); agora ~6s. Cada mensagem e independente pos-dedup. Teto evita burst estourando rate-limit do destino.
7/27/2026 · updated
- 1.0.0
Executor de origem REST/JSON: Executar agora/cron agora puxam de API REST genérica (antes só OData). GET na origem, cada registro vira mensagem, processMessage (mapping ou passthrough), send+retry. Dedup por conteudo (docnum=sha256, so processa novos). host-lock. Dispatcher execute-integration por protocolo. Cap 2000/run.
7/13/2026 · new