Überblick über die API-Technologie
EC-API-Konfiguration einrichten
Verwenden von OData-API-Aufrufen und -Tools
EC-OData-API-Funktionen optimieren
EC-OData-Schreiboperation durchführen
Integrations-Center verwalten
Externe Ereignisbenachrichtigung konfigurieren
Monitoring-APIs
Anhang wird analysiert

Analysieren der EC-OData-API-Performance

Objective

After completing this lesson, you will be able to ermitteln Sie, welche Arten von API-Werkzeugen in SAP SuccessFactors Employee Central verfügbar sind.

Einführung

Im Folgenden finden Sie eine Übersicht über die EC OData API Basics.

Aufgezeichnetes Webinar: EC-OData-API-Funktionen

Testmandant

Es werden drei Test-Clients für das EC-OData-API eingeführt. Die erste ist die SOAP-UI, sie kann sowohl für SOAP als auch für REST verwendet werden und ermöglicht das Anlegen komplexer Testskripte einschließlich Ladetests. Der zweite ist der JMeter. Er kann auch sowohl für SOAP als auch für REST/OData verwendet werden. Die letzte ist der Firefox-REST-Client und kann für jedes REST-basierte API einschließlich OData verwendet werden.

SOAP-UI

  • Holen Sie sich es hier:API Testing Tool | SoapUI
  • Kann sowohl für SOAP als auch für Rest/OData verwendet werden
  • Ermöglicht die Erstellung komplexer Testskripte einschließlich Ladetests

JMeter

Firefox-Addon-REST-Client

  • Hier geht's: Firefox RESTClient
  • Kann für jedes REST-basierte API einschließlich OData verwendet werden

Grundlegende Authentifizierung

Wie wir wissen, gibt es die Identitätsauthentifizierung, wenn wir das OData-API aufrufen. Wir können sie Standardauthentifizierung nennen. Im Allgemeinen wird die Authentifizierung mit dem HTTPS-Header über den Parameter Authorization gesendet. Base-64-Kodierungszeichenfolge username@companyId:passwordkombiniert mit dem Wort Basic und einem vorangestellten Leerzeichen. (Tatsächlich stellen alle Test-Clients den Parameter für die Autorisierung bereit. Wir müssen lediglich den Benutzernamen@companyId und das Kennwort festlegen. Anschließend wird die Base-64-Kodierungszeichenfolge automatisch gemäß Ihrer Eingabe in der Berechtigung angelegt.)

  1. Authentifizierung mit dem HTTP-Header über den Parameter Berechtigung senden
  2. base64 encode string user@company:password(e.g. admin@ACE123:secret).
  3. Kombiniert mit dem Wort Basic und einem Leerzeichen davor
  4. Base64-Encoder in Notepad++ verfügbar
SAP-Query-Beispiel für PerPersonal -Ressource, die nach externer Personen-ID filtert, und zeigt die GET-Anforderung mit dem Kopf Basisberechtigung an.

OAuth mit SAML-Assertions

Siehe OData-Dokumentation

Vorgänge und Ressourcen

HTTP GET, PUT, POST, DELETE

OData-API unterstützt einige HTTP-Operationen wie GET, POST, PUT, PATCH und DELETE. Wir verwenden die grundlegenden Operationen, um Entitäten wie Benutzer, PerPerson, Auswahlliste usw. in EC abzurufen oder zu bearbeiten.

HTTP-Operationen

  • GET: Query
  • POST: Anlegen
  • PUT: Aktualisieren
  • PATCH: Teilaktualisierung
  • DELETE: Löschen

HTTP-Ressourcen oder -Services

  • Benutzer, PerPerson, Auswahlliste, Planstelle

HTTP-Parameter

  • Getrennt durch "?" (erste nach Ressource) und Zeichen "&"
  • OData-Standardparameter beginnen mit einem "$"-Zeichen, z.B. $filter oder $select.

XML-Definition von API-Metadaten

  • Kann über den OData-API- $metadata-Aufruf abgerufen werden, kann ein Ergebnis nach dem Download in Excel importiert werden:

