SAP Gateway (OData)
O terceiro caminho para o SAP, e o único que não depende do SDK: o CMS fala HTTP com o ICM do
SAP e consome os serviços OData publicados no SAP Gateway (/sap/opu/odata/...). É o caminho natural
quando o serviço já existe — os apps Fiori usam os mesmos —, ou quando o time SAP prefere expor
OData a liberar RFC.
Ver SAP para comparar com RFC/BAPI e IDoc.
Como se monta
- A Conexão Externa é o servidor: protocolo, host e porta, mais mandante, autenticação e TLS. Uma conexão atende a todos os serviços daquele servidor.
- A Aplicação é do tipo SAP Gateway e aparece no grupo SAP em todas as telas, ao lado de RFC e IDoc. A URL dela vem da conexão e fica travada.
- O caminho do serviço fica em cada Coleta (Caminho da Coleta) e em cada Entrega (URI), exatamente como numa integração HTTP.
Exemplo: conexão http://192.168.15.98:7200, Coleta com o caminho
/sap/opu/odata/sap/PP_PRODOPS_CONFIRM_SRV/WorkCenters. A chamada sai para
http://192.168.15.98:7200/sap/opu/odata/sap/PP_PRODOPS_CONFIRM_SRV/WorkCenters?sap-client=100.
Configurar a conexão
Em Conexões Externas, tipo SAP Gateway (OData), no grupo SAP.

