Todos os artigos
FT-SAP-METADATA-SANDBOX-GUARD-V1· 1.0.0Integrações

SAP: header sap-client em sandbox vs on-premise

sap-client header só vai em SAP on-premise / private cloud. Sandbox (sandbox.api.sap.com / *.api.sap.com) rejeita com 401 — tenant é fixo pelo API key. Tanto execução de query quanto $metadata fetch respeitam essa regra agora.

Atualizado em 8/6/2026

SAP: header sap-client



Quando o Lefia manda



O Lefia adiciona o header HTTP sap-client na request OData quando:
  • clientNumber está configurado na conexão, E
  • A baseUrl NÃO é da família SAP Business Hub sandbox.


Por quê



Sandbox/API gateway oficial da SAP (sandbox.api.sap.com ou *.api.sap.com) rejeitam o header com 401 Unauthorized — o tenant é fixo pelo API key, e mandar sap-client ali é tratado como tentativa de cross-tenant.

On-premise / private cloud SAP usa sap-client normalmente pra indicar o mandante (cliente lógico).

Detecção



Helper isSapSandboxUrl(baseUrl) em src/lib/sap/url-helpers.ts:
  • sandbox.api.sap.com → sandbox.
  • api.sap.com → sandbox.
  • *.api.sap.com → sandbox (qualquer subdomain).
  • Resto → on-premise / private cloud (manda o header se houver clientNumber).


Onde se aplica



  • odata-client.buildHeaders (execução de query)
  • odata-metadata.buildHeaders ($metadata fetch)


Os dois usam o mesmo helper desde o fix do Codex review pós-#207.

Tickets



  • #154 fix original em odata-client.
  • PR #53 propagou pra odata-metadata.

Histórico de versões

  • 1.0.0

    Codex review post-#207: odata-metadata.ts agora respeita isSapSandboxUrl() (mesmo guard do odata-client). Sem isso, $metadata fetch quebraria com 401 em sandbox.api.sap.com / *.api.sap.com quando clientNumber setado. Helper movido pra src/lib/sap/url-helpers.ts (compartilhado entre os 2 clientes). 8 testes novos cobrindo subdomain, case-insensitive, URL inválida, "api.sap.com" em PATH não-falsifica positivo. PR #53.

    5/17/2026 · new