Um zusätzliche Informationen wie Sprachbezeichner und Auswahllisten zu erhalten, die über die standardmäßigen OData-Metadaten hinausgehen, stellt SAP SuccessFactors OData Metadaten als Entität bereit. Das SAP-SuccessFactors-OData-API exponiert eine Entität namens 'Entität'. Seine Eigenschaften werden als komplexer Typwert exponiert, der in den Antworttext von 'Entity' eingebettet ist. Verschiedene Formen von Metadaten können somit exponiert werden, ohne das Standard-OData-Metadatenformat zu ändern. Sie können auf die neuen Metadaten wie auf eine reguläre Entität zugreifen. Darüber hinaus unterstützt sie einen einfachen Filter, um Metadaten einer bestimmten Entität auszugeben.

Die Metadaten können über das OData-API durch $metadata im HTTPS-Aufruf erreicht werden. Sie können die Metadaten über den Firefox-REST-Client anfordern. Da die Daten für die Metadaten etwas groß sind, kann der Request mehr Zeit in Anspruch nehmen.

SAP-OData-Request für Metadaten mit der GET-Methode zeigt den Basisberechtigungs-Header im Request-Header-Abschnitt an.

API-Metadaten – Upload in Excel

OData-API-Funktionen

OData-API-Funktionen - $format

Wählen Sie die Wiedergabetaste, um mehr über den Parameter $format zu erfahren.

OData-API-Funktionen - $filter und $select

Filteroptionen und -parameter

Das folgende Beispiel zeigt ein Beispiel für eine OData-API-Abfrage mit Filter und Select. Für den Filter kann ein angegebener Wert für ein Feld angegeben werden, um die entsprechende Entität abzufragen. Für die Auswahl können wir auch die Felder definieren, die die Antwort zurückgeben sollen.

  • $filter=personIdExternal%20eq%20’greinhard’
    • %20 ist ein spezielles Escape-Zeichen für Leerzeichen; wie %28 und %29 für Klammern wie "(" und ")"

    • Verfügbare Operatoren sind EQ,NE,GT,GE,LT,GT und können mit NOT, AND und OR kombiniert werden.

  • $select=firstName definiert Felder, die durch Leerzeichen getrennt zurückgegeben werden sollen

SAP-OData-GET-Anfrage, die PerPersonal -Ressource abfragt.

OData-API-Funktionen - $expand

Das folgende Beispiel zeigt, wie Sie den Parameter von expand verwenden. Expandieren wird immer verwendet, um zu einer anderen Entität zu navigieren.

SAP-OData-GET-Anfrage, die PerPersonal -Ressource nach Vorname und Geburtsdatum abfragt, gefiltert nach externer Personen-ID.

Expandieren der Daten – Navigieren im Datenmodell

  • $expand=personNav
  • $select=firstName,personNav
    • Erweitert firstName in Wurzelressource und alle Felder in navigierter Ressourcenperson

  • $select=firstName,personNav/dateOfBirth

    • Erweitert firstName in Wurzelressource und alle Felder in navigierter Ressourcenperson

JSON-Antwort mit PerPersonal Ressourcendetails: Vorname Gerald und Geburtsdatum als JSON-Datumsobjekt.

OData-API-Funktionen - $expand und $filter

SAP-OData-GET-Anfrage, die PerPersonal -Ressource abfragt.

Das obige Beispiel zeigt, wie Sie die Parameter $expand und $filter verwenden.

Die Antwort identifiziert eine Reihe von Benutzerentitäten, deren Eigenschaft personNav/emailNav emailAddress ist, die gleich gerald.reinhard@sap.com ist. Nachdem die Entitäten abgerufen wurden, entfernt die Antwort nicht ausgewählte Spalten. Anschließend expandiert die Option $expand die ausgewählten Spalten, bei denen es sich um eine Navigationseigenschaft handelt.

Tiefe Filterung mit $filter und $expand

  • $expand nach Filter unabhängig voneinander ausgeführt (siehe Ergebnis nächste Folie)
  • $select für gefilterte Attribute nicht erforderlich
SAP-OData-GET-Anfrage, die PerPersonal -Ressource abfragt.

Filtern+Aufklappen

  • Filter auf Wurzelressource angewendet
  • Auf gefilterte Wurzelressource angewendete Erweiterung
  • Ergebnis: Erweiterte E-Mail stimmt nicht mit Filter überein
