El siguiente contenido cubre un resumen de los aspectos básicos de la API de EC OData.
Análisis del rendimiento de la API de EC OData
Objective
Introducción
Webinar grabado: Funciones de API de EC OData
Cliente de prueba
Presentaremos 3 clientes de prueba para la API EC OData. El primero es Soap UI, se puede utilizar tanto para SOAP como para REST, y permite la creación de scripts de prueba complejos, incluidas las pruebas de carga. El segundo es el JMeter, también se puede utilizar para SOAP y REST/OData. El último es el cliente Firefox Rest y se puede utilizar para cualquier API basada en Rest, incluido OData.
IU SOAP
- Consíguelo aquí:API Testing Tool | SoapUI
- Se puede utilizar para SOAP y Rest/OData
- Permite la creación de scripts de test complejos, incluidos los tests de carga
JMeter
- Consíguelo aquí: Apache JMeter - Apache JMeter™
- Se puede utilizar para SOAP y Rest/OData
Complemento de Firefox Rest Client
- Consíguelo aquí: Firefox RESTClient
- Se puede utilizar para cualquier API basada en descanso, incluido OData
Autenticación básica
Como sabemos, existirá la autenticación de identidad cuando llamemos a la API de OData, podemos llamarla Autenticación básica. En términos generales, enviamos autenticación con la cabecera https por el parámetro Autorización. La cadena de codificación base 64 username@companyId:passwordcombina con la palabra Basic y un espacio delante. (De hecho, todos los clientes de prueba nos proporcionarán el parámetro Autorización, solo necesitamos establecer el nombre de usuario@companyId y la contraseña, luego la cadena de código Base 64 se creará automáticamente según su entrada en la Autorización.)
- Enviar autentificación con la cabecera http mediante el parámetro Authorization
- base64 Codifique la cadena user@company:password (por ejemplo, admin@ACE123:secret).
- Combinado con la palabra Basic y un espacio delante de ella
- Codificador Base64 disponible en notepad++

OAuth con aserciones SAML
Consulte la documentación de OData
Operaciones y recursos
HTTP GET, PUT, POST, DELETE
La API de OData admite algunas operaciones http, como GET, POST, PUT, PATCH y DELETE, utilizamos las operaciones básicas para obtener o editar entidades como Usuario, PerPerson, lista desplegable, etc. en EC
Operaciones HTTP
- GET: Consulta
- POST: Crear
- PUT: Actualizar
- PATCH: Actualización parcial
- DELETE: Borrar
Recursos o servicios HTTP
- Usuario, PerPerson, lista desplegable, posición
Parámetro HTTP
- Separado por "?" (primero después de Recurso) y "&" caracteres
- Los parámetros estándar de OData empiezan con un carácter "$", como $filter o $select
Definición XML de metadatos API
- Se puede recuperar mediante la API de OData $metadata y se puede importar un resultado después de descargarlo en Excel:
Para obtener información adicional, como etiquetas de idioma, listas desplegables, más allá de lo que proporcionan los metadatos OData estándar, OData de SAP SuccessFactors expone metadatos como una entidad. La API de OData de SAP SuccessFactors expone una entidad llamada "Entidad". Sus propiedades se exponen como valor de tipo complejo incrustado en el cuerpo de respuesta de "Entidad". Por lo tanto, se pueden exponer diferentes formas de metadatos sin modificar el formato de metadatos OData estándar. Puede acceder a los nuevos metadatos del mismo modo que accedería a una entidad normal. Además, admite un filtro simple para emitir metadatos de una entidad específica.
Los metadatos se pueden obtener mediante la API de OData mediante $metadata en la llamada https. Puede solicitar los metadatos a través de Firefox Rest Client. Dado que los datos son un poco grandes para los metadatos, la solicitud puede tardar más tiempo.

