CRUD
Die CRUD-Operationen werden über folgende HTTP-Verben unterstützt:
...
Beispiel Aufruf: GET mit http://rest.i-ag.ch/Land/1 -> Lese Land 1
{
"resource": [{
"type": "object",
"meta": {
"name": "Land",
"description": "",
"properties": [
{
"name": "ID",
"description": "",
"primary": true,
"required": true,
"type": "number"
},{
"name": "Bezeichnung",
"description": "Name",
"type": "string"
},{
"name": "Landadressierung",
"description": "Darstellung Land \/ PLZ \/ Ort",
"type": "string"
}]
},
"data": [[1,"Schweiz","CH"]]
}]
Queries auf Klassen
Beim Lesen (GET-Operation) besteht die Möglichkeit, Daten über Filterparameter einzuschränken:
Rückgabefelder:
Operation | Syntax |
---|---|
Filter auf Feldnamen | ?fields={csv attribut} |
Datenfilter:
Operation | Syntax |
---|---|
Gleichheit | ?{attribut}={wert} |
Grösser | ?{attribut}-max={wert} |
Kleiner | ?{attribut}-min={wert} |
Teil-String, enthält | ?{attribut}-part={wert} |
Max. Anzahl Zeilen | ?maxrows={wert} |
Alle obigen Einschränkungen lassen sich kombinieren, wobei unter den Filtern immer der UND-Operator angewandt wird. Wird bei der Gleichheit ein Feld mehrfach angegeben, wird unter den Werten eine ODER Verknüpfung angewandt, was in SQL einem IN entspricht.
Bsp: ….?feld1=1&feld1=2&feld2-max=77 -> (feld1 = 1 OR feld1 = 2) AND feld2 <= 77
Sortierung:
Operation | Syntax |
---|---|
Sortierung |
|
Besipiel: rest.i-ag.ch/Land?fields=Id,Bezeichnung&id-min=1&id-max=100
...
Die Struktur der Antwort ist identisch zu derjenigen der CRUD-Operationen. Einziger Unterschied ist, dass die "properties"-Sektion durch eine "parameters"-Sektion ersetzt ist.
Zur Leistungsoptimierung können Methoden mit unterschiedlichen Argumenten in einem Aufruf mehrfach aufgerufen werden, indem die Argumente mehrfach übergeben werden. Die Resultate werden in der Data-Sektion der Antwort in derselben Reihenfolge ausgegeben wie die Argumente übergeben worden sind.
Gemäss http-Standards Gemäss http-Standards wird für die sicheren Methoden ein GET-Aufruf verlangt, allfällige Parameter werden in der URL mitgegeben.
...
Der Einfachheit halber wird aktuell nicht nach Idempotenz unterschieden, POST und PUT werden in der API gleich behandelt.
Parameterübergabe
Die Parameter können in folgenden Varianten übergeben werden:
- GET: In der URL form-encoded
- PUT/POST:
- Form-encoded: Im Content
- JSON: als einfaches Objekt (ab Rev. 28507).
Mehrfacher Methoden-Aufruf in einem REST-Aufruf
Zur Leistungsoptimierung können Methoden mit unterschiedlichen Argumenten in einem Aufruf mehrfach aufgerufen werden, indem die Argumente mehrfach übergeben werden. Die Resultate werden in der Data-Sektion der Antwort in derselben Reihenfolge ausgegeben wie die Argumente übergeben worden sind.
Folgende Varianten sind möglich:
- URL & form-encoded: Wiederholung der Parameter-Sets mit identischen Namen:
"paramA=1¶mB=2¶mA=3¶mB=5" - URL & form-encoded: Wiederholung der Parameter-Sets mit indizierten Namen (ab Rev. 28507):
"paramA-0=1¶mB-0=2¶mA-1=3¶mB-1=5" - JSON: Die Parameter-Sets werden als Objekte in einem Array übergeben (ab Rev. 28507):
[
{
"paramA": 1,
"paramB": 2
},
{
"paramA": 3,
"paramB": 5
}
]
Beispiel: Berechnung der VK-Preise von 2 Artikeln in einem Aufruf:
Antwort:
{
"resource": [{
"type": "object",
"meta": {
"name": "GetArtPriceSell",
"description": "",
"parameters": [{
"name": "Price",
"desciption": "",
"required": true,
"type": "number",
"cardinality": 1,
"direction": "out"
},
{
"name": "PriceType",
"desciption": "",
"required": true,
"type": "number",
"cardinality": 1,
"direction": "out"
}]
},
"data": [[4.9,40],[38,40]]
}]
}
...
Das Format der Metadaten wird analog zu den Nutzdaten von Client angefordert.
Beispiel JSON: Tabelle Adresse: rest.i-ag.ch/Adresse/model
{
"resource": [{
"meta": {
"name": "Adresse",
"description": "",
"type": "object",
"properties": [
{
"name": "ID",
"description": "",
"primary": true,
"required": true,
"type": "number"
},{
"name": "ABCEinteilung",
"description": "ABC-Einteilung",
"type": "number"
},{
"name": "AbladevorschriftID",
"description": "Abladevorschrift",
"type": "number",
"links": [
{
"name": "Abladevorschrift",
"resource": "Abladevorschrift",
"cardinality": 1
}]
},{
"name": "AdresseIDNachfolger",
...
...
...
Jede Antwort vom Server wird mit einem Statuscode zurückgegeben. Bei Fehlern wird zusätzlich ein Detailtext zurückgegeben, der genauere Auskunft über die Ursache gibt. Folgende Codes sind implementiert:
Code | Beschreibung |
---|---|
200 Ok | Alles i.O. |
400 Bad Request | Der URL enthält unerlaubte Zeichen, Strukturen, Parameter, oder die Parameter im Body können nicht interpretiert werden. |
401 Unauthorized | Nicht authentifiziert |
403 Forbidden | Nicht autorisiert |
404 Not Found | Die angeforderte Ressource wurde nicht gefunden, z.B. ein Delete auf einen nicht existierenden Datensatz. |
406 Not Acceptable | Der Contenttype (Request oder Response) wird nicht unterstützt. |
409 Conflict | Konflikt in den Daten, DB-Fehler, z.B. Constraintverletzung |
415 Unsupported Media Type | accept- oder content-type-Header der nicht unterstützt wird. |
500 Internal Server Error | System- oder Programmfehler |
501 Not Implemented | Anforderung einer nicht implementierten Funktionalität |