JSON-Antwort zeigt PerPersonal -Ressource an.

OData-API-Funktionen – Verarbeitung von Datumsangaben

SAP-OData-GET-Request fragt EmpJob-Ressource ab.

Der folgende Inhalt beschreibt, wie Sie Entitäten mit Gültigkeitsdatum abfragen. Um fromDate und toDate zu verwenden, werden alle historischen Daten der Wurzelentität in der Antwort zurückgegeben. Wenn die Wurzelentität jedoch kein Gültigkeitsdatum ist, werden fromDate und toDate auf die nächste Entität mit Gültigkeitsdatum in der Navigationshierarchie angewendet, und alle Datensätze mit Gültigkeitsdatum, die in das Zeitintervall zwischen fromDate und toDate fallen, werden zurückgegeben.

Wenn auch historische Daten eines Datensatzes mit Gültigkeitsdatum zurückgegeben werden und eine Navigation/Expansion von diesen Datensätzen zu einem anderen Datensatz mit Gültigkeitsdatum erfolgt, wird das Startdatum der ersten Entität mit Gültigkeitsdatum verwendet, um die zweite Entität zu filtern.

toDate und fromDate

  • Für Entitäten mit Stichtag, um das API anzuweisen, alle historischen Daten der Wurzelentität in der Antwort zurückzugeben.
  • Wenn die Wurzelentität kein Gültigkeitsdatum toDate ist und fromDate auf die nächste Entität mit Gültigkeitsdatum in der Navigationshierarchie angewendet wird:
    • 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=arbeitsplymentNav/jobInfoNav/departmentNav
  • Alle Datensätze mit Stichtag, die in das Zeitintervall zwischen fromDate und toDate fallen, werden zurückgegeben.

Kombination aus toDate und fromDate und Navigation

  • Wenn historische Daten eines Datensatzes mit Gültigkeitsdatum zurückgegeben werden und eine Navigation/Expansion von diesen Datensätzen zu einem anderen Datensatz mit Gültigkeitsdatum erfolgt, wird das Startdatum der ersten Entität mit Gültigkeitsdatum verwendet, um die zweite Entität zu filtern.
    • https://salesdemo4.successfactors.com:443/odata/v2/EmpJob? $filter=userId%20eq%20'greinhard'&fromDate=1900-01-01 &$select=startDate,departmentNav/externalCode &$expand=departmentNav

Hier wird beschrieben, wie Sie Entitäten mit Gültigkeitsdatum abfragen. Wenn Sie fromDate und toDate verwenden, werden alle historischen Daten der Wurzelentität in der Antwort zurückgegeben. Wenn die Wurzelentität jedoch kein Gültigkeitsdatum ist, werden fromDate und toDate auf die nächste Entität mit Gültigkeitsdatum in der Navigationshierarchie angewendet, und alle Datensätze mit Gültigkeitsdatum, die in das Zeitintervall zwischen fromDate und toDate fallen, werden zurückgegeben.

Wenn auch historische Daten eines Datensatzes mit Gültigkeitsdatum zurückgegeben werden und eine Navigation/Expansion von diesen Datensätzen zu einem anderen Datensatz mit Gültigkeitsdatum erfolgt, wird das Startdatum der ersten Entität mit Gültigkeitsdatum verwendet, um die zweite Entität zu filtern.

Zuletzt geänderte Abfragen verwenden, um geänderte Datensätze für Deltadatenübernahmen abzurufen

  • Teilweise Löschungen werden für Entitäten ohne Gültigkeitsdatum wie PerEmail, PerPhone nicht unterstützt.
  • Vollständige Löschung wird noch von keinem API unterstützt
  • lastModifiedOn (Server-Zeitzone) lastModifiedDateTime (UTC)
SAP-OData-Query-Filterung FODepartment.

OData-API-Funktionen – Paginierung

  • Das OData-API bietet mehrere Paginierungsoptionen für Abfrageergebnisse.
  • Ein einzelner OData-HTTP-GET-Request kann maximal 1.000 Datensätze zurückgeben. Dies ist sinnvoll, da die meisten HTTP-Clients ein Timeout-Limit von 2 bis 5 Minuten haben.
  • Ein Request, der länger als das Limit läuft, erhält einen HTTP-Timeout-Fehler. Daher ist es häufig erforderlich, komplexe Abfragen zu optimieren und die Datengröße zu verringern, damit sie innerhalb der Timeout-Einschränkung abgeschlossen werden können.