Metadatos de API: carga en Excel
Funciones de la API de OData
Funciones de API de OData - $format
Seleccione el botón de reproducción para obtener información sobre el parámetro $format.
Funciones de API de OData: $filter y $select
Opciones y parámetros de filtro
El siguiente ejemplo muestra un ejemplo de consulta de la API de OData mediante filtro y seleccione. Para el filtro podemos dar un valor especificado a un campo para consultar en la entidad correspondiente. Para la selección también podemos definir los campos para devolver la respuesta.
- $filter=personIdExternal%20eq%20’greinhard’
%20 es un carácter de escape especial para espacio; como %28 y %29 para paréntesis como "(" y ")"
Los operadores disponibles son EQ,NE,GT,GE,LT,GT y se pueden combinar con NOT, AND y OR
$select=firstName define los campos que se devolverán separados por espacios

Funciones de la API de OData - $expand
En el siguiente ejemplo se muestra cómo utilizar el parámetro de expandir. Despliegue siempre utilizado para navegar a otra entidad.

Expandir los datos: navegar por el modelo de datos
- $expand=personNav
- $select=firstName,personNav
despliega firstName en el recurso raíz y todos los campos en la persona del recurso navegada
$select=firstName,personNav/dateOfBirth
despliega firstName en el recurso raíz y todos los campos en la persona del recurso navegada

Funciones de la API de OData: $expand y $filter

El ejemplo anterior nos muestra cómo utilizar el parámetro de $expand y $filter
La respuesta identifica un conjunto de entidades de usuario cuya propiedad personNav/emailNav es emailAddress que es igual a gerald.reinhard@sap.com. Después de recuperar las entidades, la respuesta elimina las columnas no seleccionadas. A continuación, la opción $deploy despliega las columnas seleccionadas que es una propiedad de navegación
Filtrado profundo mediante $filter y $expand
- $expand realizado después del filtro independientemente el uno del otro (ver el resultado de la siguiente diapositiva)
- $select no es necesario para los atributos filtrados

Filtrar+Desplegar
- Filtro aplicado al recurso raíz
- Desplegar aplicado a recurso raíz filtrado
- Resultado: el correo electrónico expandido no coincide con el filtro

Funciones de la API de OData: tratamiento de fechas

El siguiente contenido describe cómo consultar entidades con fecha efectiva, para utilizar fromDate y toDate devolverá todos los datos históricos de la entidad raíz en la respuesta. Pero si la entidad raíz no es una fecha efectiva, fromDate y toDate se aplicarán a la siguiente entidad con fecha efectiva en la jerarquía de navegación, y se devolverán todos los registros con fecha efectiva que caigan en el intervalo de tiempo entre fromDate y toDate.
Además, si se devuelven datos históricos de un registro con fecha efectiva y se realiza una navegación/expansión de esos registros a otro registro con fecha efectiva, se utilizará la fecha de inicio de la primera entidad con fecha efectiva para filtrar el segundo.
toDate y fromDate
- Para que las entidades con fecha efectiva le indiquen a la API que devuelva todos los datos históricos de la entidad raíz en la respuesta.
- Si la entidad raíz no tiene fecha de entrada en vigor toDate y fromDate se aplicará a la siguiente entidad con fecha de entrada en vigor en la jerarquía de navegación:
- https://salesdemo4.successfactors.com:443/odata/v2/PerPerson? $filter=employmentNav/jobInfoNav/userId%20eq%20'greinhard‘ &fromDate=1900-01-01 &$select=employmentNav/jobInfoNav/startDate,employmentNav/jobInfoNav/departmentNav/externalCode &$expand=employmentNav/jobInfoNav/departmentNav/departmentNav
- Se devolverán todos los registros con fecha efectiva comprendidos en el intervalo de tiempo entre fromDate y toDate.
Combinación de toDate y fromDate y navegación
- Si se devuelven datos históricos de un registro con fecha efectiva y se realiza una navegación/expansión de esos registros a otro registro con fecha efectiva, se utilizará la fecha de inicio de la primera entidad con fecha efectiva para filtrar el segundo.
- https://salesdemo4.successfactors.com:443/odata/v2/EmpJob? $filter=userId%20eq%20'greinhard'&fromDate=1900-01-01 &$select=startDate,departmentNav/externalCode &$expand=departmentNav
Describe cómo consultar entidades con fecha efectiva para utilizar fromDate y toDate devolverá todos los datos históricos de la entidad raíz en la respuesta. Pero si la entidad raíz no es una fecha efectiva, fromDate y toDate se aplicarán a la siguiente entidad con fecha efectiva en la jerarquía de navegación, y se devolverán todos los registros con fecha efectiva que caigan en el intervalo de tiempo entre fromDate y toDate.
Además, si se devuelven datos históricos de un registro con fecha efectiva y se realiza una navegación/expansión de esos registros a otro registro con fecha efectiva, se utilizará la fecha de inicio de la primera entidad con fecha efectiva para filtrar el segundo
Utilizar las últimas consultas modificadas para recuperar registros modificados para cargas delta
- Eliminaciones parciales no admitidas para entidades sin fecha efectiva como PerEmail, PerPhone
- La eliminación completa aún no es compatible con ninguna API
- lastModifiedOn (huso horario del servidor) lastModifiedDateTime (UTC)

