Cómo realizar llamadas oData en SAP Gateway Client (/n/iwfnd/gw_client)

El Gateway Client (transacción /n/IWFND/GW_CLIENT) es la herramienta estándar de SAP para probar servicios OData directamente desde el sistema. Permite enviar peticiones HTTP sin necesidad de herramientas externas como Postman, y es ideal para depurar, validar y entender el comportamiento de tus servicios OData.

Estructura básica de una URL OData

http(s)://<servidor>:<puerto>/sap/opu/odata/<espacio_nombre>/<nombre_servicio>_SRV/<nombre_entidad>

Ejemplo real:

/sap/opu/odata/ZSERVICE_NAME_SRV/ProductSet

Nota: Normalmente no se especifica el host completo porque el Gateway Client ya está dentro del sistema SAP. Basta con la ruta relativa.

Peticiones GET (leer datos)

Obtener un único registro (Get Entity)

HTTP Method: GET

Obtener un único registro, que se identifica por su clave primaria (key).

URL:

/sap/opu/odata/ZSERVICE_NAME_SRV/ProductSet('0001')

Código de estado esperado:

  • 200 OK → Registro encontrado, devuelve el JSON/XML
  • 404 Not Found → No existe el registro con esa clave
  • 403 Forbidden → Sin autorización
  • 500 Internal Server Error → Error en el backend

Obtener un conjunto (Get EntitySet)

HTTP Method: GET

Obtener múltiples registros con o sin filtros. Sin filtros devuelve todos los registros (o los primeros según configuración).

URL:

/sap/opu/odata/ZSERVICE_NAME_SRV/ProductSet

Códigos de estado:

  • 200 OK → Todo correcto
  • 400 Bad Request → URL mal formada
  • 500 Internal Server Error

Filtros y opciones de consulta (Query Options)

Los parámetros OData se añaden con ? y se separan con &.

OpciónEjemploDescripción
$filter?$filter=Country eq 'ES'Filtra registros
$orderby?$orderby=Name ascOrdena ascendente/descendente
$top?$top=10Primeros N registros
$skip?$skip=5Salta N registros (paginación)
$select?$select=Name,CitySolo ciertos campos
$expand?$expand=To_ItemsIncluye entidades relacionadas
$inlinecount?$inlinecount=allpagesCuenta total de registros

Si queremos añadir filtros múltiples, se combinan con operadores lógicos: and, or. Ej:

?$filter=Country eq 'ES' and City eq 'Madrid'
?$filter=Price gt 100 and Price lt 500

Peticiones POST: Crear un registro (Create Entity)

HTTP Method: POST

Crear un nuevo registro mediante una petición POST estándar.

/sap/opu/odata/ZSERVICE_NAME_SRV/ProductSet

Body en formato JSON:

{
  "ProductId": "0002",
  "Name": "Laptop Pro",
  "Country": "ES",
  "Price": 1200.00
}

Códigos de estado:

  • 201 Created → Registro creado correctamente
  • 400 Bad Request → Datos inválidos (falta campo obligatorio, tipo erróneo)
  • 403 Forbidden → Sin autorización para crear
  • 500 Internal Server Error

Respuesta típica (201): Suele devolver el objeto creado con su clave.

Peticiones PUT / PATCH (o MERGE): Actualizar un registro (Update Entity)

HTTP Method: PUT

Se utiliza para actualizar los registros de la entitdad.

/sap/opu/odata/ZSERVICE_NAME_SRV/ProductSet('0001')

Body JSON:

{
  "ProductId": "0001",
  "Name": "Laptop Pro Ultra",
  "Country": "ES",
  "Price": 1250.00
}

Códigos de estado:

  • 200 o 204 → Actualización exitosa (según implementación)
  • 404 Not Found → Registro no existe
  • 400 Bad Request → Datos inválidos
  • 412 Precondition Failed → Problema de concurrencia (ETag)

Petición DELETE: Eliminar un registro (Delete Entity)

HTTP Method: DELETE

Eliminar un registro

/sap/opu/odata/ZSERVICE_NAME_SRV/ProductSet(ProductId='0001')

Códigos de estado:

  • 200 o 204 → Eliminado correctamente
  • 404 Not Found → El registro no existe
  • 403 Forbidden → Sin autorización
  • 500 Internal Server Error

Function Import (FI)

Los Function Imports permiten ejecutar lógica personalizada en ABAP, devolviendo o no datos.

FI tipo GET (sin body)

HTTP Method: GET

/sap/opu/odata/ZSERVICE_NAME_SRV/CalculateTax?Price=100&Country='ES'

Códigos de estado:

  • 200 OK → Devuelve resultado
  • 400 Bad Request → Parámetros incorrectos

FI tipo POST (con body)

HTTP Method: POST

/sap/opu/odata/ZSERVICE_NAME_SRV/ProcessOrder

Body:

{
"OrderId": "1000",
"Action": "CONFIRM"
}

Códigos de estado:

  • 200 OK → Procesado correctamente
  • 500 Internal Server Error → Error en la lógica

Deep Entities (entidades anidadas)

Crear entidad principal + detalles (Deep Create)

HTTP Method: POST

Se envía una estructura jerárquica ( entidad principal + relaciones hijas ) en una sola llamada.

/sap/opu/odata/ZSERVICE_NAME_SRV/SalesOrderSet

Body JSON:

{
"OrderId": "5000",
"CustomerId": "1000",
"OrderDate": "2026-04-06T00:00:00",
"To_Items": [
{
"ItemNo": "001",
"ProductId": "L001",
"Quantity": 2,
"Price": 100.00
},
{
"ItemNo": "002",
"ProductId": "L002",
"Quantity": 1,
"Price": 250.00
}
]
}

Obtener entidad con sus detalles (Deep Entity Read)

HTTP Method: GET

Se obtiene una entidad con sus relaciones expandidas.

/sap/opu/odata/ZSERVICE_NAME_SRV/SalesOrderSet('5000')?$expand=OrderItems

Ejemplo más completo:

/sap/opu/odata/ZSERVICE_NAME_SRV/SalesOrderSet?sap-client=100&$expand=OrderItems&$filter=OrderId eq '001' and CreatedOn eq datetime'2020-07-18T22:00:00'

Solución de errores frecuentes

ProblemaPosible causaSolución
404 Not Found en cualquier llamadaURL incorrecta o servicio inactivoVerifica el nombre del servicio y que esté activo en /n/iwfnd/maint_service
403 ForbiddenFaltan autorizacionesAsigna rol adecuado al usuario (PFCG)
400 Bad Request al hacer POSTCampo obligatorio vacío o tipo incorrectoComprueba el modelo EDM y tipos de datos
500 Internal Server ErrorError ABAP en el backendRevisa ST22 o el log de Gateway Client
El Gateway Client no muestra nadaProxy o certificadosPrueba desde SE38 con CL_HTTP_CLIENT

El Gateway Client es una herramienta poderosa y sencilla para probar servicios OData directamente en SAP. Dominarlo te permitirá:

  • Ahorrar tiempo al no necesitar herramientas externas
  • Depurar servicios rápidamente
  • Validar filtros, expansiones y operaciones CRUD
  • Entender los códigos de estado y mensajes de error