| Campo | Para que serve |
|---|---|
| Protocolo | HTTP ou HTTPS — o que o ICM expõe naquela porta |
| Host | Endereço do servidor SAP (ou do Web Dispatcher) |
| Porta | Porta do ICM (transação SMICM › Serviços). Em branco, a padrão do protocolo: 443 ou 80 |
| Caminho de teste (Keep Alive) | O que o Testar Conexão e o Keep Alive chamam. Vem preenchido com /sap/public/ping |
| Client (mandante) | Vai como sap-client em toda chamada |
| Idioma | Vai como sap-language. Só muda textos e mensagens de erro |
| Autenticação | Basic (usuário técnico), OAuth 2.0 Client Credentials ou Certificado de cliente (X.509) |
| Certificado CA (PEM) | Só para ICM com certificado autoassinado ou de CA interna |
| Timeout (ms) | Teto das chamadas da conexão. Coleta e Entrega usam o timeout delas; o teste de conexão, no máximo 5 s |
| Buscar token CSRF antes de gravar | Ligado por padrão — ver Token CSRF |
A prévia abaixo dos campos mostra o endereço que as Coletas e Entregas vão completar:
http://192.168.15.98:7200/sap/opu/odata/sap/<SERVIÇO>/....
Preencha o mandante. Sem ele, o SAP usa o mandante padrão do sistema. Ou o usuário não existe ali e a chamada volta 401 — parece senha errada —, ou, pior, existe nos dois e a integração lê e grava no mandante errado sem erro nenhum.
O teste de conexão
O /sap/public/ping prova que o servidor responde, mas não prova usuário nem mandante: ele não
pede login. Para o teste validar os dois, troque o Caminho de teste pela raiz de um serviço, por
exemplo /sap/opu/odata/sap/PP_PRODOPS_CONFIRM_SRV/. Nesse caso a mensagem diz também a versão
OData que o SAP declarou.
Não é o $metadata de propósito: o Keep Alive roda a cada ciclo, e o $metadata de um serviço
grande tem megabytes. Com várias Aplicações na mesma conexão, sai um teste por ciclo, e elas
ficam ON e OFF juntas.
Autenticação
| Modo | Quando usar | Onde o SAP confere |
|---|---|---|
| Basic | Usuário técnico (SU01, tipo Sistema). O caso mais comum no Gateway on-premise | Usuário e senha |
| OAuth 2.0 Client Credentials | Gateway exposto pelo BTP ou por um API Management | Token do servidor de autorização informado na URL do token |
| Certificado de cliente (X.509) | Sem senha: o certificado é mapeado a um usuário no SAP (SM30, VUSREXTID ou regra CERTRULE) | Aperto de mão TLS — exige HTTPS |
Senha, client secret, chave privada e a senha da chave ficam cifrados e nunca voltam para a tela: na edição, deixar em branco mantém o atual. Os certificados (o de cliente e o da CA) são públicos e aparecem normalmente.
A Aplicação
No cadastro de Aplicações, escolha o tipo SAP Gateway e a conexão no campo de Keep Alive. A URL da Aplicação aparece travada, com o endereço da conexão, e muda sozinha se a conexão mudar — junto com o destino das Entregas dela. Autenticação e certificados não ficam na Aplicação.
Com a conexão escolhida, a linha da Aplicação ganha o ícone do Assistente de Integração.
Coletas e Entregas
| Tipos | Uso típico | |
|---|---|---|
| Coleta | HTTP_GET, HTTP_POST | GET num EntitySet (/WorkCenters), POST numa Function Import |
| Entrega | HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE | Criar, alterar e apagar entidades. SOAP não se aplica |
O caminho começa em /sap/opu/odata/...: o host vem da conexão. Parâmetros de sistema OData vão nos
Parâmetros Fixos — $format=json (sem ele o SAP V2 responde em XML), $top, $filter,
$select. O sap-client e o sap-language da conexão entram sozinhos; se o caminho ou os
Parâmetros Fixos já trouxerem um sap-client, vale o deles.
Token CSRF
O SAP Gateway recusa POST, PUT, PATCH e DELETE sem um token CSRF válido, com 403 e o cabeçalho
x-csrf-token: Required. O CMS resolve isso sozinho:
- antes da primeira escrita, faz um GET na raiz do serviço daquela chamada com
X-CSRF-Token: Fetche guarda o token e os cookies da sessão — o token só vale na sessão que o emitiu; - as escritas seguintes no mesmo serviço reaproveitam o token (renovado a cada 20 minutos);
- se o SAP recusar o token (sessão expirada, ICM reiniciado), o CMS busca outro e tenta uma vez. Um segundo 403 é recusa de verdade e aparece como falha.
A raiz sai da própria URL — /sap/opu/odata/<namespace>/<SERVIÇO> na v2 e
/sap/opu/odata4/sap/<grupo>/srvd_a2x/sap/<serviço>/<versão> na v4 —, então cada serviço tem o seu
token. Desligue a opção só para serviço com a proteção desativada na SICF.
Outro usuário numa Coleta ou Entrega
O usuário da conexão é o padrão. Quando um serviço exige outro usuário — autorização separada por cenário, ou um serviço que precisa de usuário com número de pessoal —, escolha uma Credencial da Aplicação no campo Credencial da Coleta ou da Entrega. A primeira opção da lista, Da Conexão SAP Gateway, é o padrão.
- Com uma Credencial, só a autenticação muda: host, mandante, CA e token CSRF continuam vindo da conexão.
- O token CSRF é guardado por usuário: o de um não serve para o outro.
- Se a conexão usa certificado de cliente (X.509) e a Coleta escolhe uma Credencial, o certificado não vai junto — mandar os dois deixaria o SAP decidir com qual usuário entrar.
A Credencial é cadastrada em Credenciais, como de saída, na própria Aplicação SAP Gateway.
Assistente de Integração
A Descoberta por URL funciona com a Aplicação SAP Gateway: ela
lê o $metadata do serviço e propõe as Coletas e Entregas. A URL já abre como
http://host:porta/sap/opu/odata/sap/ — complete com o serviço (PP_PRODOPS_CONFIRM_SRV/). O campo
Contrato aceita também a URL do $metadata.
A leitura do contrato usa o usuário e o mandante da conexão (ou a Credencial escolhida no assistente), mas só quando a URL é o próprio servidor da conexão. Para qualquer outro endereço, a chamada sai sem autenticação e sem seguir redirecionamento: do contrário, digitar um endereço próprio bastaria para receber o usuário e a senha do SAP.
O $metadata descreve o que o serviço anuncia, não o que a classe do serviço implementa. É
comum um EntitySet anunciar leitura por chave (WorkCenters('...')) e o SAP responder 501
“Method ‘WORKCENTERS_GET_ENTITY’ not implemented in data provider class”. A operação precisa ser
trocada pela leitura da lista, ou implementada do lado do SAP.
Quando dá erro
A falha de uma Coleta ou Entrega traz o texto que o SAP devolveu, depois do status: “Request failed with status code 501: Method ’…’ not implemented…”.
| Sintoma | Causa provável | Onde olhar |
|---|---|---|
| 401 | Usuário ou senha; usuário inexistente no mandante (ou mandante em branco) | SU01, mandante da conexão |
403 sem x-csrf-token: Required | Usuário sem autorização para o serviço | Papel com S_SERVICE do serviço, SU53 |
| 404 | Caminho errado ou serviço inativo | /IWFND/MAINT_SERVICE |
| 500 “Access using a ‘ZERO’ service” | URL sem o nome do serviço (.../sap/opu/odata/sap/) | Complete o caminho |
| 501 ”… not implemented in data provider class” | Operação anunciada no $metadata mas não programada | Troque a operação, ou fale com o time SAP |
| 400 “Nº pessoal não encontrado para usuário …” | Serviço que exige usuário ligado a um número de pessoal (apps Fiori de confirmação, por exemplo) | Infotipo 0105 do usuário, ou use outra Credencial |
| Timeout no Keep Alive, junto com a Aplicação RFC do mesmo SAP | O servidor SAP parou de responder por um tempo | SM50/SM66, SM21, SMICM, ST22 |
Para detalhe do lado SAP, a transação /IWFND/ERROR_LOG guarda cada erro do Gateway pelo
transactionid que aparece no corpo da resposta.