Funciones de la API de OData: paginación
- La API de OData proporciona varias opciones de paginación para los resultados de la consulta.
- Una única solicitud HTTP GET de OData puede devolver como máximo 1.000 registros. Esto es razonable porque la mayoría de los clientes HTTP tienen un límite de tiempo de espera de 2 a 5 minutos.
- Una solicitud que se ejecuta durante más tiempo del límite obtiene un error de tiempo de espera HTTP. Por lo tanto, a menudo es necesario ajustar consultas complejas y reducir el tamaño de los datos para que se completen dentro de la restricción de tiempo de espera.
El cliente puede elegir entre dos tipos de paginación:
- Paginación de cliente
- Paginación del servidor
- La paginación de cliente es el mecanismo de paginación más fundamental. Utiliza opciones de consulta en el lado del cliente para crear un "offset" que restringe la cantidad de datos devueltos por el servidor. Un cliente utiliza el siguiente parámetro URI.
- Un cliente utiliza el siguiente parámetro URI:
- El parámetro $top indica el número de registros que se devolverán en el lote. El número predeterminado y máximo es de 1.000 registros.
- El parámetro $skip indica el número de registros en el conjunto de datos completo que se omitirá antes de obtener los datos.
- Por ejemplo, una consulta con $skip=2000&$top=500 devuelve la quinta página de datos donde el tamaño de página es 500.

