SAP Gateway (OData)
El tercer camino hacia SAP, y el único que no depende del SDK: el CMS habla HTTP con el ICM de
SAP y consume los servicios OData publicados en el SAP Gateway (/sap/opu/odata/...). Es el camino
natural cuando el servicio ya existe — las apps Fiori usan los mismos —, o cuando el equipo SAP
prefiere exponer OData antes que liberar RFC.
Ver SAP para comparar con RFC/BAPI e IDoc.
Cómo se arma
- La Conexión Externa es el servidor: protocolo, host y puerto, más mandante, autenticación y TLS. Una conexión atiende a todos los servicios de ese servidor.
- La Aplicación es del tipo SAP Gateway y aparece en el grupo SAP en todas las pantallas, junto a RFC e IDoc. Su URL viene de la conexión y queda bloqueada.
- La ruta del servicio va en cada Recolección (Ruta de la Recolección) y en cada Entrega (URI), exactamente como en una integración HTTP.
Ejemplo: conexión http://192.168.15.98:7200, Recolección con la ruta
/sap/opu/odata/sap/PP_PRODOPS_CONFIRM_SRV/WorkCenters. La llamada sale hacia
http://192.168.15.98:7200/sap/opu/odata/sap/PP_PRODOPS_CONFIRM_SRV/WorkCenters?sap-client=100.
Configurar la conexión
En Conexiones Externas, tipo SAP Gateway (OData), en el grupo SAP.

