Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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:

OperationSyntax
Filter auf Feldnamen?fields={csv attribut}

 

Datenfilter:

OperationSyntax
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:

OperationSyntax
Sortierung 
  • ?sort={attribut1},{attribut2-asc},{attribut3-desc},…

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&paramB=2&paramA=3&paramB=5" 
  • URL & form-encoded: Wiederholung der Parameter-Sets mit indizierten Namen (ab Rev. 28507):  
        "paramA-0=1&paramB-0=2&paramA-1=3&paramB-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:

Url: http://localhost:8084/rest2/ArtikelMethods/method/GetArtPriceSell?ArticleID=8&CustomerID=0&Quantity=1&Date=2015-07-01&ArticleID=3&CustomerID=0&Quantity=1&Date=2015-07-01

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:

CodeBeschreibung
200 OkAlles i.O.
400 Bad RequestDer URL enthält unerlaubte Zeichen, Strukturen, Parameter, oder die Parameter im Body können nicht interpretiert werden.
401 UnauthorizedNicht authentifiziert
403 ForbiddenNicht autorisiert
404 Not FoundDie angeforderte Ressource wurde nicht gefunden, z.B. ein Delete auf einen nicht existierenden Datensatz.
406 Not AcceptableDer Contenttype (Request oder Response) wird nicht unterstützt.
409 ConflictKonflikt in den Daten, DB-Fehler, z.B. Constraintverletzung
415 Unsupported Media Typeaccept- oder content-type-Header der nicht unterstützt wird.
500 Internal Server ErrorSystem- oder Programmfehler
501 Not ImplementedAnforderung einer nicht implementierten Funktionalität