REST-API-Empfehlungen im Jitterbit App Builder
Übersicht
Dieses Dokument bietet Entwicklern, die eine mit dem App Builder kompatible REST-API implementieren möchten, Orientierung.
Für die Zwecke dieses Dokuments gehen wir davon aus, dass der Entwickler sich auf die Erstellung eines CRUD-REST-Dienstes konzentriert. Viele der Prinzipien, die in einer CRUD-API verwendet werden, sind auch auf andere APIs anwendbar. Eine CRUD-API wird jedoch wahrscheinlich die umfassendsten Anforderungen haben, die mit dem App Builder interagieren (Seiten, Suchen, Filtern usw.).
RESTful Designprinzipien
Soweit möglich, folgt die REST-API des App Builders diesen RESTful-Prinzipien:
- Dienste sind zustandslos.
- Endpunkte werden als Ressourcen modelliert.
- GET-Operationen sind sicher. Eine "sichere" Operation ist eine, die keine Nebenwirkungen hat. Zum Beispiel ändert das Abrufen einer Liste von Kunden nicht die Liste der Kunden.
- DELETE-Operationen sind unsicher, aber idempotent. Während die erste (erfolgreiche) Anfrage zum Löschen eines Elements einen 200-Statuscode zurückgibt, wird die zweite Anfrage einen 404-Statuscode zurückgeben.
- POST-Operationen sind weder sicher noch idempotent. Aus diesem Grund können POST-Operationen teilweise Daten enthalten.
- HTTP-Statuscodes zeigen an, ob ein Fehler aufgetreten ist.
- Medientypen werden verwendet, um eine Inhaltsverhandlung durchzuführen. Momentan unterstützt der App Builder jedoch nur JSON (application/json) und UTF-8.
Der App Builder hält sich nicht an alle RESTful-Prinzipien:
- Ressourcenanforderungs- und -antwortkörper sind in einem Umschlag verpackt. Dies ermöglicht es dem App Builder, zusätzliche Informationen wie Ereignisnachrichten und Validierungsergebnisse einzuschließen.
- Ressourcenantworten sind keine Hypermedia: Sie enthalten keine Links zu anderen Ressourcen.
Umschlag
Die Anforderungs- und Antwortkörper der REST-API des App Builders sind in einem Umschlag verpackt. Umschläge ermöglichen es, Daten zu einem und von einem API-Endpunkt außerhalb der Endpunktnutzlast zu senden.
Anforderungs-Körperumschlag
Der Anforderungs-Körper der REST-API des App Builders enthält diese Umschlag-Eigenschaften:
| Eigenschaftsname | Beschreibung |
|---|---|
| item | Die Endpunktnutzlast. |
Beispiel-JSON
{
"item": {}
}
Antwortkörper-Hülle
Der Antwortkörper der App Builder REST API enthält diese Hüllen-Eigenschaften:
| Eigenschaftsname | Beschreibung |
|---|---|
| message | Die Erfolgs- oder Fehlermeldung für das Ereignis. |
| status | Dies ist der (duplizierte) HTTP-Statuscode. |
| validations | Ein Array von Validierungsfehlern/-warnungen für den aufgerufenen Endpunkt. |
| item oder items | Die Payload des Endpunkts - entweder ein einzelnes Element oder eine Sammlung von Elementen. |
Beispiel-JSON
{
"message": "",
"status": 200,
"validations": [],
"items": []
}
Validierungen
Wenn Fehler auftreten, wird ein Validierungsobjekt zum Validierungsarray im Antwortumschlag hinzugefügt. Das Validierungsobjekt hat die folgenden Eigenschaften:
| Eigenschaftsname | Beschreibung |
|---|---|
| message | Die Validierungsnachricht. |
| severity | Die Schwere der Validierung:
|
| field | Das durch die Validierung referenzierte Feld. |
Beispiel-JSON
{
"message": "",
"status": 400,
"validations": [
{
"message": "CustomerId is mandatory.",
"severity": "error",
"field": "customerId"
},
{
"message": "CompanyName is mandatory.",
"severity": "error",
"field": "companyName"
}
],
}
Kernoperationen
Dies sind die grundlegenden Operationen, die Ihr REST-Dienst unterstützen sollte. Einige Dienste entscheiden sich natürlich dafür, bestimmte Methoden nicht zu implementieren (z. B. würde ein schreibgeschützter Dienst nur die Methoden Get Single/Get Many implementieren).
Einzelnes Element abrufen
Die Get Single-Operation gibt einen einzelnen Datensatz zurück. Der Bezeichner für den Datensatz wird in der URL angegeben.
HTTP-Methode
GET
Beispiel-URL
https://example.com/rest/v1/sales/customers/b603b276-a9bf-4328-88ff-8994176c38d1
Beispiel-JSON
{
"item": {
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
}
}
Viele Elemente abrufen
Die Get Many-Operation gibt viele Datensätze für eine Sammlung zurück. Oft wird diese Operation zusammen mit der Paginierung verwendet, um eine Sammlung von Datensätzen durchblättern zu können.
Wenn möglich, sollte eine Anzahl der Datensätze in der Sammlung zurückgegeben werden. Dies ermöglicht es App Builder, die Anzahl der Datensätze in der Benutzeroberfläche anzuzeigen und die Benutzeroberfläche darüber zu informieren, wann das Ende der Sammlung erreicht ist.
HTTP-Methode
GET
Beispiel-URL
https://example.com/rest/v1/sales/customers
Beispiel-JSON
{
"count": 2,
"items": [
{
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
},
{
"customerId": "9775de33-08fc-4cd2-98ef-d91f3d5355b1",
"name": "Sally Keith",
"address": "4500 Neutrino Road"
}
],
// envelope properties
}
Erstellen
Die Erstellen-Operation wird einen neuen Datensatz anlegen. Der Identifikator für den Datensatz befindet sich im JSON-Body.
Beachten Sie, dass der gesamte Datensatz in der Antwort zurückgegeben wird. Dies ist nützlich in Fällen, in denen einige Felder vom Server erstellt oder aktualisiert werden (wie z.B. ein Zeitstempel für die Erstellung des Datensatzes).
HTTP-Methode
POST
Beispiel-URL
https://example.com/rest/v1/sales/customers
Beispiel-Anforderungs-Body JSON
{
"item": {
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
}
}
Beispiel-Antwort-Body JSON
{
"item": {
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
}
// envelope properties
}
Aktualisieren
Die Aktualisieren-Operation wird einen bestehenden Datensatz aktualisieren. Der Identifikator für den Datensatz wird in der URL angegeben.
Beachten Sie, dass der gesamte Datensatz in der Antwort zurückgegeben wird. Dies ist nützlich in Fällen, in denen einige Felder vom Server erstellt oder aktualisiert werden (wie z.B. ein Zeitstempel für die Aktualisierung des Datensatzes).
HTTP-Methode
- PUT - Wird für ein vollständiges Update verwendet. Alle Parameter des Datensatzes müssen angegeben werden.
- POST - Wird für ein partielles Update verwendet. Nur die erforderlichen Parameter des Datensatzes müssen angegeben werden.
Beispiel-URL
https://example.com/rest/v1/sales/customers/b603b276-a9bf-4328-88ff-8994176c38d1
Beispiel-Anforderungs-Body JSON
{
"item": {
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
}
}
Beispiel-Antwort-Body JSON
{
"item": {
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
}
// envelope properties
}
Löschen
Die Löschen-Operation wird einen Datensatz löschen. Der Identifikator für den Datensatz wird in der URL angegeben. Es muss kein Anforderungs-Body für ein DELETE gesendet werden.
HTTP-Methode
DELETE
Beispiel-URL
https://example.com/rest/v1/sales/customers/b603b276-a9bf-4328-88ff-8994176c38d1
Beispiel-Antwort-Body JSON
{
"item": {
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
}
}
Abfrageparameter
Viele abrufen
Auf der Sammlungsebene sollte Ihr REST-Endpunkt die folgenden Funktionen unterstützen.
Paging
Für Sammlungen, die viele Datensätze enthalten, ist es oft notwendig, Paging zu unterstützen. Um Paging zu unterstützen, definiert der App Builder die folgenden Parameter:
| Abfrageparameter | Beschreibung | Beispiel |
|---|---|---|
| $limit | Die maximale Anzahl von Datensätzen, die in einer Anfrage abgerufen werden sollen. | $limit=10 |
| $offset | Ab welchem Datensatz der Abruf beginnen soll. Offsets sind nullbasiert, sodass die Angabe von 0 den ersten Datensatz in der Sammlung abruft. | $offset=10 |
| $count | Ein Boolean, der angibt, ob eine Sammlungsanzahl zurückgegeben werden soll. Im App Builder wird dieser Parameter standardmäßig als falsch betrachtet. | $count=true |
Sortierung
Der App Builder kann eine einfache Sortierung von Feldern unterstützen.
| Abfrageparameter | Beschreibung | Beispiel |
|---|---|---|
| $sort | Eine durch Kommas getrennte Liste von Feldnamen, nach denen sortiert werden soll. Präfixieren Sie den Feldnamen mit einem Minuszeichen (-), um das Feld in absteigender Reihenfolge zu sortieren. Im bereitgestellten Beispiel wird die Sammlung nach Land, absteigend, und Unternehmensname, aufsteigend, sortiert. | $sort=-country,companyName |
Filterung
Der App Builder bietet Unterstützung für eine Abfragefilterzeichenfolge. Die Abfragefilterzeichenfolge unterstützt eine Teilmenge der OData 4.0 Abfragezeichenfolgenspezifikation. Für Stringvergleiche können Platzhalter mit dem Zeichen % angegeben werden.
| Abfrageparameter | Beschreibung | Beispiel |
|---|---|---|
| $filter | Eine OData 4.0-Stil-Abfragezeichenfolge, die Daten filtert | $filter=country eq 'united%' |
Operatoren
Vergleich
| Operator | Beschreibung | Beispiel |
|---|---|---|
| eq | Gleich dem Wert. | categoryId eq 42 |
| neq | Ungleich dem Wert. | categoryId neq 42 |
| gt | Größer als der Wert. | price gt 100 |
| lt | Kleiner als der Wert. | price lt 100 |
| ge | Größer oder gleich dem Wert. | price ge 100 |
| le | Kleiner oder gleich dem Wert. | price le 100 |
| in | Entspricht einem Wert in der Liste. | categoryId in (1, 2, 3) |
Logisch
| Operator | Beschreibung | Beispiel |
|---|---|---|
| und | Logisches UND | price gt 100 and categoryId in (1,2,3) |
Einschränkungen
- Keine arithmetischen Operatoren
- Keine oder/nicht logischen Operatoren
- Keine Gruppierungsoperatoren
- Keine Abfragefunktionen
- Keine Parameter-Aliasnamen
Suche
App Builder bietet einen Mechanismus, um nach Datensätzen in einer Sammlung zu suchen. Diese Suche erfolgt über alle durchsuchbaren Felder des Datensatzes.
App Builder fügt standardmäßig Wildcards am Anfang und Ende der Suchzeichenfolge hinzu.
| Abfrageparameter | Beschreibung | Beispiel |
|---|---|---|
| $q | Eine Suchzeichenfolge, die auf alle durchsuchbaren Spalten eines Datensatzes angewendet wird. | $q=hello |
Typkonventionen
JSON-Typen
Als allgemeine Regel sollten Entwickler die nativen integrierten JSON-Typen bevorzugen. App Builder mappt automatisch native JSON-Typen, sodass die direkte Verwendung von Zahlen, Booleans, Strings und Nullwerten empfohlen wird.
Daten
App Builder kodiert Daten im ISO 8601-Format. Alle Daten werden in UTC serialisiert.
Versionierung
Um zukünftige Inkompatibilitäten zwischen REST-API-Versionen zu behandeln, enthält App Builder eine Versionsnummer direkt in der REST-URL.
Beispiel-URL
https://example.com/rest/v1/...
Optionale Operationen
Weitere Operationen, die für eine CRUD-REST-API nützlich sein können.
Neu
Die neue Operation wird verwendet, um die Standardwerte eines Datensatzes zurückzugeben. Dies wird im Voraus verwendet, um einen Datensatz zu erstellen, wenn einige Daten möglicherweise vom REST-Server vorausgefüllt werden.
HTTP-Methode
- GET
- POST.
Beispiel-URL
https://example.com/rest/v1/sales/customers(new)
Beispiel-Antwortkörper JSON
{
"item": {
"customerId": null,
"daysActive": 0
}
// envelope properties
}
JSON - Umwandlung von relationalen Tabellen
App Builder bietet einen Mechanismus zur Umwandlung zwischen der internen relationalen Tabellenrepräsentation von Daten und dem von REST-Endpunkten erwarteten JSON.
Arrays in Tabellen
Jedes Array in einer JSON-Struktur wird als separate relationale Tabelle innerhalb von App Builder betrachtet.
Daher würde die folgende Umwandlung für einen Endpunkt namens "customers(get)" gelten:
customers(get) JSON
{
"count": 2,
"message": "Sample message",
"status": 200,
"items": [
{
"customerId": "b603b276-a9bf-4328-88ff-8994176c38d1",
"name": "John Henry",
"address": "130 Plutonium Drive"
},
{
"customerId": "9775de33-08fc-4cd2-98ef-d91f3d5355b1",
"name": "Sally Keith",
"address": "4500 Neutrino Road"
}
],
// envelope properties
}
Ergebnisstruktur der Tabelle
"customers(get) "
| Anzahl | Nachricht | Status |
|---|---|---|
| 2 | Beispielnachricht | 200 |
"customers(get)/items"
| customerid | name | adresse |
|---|---|---|
| 9775de33-08fc-4cd2-98ef-d91f3d5355b1 | Sally Keith | 4500 Neutrino Road |
| b603b276-a9bf-4328-88ff-8994176c38d1 | John Henry | 130 Plutonium Drive |
Daten schreiben
Derzeit unterstützt App Builder nur das Schreiben in eine einzelne Tabelle während eines Ereignisses. Da jedes JSON-Array als separate Tabelle betrachtet wird, ist das Schreiben eines gesamten Objekts, das mehrere Arrays in einem einzigen App Builder-Ereignis umfasst, möglicherweise nicht unterstützt.
Daher sollte die Verwendung von JSON-Arrays, wo immer möglich, minimiert oder das Schreiben der Arrays in einem Objekt in einem separaten REST-API-Endpunkt unterstützt werden.
Ein "Kunden"-Objekt kann beispielsweise mehrere Adressen enthalten. Ein Endpunkt zum Schreiben des Kundenobjekts und ein weiterer Endpunkt zum Schreiben der Adressen ermöglichen es App Builder, einfacher mit Ihrer REST-API zu integrieren.