| Campo | Para qué sirve |
|---|---|
| Protocolo | HTTP o HTTPS — lo que el ICM expone en ese puerto |
| Host | Dirección del servidor SAP (o del Web Dispatcher) |
| Puerto | Puerto del ICM (transacción SMICM › Servicios). En blanco, el predeterminado del protocolo: 443 u 80 |
| Ruta de prueba (Keep Alive) | Lo que llaman Probar Conexión y el Keep Alive. Viene con /sap/public/ping |
| Client (mandante) | Se envía como sap-client en cada llamada |
| Idioma | Se envía como sap-language. Solo cambia textos y mensajes de error |
| Autenticación | Basic (usuario técnico), OAuth 2.0 Client Credentials o Certificado de cliente (X.509) |
| Certificado CA (PEM) | Solo para un ICM con certificado autofirmado o de CA interna |
| Timeout (ms) | Tope de las llamadas de la conexión. Recolección y Entrega usan su propio timeout; la prueba de conexión, 5 s como máximo |
| Obtener token CSRF antes de grabar | Activado por defecto — ver Token CSRF |
La vista previa bajo los campos muestra la dirección que las Recolecciones y Entregas van a completar:
http://192.168.15.98:7200/sap/opu/odata/sap/<SERVICIO>/....
Complete el mandante. Sin él, SAP usa el mandante predeterminado del sistema. O el usuario no existe ahí y la llamada vuelve 401 — parece contraseña incorrecta —, o, peor, existe en los dos y la integración lee y graba en el mandante equivocado sin ningún error.
La prueba de conexión
/sap/public/ping prueba que el servidor responde, pero no prueba usuario ni mandante: no pide
login. Para que la prueba valide los dos, cambie la Ruta de prueba por la raíz de un servicio, por
ejemplo /sap/opu/odata/sap/PP_PRODOPS_CONFIRM_SRV/. En ese caso el mensaje dice también la versión
OData que SAP declaró.
No es el $metadata a propósito: el Keep Alive corre en cada ciclo, y el $metadata de un servicio
grande tiene megabytes. Con varias Aplicaciones en la misma conexión, sale una prueba por ciclo, y
quedan ON y OFF juntas.
Autenticación
| Modo | Cuándo usar | Qué verifica SAP |
|---|---|---|
| Basic | Usuario técnico (SU01, tipo Sistema). El caso más común en Gateway on-premise | Usuario y contraseña |
| OAuth 2.0 Client Credentials | Gateway expuesto por BTP o por un API Management | Token del servidor de autorización indicado en la URL del token |
| Certificado de cliente (X.509) | Sin contraseña: el certificado se asigna a un usuario en SAP (SM30, VUSREXTID o regla CERTRULE) | Handshake TLS — exige HTTPS |
Contraseña, client secret, clave privada y la contraseña de la clave se guardan cifrados y nunca vuelven a la pantalla: al editar, dejarlos en blanco mantiene el actual. Los certificados (el de cliente y el de la CA) son públicos y se muestran normalmente.
La Aplicación
En el registro de Aplicaciones, elija el tipo SAP Gateway y la conexión en el campo de Keep Alive. La URL de la Aplicación aparece bloqueada, con la dirección de la conexión, y cambia sola si la conexión cambia — junto con el destino de sus Entregas. Autenticación y certificados no quedan en la Aplicación.
Con la conexión elegida, la fila de la Aplicación gana el ícono del Asistente de Integración.
Recolecciones y Entregas
| Tipos | Uso típico | |
|---|---|---|
| Recolección | HTTP_GET, HTTP_POST | GET en un EntitySet (/WorkCenters), POST en una Function Import |
| Entrega | HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE | Crear, cambiar y borrar entidades. SOAP no aplica |
La ruta empieza en /sap/opu/odata/...: el host viene de la conexión. Los parámetros de sistema OData
van en los Parámetros Fijos — $format=json (sin él SAP V2 responde en XML), $top, $filter,
$select. El sap-client y el sap-language de la conexión se agregan solos; si la ruta o los
Parámetros Fijos ya traen un sap-client, vale el de ellos.
Token CSRF
El SAP Gateway rechaza POST, PUT, PATCH y DELETE sin un token CSRF válido, con 403 y el
encabezado x-csrf-token: Required. El CMS lo resuelve solo:
- antes de la primera escritura, hace un GET en la raíz del servicio de esa llamada con
X-CSRF-Token: Fetchy guarda el token y las cookies de la sesión — el token solo vale en la sesión que lo emitió; - las escrituras siguientes en el mismo servicio reutilizan el token (renovado cada 20 minutos);
- si SAP rechaza el token (sesión vencida, ICM reiniciado), el CMS pide otro y reintenta una vez. Un segundo 403 es rechazo de verdad y aparece como falla.
La raíz sale de la propia URL — /sap/opu/odata/<namespace>/<SERVICIO> en v2 y
/sap/opu/odata4/sap/<grupo>/srvd_a2x/sap/<servicio>/<versión> en v4 —, así que cada servicio tiene
su token. Desactive la opción solo para un servicio con la protección desactivada en la SICF.
Otro usuario en una Recolección o Entrega
El usuario de la conexión es el predeterminado. Cuando un servicio exige otro usuario — autorización separada por escenario, o un servicio que necesita un usuario con número de personal —, elija una Credencial de la Aplicación en el campo Credencial de la Recolección o de la Entrega. La primera opción de la lista, De la Conexión SAP Gateway, es la predeterminada.
- Con una Credencial, solo la autenticación cambia: host, mandante, CA y token CSRF siguen viniendo de la conexión.
- El token CSRF se guarda por usuario: el de uno no sirve para el otro.
- Si la conexión usa certificado de cliente (X.509) y la Recolección elige una Credencial, el certificado no va junto — enviar los dos dejaría que SAP decida con qué usuario entrar.
La Credencial se registra en Credenciales, como de salida, en la propia Aplicación SAP Gateway.
Asistente de Integración
El Descubrimiento por URL funciona con la Aplicación SAP Gateway:
lee el $metadata del servicio y propone las Recolecciones y Entregas. La URL ya abre como
http://host:puerto/sap/opu/odata/sap/ — complétela con el servicio (PP_PRODOPS_CONFIRM_SRV/). El
campo Contrato acepta también la URL del $metadata.
La lectura del contrato usa el usuario y el mandante de la conexión (o la Credencial elegida en el asistente), pero solo cuando la URL es el propio servidor de la conexión. Para cualquier otra dirección, la llamada sale sin autenticación y sin seguir redirecciones: de lo contrario, escribir una dirección propia bastaría para recibir el usuario y la contraseña de SAP.
El $metadata describe lo que el servicio anuncia, no lo que la clase del servicio implementa.
Es común que un EntitySet anuncie lectura por clave (WorkCenters('...')) y SAP responda 501
“Method ‘WORKCENTERS_GET_ENTITY’ not implemented in data provider class”. La operación hay que
cambiarla por la lectura de la lista, o implementarla del lado de SAP.
Cuando falla
La falla de una Recolección o Entrega trae el texto que SAP devolvió, después del estado: “Request failed with status code 501: Method ’…’ not implemented…”.
| Síntoma | Causa probable | Dónde mirar |
|---|---|---|
| 401 | Usuario o contraseña; usuario inexistente en el mandante (o mandante en blanco) | SU01, mandante de la conexión |
403 sin x-csrf-token: Required | Usuario sin autorización para el servicio | Rol con S_SERVICE del servicio, SU53 |
| 404 | Ruta incorrecta o servicio inactivo | /IWFND/MAINT_SERVICE |
| 500 “Access using a ‘ZERO’ service” | URL sin el nombre del servicio (.../sap/opu/odata/sap/) | Complete la ruta |
| 501 ”… not implemented in data provider class” | Operación anunciada en el $metadata pero no programada | Cambie la operación, o hable con el equipo SAP |
| 400 “Número de personal no encontrado para el usuario …” | Servicio que exige usuario vinculado a un número de personal (apps Fiori de notificación, por ejemplo) | Infotipo 0105 del usuario, o use otra Credencial |
| Timeout en el Keep Alive, junto con la Aplicación RFC del mismo SAP | El servidor SAP dejó de responder por un tiempo | SM50/SM66, SM21, SMICM, ST22 |
Para detalle del lado SAP, la transacción /IWFND/ERROR_LOG guarda cada error del Gateway por el
transactionid que aparece en el cuerpo de la respuesta.