Der Kunde kann zwischen zwei Arten der Paginierung wählen:

  • Client-Paginierung
  • Serverpaginierung
  • Die Client-Paginierung ist der grundlegendste Paginierungsmechanismus. Sie verwendet Abfrageoptionen auf Client-Seite, um einen "Offset" zu erstellen, der die vom Server zurückgegebene Datenmenge einschränkt. Ein Client verwendet den folgenden URI-Parameter.
  • Ein Client verwendet den folgenden URI-Parameter:
    • Der Parameter $top gibt die Anzahl der Datensätze an, die im Batch zurückgegeben werden sollen. Der Standardwert und die maximale Anzahl sind 1.000 Datensätze.
    • Der Parameter $skip gibt die Anzahl der Datensätze im vollständigen Datensatz an, die vor dem Abrufen der Daten übersprungen werden sollen.
  • Beispiel: Eine Abfrage mit $skip=2000&$top=500 gibt die 5. Seite der Daten zurück, wobei die Seitengröße 500 beträgt.
SAP-OData-GET-Anfrage für Ressource EmpEmployment.
  • Im Gegensatz zur Client-Paginierung, bei der die Paginierung durch vom Client angegebene Parameter gesteuert wird, wird die Serverpaginierung serverseitig gesteuert.
  • Es gibt zwei Arten der Serverpaginierung: Cursor-basierte Paginierung und Snapshot-basierte Paginierung. Beide Arten der Paginierung geben einen „__next"-Parameter am Ende jeder Abfrageantwort zurück, der einen $skiptoken-Wert enthält, der die nächste Datenseite angibt.
  • Die Cursor-basierte Paginierung pflegt einen Datenbank-"Cursor" auf dem Server während der Paginierungs-HTTP-Anforderungen. Der Cursor stellt einen Zeiger auf den Anfang der nächsten Seite im gesamten Datensatz dar. Dies wird mit dem Parameter &paging=cursor URI aktiviert.
  • Die Snapshot-Paginierung funktioniert, indem eine Liste aller Geschäftsschlüssel des Datensets auf dem Server persistiert wird. Dies wird über den URI-Parameter &paging=snapshot aktiviert.

Wann Sie die verschiedenen Arten der Paginierung verwenden sollten:

  • Verwenden Sie für die UI-Nutzung die Client-Offset-Paginierung. Dies ist die einzige unterstützte Methode auf der Benutzungsoberfläche.
  • Für Integrationsanwendungsfälle werden eine Cursor-basierte Paginierung und eine Snapshot-basierte Paginierung empfohlen.
  • Wir empfehlen Ihnen, Ihre Abfragen zu optimieren, wenn Sie die Snapshot-basierte Paginierung verwenden. Wenn Sie bei sehr großen Datensätzen Probleme mit der Performance der ersten Seite haben, wechseln Sie ggf. zur cursorbasierten Paginierung.

Zu guter Letzt haben wir die OData-Entitäten FOLocation und FOPayGrade für die Snapshot-basierte Paginierung optimiert, um die Performance zu verbessern.

Weitere Funktionen

Einige zusätzliche Basisfunktionen

  • $top und $skip für verbraucherbasiertes Paging
  • IN-Operator in Filtern
  • "Entity"-Entity und $metadata auf Entität
  • Workflow-Funktionsimporte
  • Metadatenaktualisierung als API

Ein Filter kann angewendet werden, sodass Sie in EC-OData-API-Abfragen externe (Nicht-EC-)Benutzerdaten ausschließen können.

Um dies zu ermöglichen, können die folgenden booleschen Felder ausgewählt und mit $filter verwendet werden:

  • isECRecord für EmpEmployment und includeAllRecords für EmpEmployment, PerPersonal, PerAddressDEFLT, PerPerson, PerEmail, PerPhone.
  • Bisher bestand das Standardverhalten darin, Nicht-EC-Benutzerdaten aus EmpEmployment und PerPersonal auszuschließen. Nun können Sie dieses Verhalten jedoch mit diesen neuen Feldern in Ihrer Abfrage überschreiben.