- A diferencia de la paginación de cliente, donde la paginación se controla mediante parámetros especificados por el cliente, la paginación del servidor se controla en el lado del servidor.
- Existen dos tipos de paginación de servidor: paginación basada en cursor y paginación basada en instantánea. Ambos tipos de paginación devuelven un parámetro "__next" al final de cada respuesta de consulta que contiene un valor $skiptoken que indica la siguiente página de datos.
- La paginación basada en cursores mantiene un "cursor" de base de datos en el servidor a lo largo de las solicitudes HTTP de paginación. El cursor representa un puntero al inicio de la página siguiente en el conjunto de datos completo. Esto se activa mediante el parámetro &paging=cursor URI.
- La paginación de instantáneas funciona guardando de forma persistente una lista de todas las claves empresariales del conjunto de datos en el servidor. Esto se activa mediante el parámetro URI &paging=snapshot.
Cuándo utilizar los diferentes tipos de paginación:
- Para el consumo de IU, utilice la paginación de offset de cliente. Este es el único método admitido en la IU.
- La paginación basada en cursores y la paginación basada en instantáneas se recomiendan para los casos de uso de integración.
- Le recomendamos que ajuste sus consultas cuando utilice la paginación basada en instantáneas. Si tiene problemas con el rendimiento de la primera página para conjuntos de datos extremadamente grandes, cambie a la paginación basada en cursores, si procede.
Por último, hemos optimizado las entidades OData FOLocation y FOPayGrade para la paginación basada en instantáneas para mejorar el rendimiento.
Otras funciones
Algunas funciones básicas adicionales
- $top y $skip para paginación basada en consumidor
- Operador IN en filtros
- Entidad y $metadata en entidad
- Importaciones de funciones de flujo de trabajo
- Actualización de metadatos como API
Se puede aplicar un filtro para que en las consultas de la API de OData de EC pueda excluir datos de usuario externos (no de EC).
Para que esto sea posible, se pueden seleccionar los siguientes campos booleanos y utilizarlos con $filter;
- isECRecord para EmpEmployment e includeAllRecords para EmpEmployment, PerPersonal, PerAddressDEFLT, PerPerson, PerEmail, PerPhone.
- Anteriormente, el comportamiento predeterminado era excluir datos de usuario que no eran de EC de EmpEmployment y PerPersonal, pero ahora puede sustituir este comportamiento utilizando estos nuevos campos en su consulta.
Hemos introducido el concepto de un UUID de persona (identificador universal único) para toda SAP SuccessFactors HXM Suite; cuando se crea un nuevo empleado contratado o usuario, el sistema genera este identificador llamado "perPersonUuid". perPersonUuid le permite exponer el UUID de persona para escenarios de integración e importación para todos los empleados (empleados de EC y no EC).
El campo es visible y upsertable en PerPerson, pero no se puede consultar a través de esta entidad. Para que perPersonUuid esté disponible en OData, hemos creado una nueva entidad PersonKey. Esta entidad no se puede consultar directamente, pero puede utilizar $expand con personKeyNav en la entidad Usuario para exponer el perPersonUuid. personKeyNav se expone independientemente de la configuración del modelo de datos, la autorización basada en función o las opciones de aprovisionamiento.
Mejores prácticas y ajuste de API
| Práctica recomendada | Notas adicionales |
|---|---|
| Utilizar la paginación del servidor de instantáneas para casos de uso de integración | Si no se utiliza la paginación del servidor, puede experimentar pérdida de datos o duplicados en su conjunto de resultados si se realizan ediciones simultáneas en la instancia de la empresa. La instantánea a menudo también da como resultado mejoras drásticas en el rendimiento. |
| Utilice "paginación de servidor" para garantizar un conjunto de resultados estable | Consultar solo registros modificados desde su última ejecución en lugar de consultar todos los registros para casos de uso de integración. |
| No intente simular en tiempo real ejecutando jobs con demasiada frecuencia | Consultar por períodos mucho menos de una hora usará demasiados recursos de API y podría acelerarse en el futuro. Ejecutar consultas cortas de 1/minuto puede resultar en una situación de denegación del servidor de servicio, especialmente para consultas complejas que requieren un gran procesamiento de back end. |
| Reutilice una sesión de inicio de sesión en lugar de crear una sesión para cada transacción http o cada página de datos paginados. | |
| Uso de una API para la integración que solo está diseñada para un solo usuario | Ejemplo: Iteración entre todos los usuarios y creación de una sesión para cada usuario. Un ejemplo de esto es la API SFOData.Todo que solo permite consultar datos para un único usuario. La solución correcta es utilizar la nueva autorización "Todo Exportar" de TodoEntryV2. |
| Añadir siempre verificación de errores para operaciones de edición | Verifique cada elemento de la respuesta. Registre las respuestas de error completas en su registro de cliente. Nota: No confíe en los registros de auditoría del Centro de API para comprobar si hay errores. |
| Evitar un tamaño de página demasiado pequeño para los datos paginados | Debe ajustar los tamaños de lote para que sean lo más grandes posible. Nota: Hay un máximo de 1000 tamaños de página. Para transacciones más complejas, es posible que deba reducir este valor para evitar tiempos de espera http. |
| Evitar sentencias $expand de OData de gran tamaño | Un ejemplo de esto es un intento de consultar todas las JobRequistions y, a continuación, expandir todas las JobApplications y todos los adjuntos para cada aplicación. Nota: Esto expande mi capacidad de estrangularse en el futuro, donde se puede devolver un error "Demasiado Complejo" o "Demasiado grande". |
| Evite un rendimiento deficiente manteniendo las transacciones simples. | Un rendimiento deficiente suele ser un signo de uso indebido de una API. |
| Evitar el enhebrado múltiple excesivo | Esto puede causar problemas en el servidor y un comportamiento poco fiable. A menudo, el subproceso no mejorará el rendimiento, ya que puede causar contención de la tabla de datos. Nota: Este enhebrado puede estar limitado por la limitación en el futuro para proteger los servidores. |
| Evitar API obsoletas | SFAPI (excepto CompoundEmployee) y SFAPI Adhoc han quedado obsoletos. Utilice OData con paginación de instantánea. |
| No consulte propiedades y entidades desplegadas que no necesite ni use | Es fácil crear una consulta que haga más $select y más $expand de lo que necesita. Nota: Integration Center evita esto, en lugar de que un desarrollador cree una consulta manualmente basada en la asignación de campos, IC genera la consulta basada en la asignación. |
| Ajuste el tiempo de espera del cliente para que coincida con el tiempo de espera del sistema | Su cliente debe estar configurado para esperar un período de tiempo razonable antes de que se agote el tiempo de espera. Las operaciones largas pueden ejecutarse durante 7 minutos y nuestra red y servidores continuarán procesando una transacción durante tanto tiempo. Es mejor esperar a que se complete la transacción (en lugar de simplemente desperdiciar la transacción sin esperar a que se complete). Nota: También puede simplificar su transacción para evitar tiempos de espera en primer lugar. |
| Utilizar herramientas de API como Data Model Navigator para ajustar consultas | El Navegador de modelos de datos puede revelar fácilmente las relaciones disponibles a otras entidades, simplificando potencialmente su caso de uso, mientras que el modo de vista previa del Centro de integración puede confirmar que sus resultados incluyan los datos adecuados en sus respuestas. |
| Seleccione la entidad base OData óptima | OData ofrece mucha flexibilidad para basar una consulta, pero es importante elegir el mejor para su caso de uso. Por ejemplo, PerPerson es una entidad inicial mejor que PerPersonal. El uso de este último aumenta la longitud de todas las rutas de expansión al correo electrónico, etc. y da como resultado un rendimiento deficiente. |
No extraiga muchos registros 1 a la vez con consultas de clave de predicado o singleton $filter en lugar de por lote o utilizando la cláusula $filter IN | Esto sucede a menudo consultando desde una lista de claves, que es una técnica común de "unión en memoria". filtrar con una cláusula clave que verifica solo una instancia de entidad individual, es decir, &$filter=<clave> eq <valor clave> 2. Predicar consultas clave como /odata/v2/User(userId='cgrant1') Recomendación: utilice técnicas de unión OData o utilice el operador de filtro IN: $filter=key in ('cgrant1',mhoff1',....) |
Ejecutar una consulta API OData simple utilizando el cliente REST avanzado
Resumen del proceso
Esta simulación muestra los pasos de configuración básicos necesarios para configurar manualmente la configuración para SAP SuccessFactors Employee Central. Obtendrá los conocimientos básicos de la llamada y las herramientas de la API de OData. Cómo supervisar las API para diferentes socios.
Prerrequisitos
La siguiente configuración y personalización deben haberse completado antes de implementar la configuración básica en SAP SuccessFactors.
- Acceso a SFAPI de OData
- Acceso al log de audio
- Acceso a herramientas de API
Resultado
Como parte de esta demostración, cubriremos la sección de configuración en EC, que es: Aspectos básicos de la API de EC OData - Cliente REST.