Wir haben das Konzept einer Personen-UUID (eindeutige universelle ID) für die gesamte SAP SuccessFactors HXM Suite eingeführt. Wenn ein neuer Mitarbeiter oder Benutzer angelegt wird, generiert das System diese ID – „perPersonUuid". Mit perPersonUuid können Sie die Personen-UUID für Integrations- und Importszenarios für alle Mitarbeiter (EC- und Nicht-EC-Mitarbeiter) exponieren.

Das Feld ist in PerPerson sichtbar und in der Upser-Tabelle enthalten, kann jedoch nicht über diese Entität abgefragt werden. Um perPersonUuid in OData verfügbar zu machen, wurde die neue Entität PersonKey angelegt. Diese Entität kann nicht direkt abgefragt werden, aber Sie können $expand mit personKeyNav in der Benutzerentität verwenden, um perPersonUuid bereitzustellen. personKeyNav wird unabhängig von der Datenmodellkonfiguration, RBB oder den Provisionierungseinstellungen exponiert.

API-Optimierung und Best Practices

Best PracticeZusätzliche Hinweise
Snapshot-Server-Paginierung für Integrationsanwendungsfälle verwendenWenn die Serverpaginierung nicht verwendet wird, kann es zu Datenverlust oder Duplikaten in Ihrer Ergebnismenge kommen, wenn gleichzeitig Änderungen in der Firmeninstanz erfolgen. Schnappschuss führt häufig auch zu drastischen Performanceverbesserungen.
"Server-Paginierung" verwenden, um eine stabile Ergebnismenge sicherzustellenEs werden nur Datensätze abgefragt, die seit Ihrer letzten Ausführung geändert wurden, anstatt alle Datensätze für Integrationsanwendungsfälle abzufragen.
Versuchen Sie nicht, in Echtzeit zu simulieren, indem Sie Jobs zu oft ausführen.Bei Abfragen für Zeiträume von deutlich weniger als einer Stunde werden zu viele API-Ressourcen verbraucht und in Zukunft möglicherweise gedrosselt. Das Ausführen kurzer 1/Minuten-Abfragen kann zu einer Denial-of-Service-Server-Situation führen, insbesondere bei komplexen Abfragen, die eine große Backend-Verarbeitung erfordern.
Verwenden Sie eine Anmeldesitzung wieder, anstatt für jede HTTP-Transaktion oder jede Seite paginierter Daten eine Sitzung anzulegen. 
Verwendung eines APIs für die Integration, das nur für einen einzelnen Benutzer konzipiert istBeispiel: Benutzerübergreifendes Iterieren und Erstellen einer Sitzung für jeden Benutzer.

Ein Beispiel hierfür ist das SFOData.Todo-API, das nur die Abfrage von Daten für einen einzelnen Benutzer zulässt.

Die korrekte Lösung besteht darin, die neue Berechtigung TodoEntryV2 "Todo Export" zu verwenden.

Immer Fehlerprüfung für Bearbeitungsvorgänge hinzufügen

Prüfen Sie für jede Position in der Antwort. Protokollieren Sie vollständige Fehlerantworten in Ihrem Client-Protokoll.

Hinweis: Verlassen Sie sich bei der Prüfung auf Fehler nicht auf die Audit-Protokolle des API Centers.

Zu kleine Seitengröße für paginierte Daten vermeiden

Sie sollten Ihre Chargengrößen so groß wie möglich einstellen.

Hinweis: Es gibt maximal 1000 Seiten. Bei komplexeren Transaktionen müssen Sie diesen Wert möglicherweise verringern, um HTTP-Timeouts zu vermeiden.

Große OData-$expand-Anweisungen vermeiden

Ein Beispiel hierfür ist der Versuch, alle JobRequistions abzufragen und dann alle JobApplications und alle Anhänge für jede Bewerbung aufzuklappen.

Hinweis: Dies erweitert meine zukünftige Drosselung, bei der ein "zu komplexer" oder "zu großer" Fehler zurückgegeben werden kann.

Vermeiden Sie schlechte Performance, indem Sie Transaktionen einfach halten.Schlechte Performance ist oft ein Anzeichen für einen Missbrauch einer API.
Übermäßiges Multi-Threading vermeiden

Dies kann zu Serverproblemen und unzuverlässigem Verhalten führen. Oft verbessert Threading die Performance nicht, da dies zu Datentabellenkonflikten führen kann.

Hinweis: Ein solches Threading kann in Zukunft zum Schutz von Servern durch Drosselung eingeschränkt werden.

Veraltete APIs vermeidenSFAPI (außer CompoundEmployee) und SFAPI Adhoc wurden abgekündigt. Verwenden Sie OData mit Snapshot-Paginierung.
Sie dürfen keine Eigenschaften und erweiterten Entitäten abfragen, die Sie nicht benötigen oder verwenden.

Es ist einfach, eine Abfrage zu erstellen, die mehr $select und mehr $expand ausführt, als Sie benötigen.

Hinweis: Das Integration Center vermeidet dies. Anstatt eine Abfrage manuell basierend auf der Zuordnung von Feldern zu erstellen, generiert IC die Abfrage basierend auf der Zuordnung.

Passen Sie die Client-Wartezeit an die Systemwartezeit an.

Ihr Client sollte so eingestellt sein, dass er eine angemessene Zeit wartet, bevor es zu einer Zeitüberschreitung kommt. Langer Betrieb kann bis zu 7 Minuten dauern und unser Netzwerk und unsere Server werden eine Transaktion so lange verarbeiten.

Am besten warten Sie, bis die Transaktion abgeschlossen ist (anstatt nur die Transaktion zu verschwenden, ohne darauf zu warten, dass sie abgeschlossen ist).

Hinweis: Sie können auch Ihre Transaktion vereinfachen, um Timeouts überhaupt zu vermeiden.

API-Werkzeuge wie den Datenmodellnavigator zum Optimieren von Abfragen verwendenDer Datenmodellnavigator kann leicht verfügbare Beziehungen zu anderen Entitäten aufdecken, was Ihren Anwendungsfall möglicherweise vereinfacht, während der Vorschaumodus des Integrationscenters bestätigen kann, dass Ihre Ergebnisse die richtigen Daten in Ihren Antworten enthalten.
Wählen Sie die optimale OData-Basisentität aus.OData bietet viel Flexibilität, um eine Abfrage zu erstellen. Es ist jedoch wichtig, die beste für Ihren Anwendungsfall zu wählen. Beispielsweise ist PerPerson eine bessere Startentität als PerPersonal. Die Verwendung von Letzterem erhöht die Länge aller Erweiterungspfade zu E-Mail usw. und führt zu einer schlechten Performance.

Ziehen Sie nicht viele Datensätze auf einmal mit Prädikatschlüssel- oder Singleton $filter-Abfragen statt per Batch oder mit der $filter-IN-Klausel.

Dies geschieht häufig durch Abfragen aus einer Liste von Schlüsseln, bei der es sich um eine gängige In-Memory-Join-Technik handelt.

Filter mit einer Schlüsselklausel, die nur auf eine einzelne Entitätsinstanz prüft, d.h. &$filter=<Schlüssel> eq <Schlüsselwert>

2. Prädikatschlüsselabfragen wie /odata/v2/User(userId='cgrant1')

Empfehlung: Verwenden Sie OData-Join-Techniken oder den IN-Filteroperator: $filter=key in ('cgrant1',mhoff1',....)

Einfache OData-API-Abfrage mit erweitertem REST-Client ausführen

Prozessübersicht

Diese Simulation zeigt die grundlegenden Konfigurationsschritte, die erforderlich sind, um die Konfiguration für SAP SuccessFactors Employee Central manuell einzurichten. Sie erhalten die Grundkenntnisse des OData-API-Aufrufs und der Werkzeuge. Überwachen der APIs für verschiedene Partner.

Voraussetzungen

Die folgende Konfiguration und Anpassung müssen abgeschlossen sein, bevor die Grundeinstellungen in SAP SuccessFactors implementiert werden können.

  • Zugriff auf OData SFAPI
  • Zugriff auf Audioprotokoll
  • Zugriff auf API-Tools

Ergebnis

Im Rahmen dieser Demonstration wird der Konfigurationsabschnitt in EC behandelt: EC OData API Basics - REST Client.