Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.
Kommentar: zurückgeholt von v. 129
Hinweis
Hier wird der RESTful Service ab der Version 4.3 beschrieben. Für die alte Version (bis 4.2) bitte hier nachlesen: RESTful Service bis 4.2

 

1) LoginService:

Codeblock
@Path("/")
 
 @POST
 @Consumes({MediaType.APPLICATION_JSON}) 
 @RestServiceInfo(identifier="login", description="User-Login. Returns JsonObject with SessionID and link for BO-Metalist.", examplePostData = "{\"username\": \"nuclos\", \"password\": \"\"}")
 
 @DELETE
 @RestServiceInfo(identifier="logout", description="User-Logout. Returns HTTP-Status 200, if successful")
 
 @GET
 @Path("/version")
 @RestServiceInfo(identifier="version", description="Version of the current Nuclos-Server")
 
 @GET
 @Path("/dbversion")
 @RestServiceInfo(identifier="dbversion", description="Version of DB-Schema of the current Nuclos-Server. Actually accesses the DB.")

 

2) MetaService:

Codeblock
@Path("/meta")
 
 @GET
 @Path("/bometa")
 @RestServiceInfo(identifier="bometalist", description="List all readable Businessobject classes")
 
 @GET
 @Path("/bometa/{id}")
 @RestServiceInfo(identifier="bometa", description="Get the meta information about one Businessobjects class")

 

3) DataService:

Codeblock
@Path("/data")
 
 @GET
 @Path("/{bometa}")
 @RestServiceInfo(identifier="list", description="List of Data (Rows)")
 
 @POST
 @Path("/{bometa}")
 @RestServiceInfo(identifier="insert", description="Data Row Insert")
 @Consumes({MediaType.APPLICATION_JSON})
 
 @GET
 @Path("/{bometa}/{id}")
 @RestServiceInfo(identifier="get", description="Full Data Row Get")
 
 @PUT
 @Path("/{bometa}/{id}")
 @RestServiceInfo(identifier="update", description="Full Data Row Update")
 @Consumes({MediaType.APPLICATION_JSON})
 
 @DELETE
 @Path("/{bometa}/{id}")
 @RestServiceInfo(identifier="delete", description="Full Data Row Delete")
 
 @GET
 @Path("/{bometa}/{id}/sublist/{reffield}")
 @RestServiceInfo(identifier="sublist", description="List of Subform-Data (Rows)")
Warnung

Bitte beachten Sie, dass sich der RESTful Service noch in Entwicklung befindet und noch keine Aufwärtskompatibilität sichergestellt wird. Insbesondere können sich Servicenamen und Aufrufparameter noch ändern.

 

Einführung:

Ab Nuclos 4.0 hat der Nuclos Server einen RESTful Service integriert, der automatisch gestartet wird. Er dient primär als Interface für einen Webclient, kann aber auch grundsätzlich als Dienst verwendet werden.

Er ist unter dem Pfad "/rest/*" zu erreichen, z.B. für eine lokale Installation des Servers auf dem Port 8080:

http://localhost:8080/nuclos-war/rest/<pfad>.  (z.B. für logout: http://localhost:8080/nuclos-war/rest/logout)

Session:

Jeder Teilservice bis auf wenige Ausnahmen (z.B. Login) benötigt eine Session ID. Wird keine Session ID übergeben, bzw. ist die Session ID ungültig, gibt der Service einen Fehler mit dem HTTP Status 401 (Unauthorized) zurück. Die Session ID kann entweder als Standard-Cookie oder als Http-Header-Parameter beim Aufruf des REST-Services übergeben werden. Der Key muss "sessionid" lauten.

Zu Debug-Zwecken ist vorläufig auch die Möglichkeit gegeben, die Session ID als Query-Parameter zu übergeben. Als Beispiel würde dies hier bei gültiger Session ID funktionieren: http://localhost:8080/nuclos-war/rest/meta/menu?sessionid=i8F3KD12V9c13SqDsvcT

Teilservices/Pfade:

...

Login (Path: /login, Method: POST, Return: String, ohne Session)
Erwartet die Login-Daten per JSON (s. JSON-Spezifikationen), authentifiziert sich damit am Nuclos-Server und gibt eine SessionID als String zurück. Die Session ID benötig wird um andere Teilservices zu verwenden. Schlägt der Login fehl, wird ein Fehler mit dem HTTP Status 401 (Unauthorized) zurückgeworfen.

...

JSON-Spezifikationen:

  • Login ("username": String, "password": String, "locale": String (optional))
    Beispiel für ein gültiges Login-JSONObject:

    Codeblock
    var login = {
    	"username": "user123", 
    	"password": "passXYZ", 
    	"locale": "de_DE"};

    -

...

Filter ("search": String, "offset": Number, "chunksize": Number, "sort": String, "searchfilter", String, optional). Achtung: Ohne Searchfilter muss dieser der entsprechende Eintrag null sein, währende sort/search leere Strings sein müssen.
Beispiel für ein gültiges Filter-JSONObject:

Codeblock
var filter = {
	"search": "Hu", 
	"offset": 0, 
	"chunksize": 100, 
	"sort": "desc:szU1s75TFT6kGF7l0Whj",
	"searchfilter": null,
	"gettotal", false};

-

ValueObject to Server ("_uid": String, "_pk": Number/String, "_flag": "insert/update/delete", "<FieldUID>": Object, beliebige Anzahl, "_newstate": StatusUID für neuen Status, optional, "_subvos": Array aus ValueObjects, optional)
Beispiel für ein gültiges ValueObject-JSONObject:

Codeblock
var vo = {
	"_uid":"KIb7Pmxm3AnJtdBWXWsJ",
 	"_pk":40000191,
	"_flag":"update",
 	"nyVRqlqCUYvH3GNwlKrn":400,
 	"zTc3H0vtH5o2JV82gRtg":"Schraube",
    "_newstate":"hj8wS2lLCi6Rs57E",
	"_subvos":[{"_uid":"KIb7Pmxm3AnJtdBWXWsJ","zTc3H0vtH5o2JV82gRtg":"Schraube","_pk":40000191,"_flag":"update"},
               {"_uid":"KIb7Pmxm3AnJtdBWXWsJ","zTc3H0vtH5o2JV82gRtg":"Stuhl","_pk":40000192,"flag":"delete"}]}

-

 

ValueObject from Server ("_uid": String, "_pk": Number/String, "<FieldUID>": Object, beliebige Anzahl, "_readonly": Boolean, "_uchash": Number, optional, "_states": Array aus States, optional, .....)
Beispiel für ein ValueObject-JSONObject:

Codeblock
var vo = {
	"_uid":"KIb7Pmxm3AnJtdBWXWsJ",
 	"_pk":40000191,
 	"nyVRqlqCUYvH3GNwlKrn":400,
 	"zTc3H0vtH5o2JV82gRtg":"Schraube",
	"_readonly":false,
	"_uchash":687445,
	"_states":[{"pk":"opJ0ga7T6rEnl9F3","name":"Zugewiesen","numeral":10,"current":true},
			   {"pk":"opJ0ga7T6rEnl9F2","name":"In Arbeit","numeral":20,"current":false}],
	"_canopen":false,
	"_tabs":[],
	"_fields":[],
^	"_title":"Element A10",
	"_info":"Neuer Datensatz..., 245, frei",
	"_image":"iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z"}

...

EntityMeta ("uid": String, "statemodel": Boolean, "name": String, "statemodel": Boolean, "readonly": Boolean, "nodelete": Boolean,  "fields": Array aus Fields, "hasImage": Boolean, "searchfilter": String, nur für Service Searchfilter )
Beispiel für ein EntityMeta-JSONObject:

Codeblock
{"uid":"KIb7Pmxm3AnJtdBWXWsJ",
 "name":"Artikel",
 "statemodel":false,
 "readonly":false,
 "nodelete":false,
 "fields":[{"uid":"cjJ9ga7T6rEnl9FNMNrMdy2","name":"Name","type":"String",
           "readonly":false,"unique":true,"nullable":false,"reference":false,"order":0},
          {"uid":"wwS2lLCi6Rs57E","name":"Bestand","type":"Number",
           "readonly":false,"unique":false,"nullable":true,"reference":false,"order":1}]
 "hasImage":true,
 "searchfilter":"9XRAkACDWgJulpAiYCHs"}

-

...

Field ("uid": String, "name": String, "type": String, "readonly": Boolean, "unique": Boolean, "nullable": Boolean, "reference": Boolean, "order": Number)
Beispiel für ein Field-JSONObject:

Codeblock
{"uid":"KIb7Pmxm3AnJtdBWXWsJ",
 "name":"Bestand",
 "type":"Number",
 "readonly":false,
 "unique":false,
 "nullable":true,
 "reference":false,
 "order",3}

-

  • (Preview)Result ("all": Boolean, "total": Number on Request, "title": String, "vos": Array aus ValueObjects)

    "all" gibt an, ob alle Datensätze geladen worden sind, "total" ist die Anzahl alle Datensätze, die die Suche ohne Einschränkung der Blockgröße gefunden hat (falls angefordert). Beispiel für ein Result-JSONObject:

    Codeblock
    {"all":false,"total":4,"title":"Artikel","vos":[
    {"uid":"KIb7Pmxm3AnJtdBWXWsJ","nyVRqlqCUYvH3GNwlKrn":400,"zTc3H0vtH5o2JV82gRtg":"Schraube","pk":40000191},  {"uid":"KIb7Pmxm3AnJtdBWXWsJ","nyVRqlqCUYvH3GNwlKrn":41,"zTc3H0vtH5o2JV82gRtg":"Stuhl","pk":40000192}]}

    -

  • ListResult ("all": Boolean, "total": Number on Request, "title": String, "vos": Array aus ValueObjects)

    "all" gibt an, ob alle Datensätze geladen worden sind, "total" ist die Anzahl alle Datensätze, die die Suche ohne Einschränkung der Blockgröße gefunden hat (falls angefordert). Beispiel für ein Result-JSONObject:

    Codeblock
    {
        "all": true,
        "total": 3,
        "title": "Land",
        "vos": [
            {
                "_pk": 42199705,
                "z82lEz2vLCfrreJ2v8qe": "Deutschland",
                "VdSxh45mLPMLuxHbmZeh": "DE",
                "YrnAkMBqyAxMEcv1tgIh1": "2014-04-22 09:59:22.373",
                "YrnAkMBqyAxMEcv1tgIh2": "testuser",
                "YrnAkMBqyAxMEcv1tgIh3": "2014-04-22 09:59:22.373",
                "YrnAkMBqyAxMEcv1tgIh4": "testuser",
                "_title": "Deutschland",
                "_info": "DE",
                "_statusUID": null,
                "_uchash": 1213484123,
                "_uid": "YrnAkMBqyAxMEcv1tgIh"
            },
            {
                "_pk": 42199706,
                "z82lEz2vLCfrreJ2v8qe": "Schweiz",
                "VdSxh45mLPMLuxHbmZeh": "CH",
                "YrnAkMBqyAxMEcv1tgIh1": "2014-04-22 09:59:37.923",
                "YrnAkMBqyAxMEcv1tgIh2": "testuser",
                "YrnAkMBqyAxMEcv1tgIh3": "2014-04-22 09:59:37.923",
                "YrnAkMBqyAxMEcv1tgIh4": "testuser",
                "_title": "Schweiz",
                "_info": "CH",
                "_statusUID": null,
                "_uchash": 1213484123,
                "_uid": "YrnAkMBqyAxMEcv1tgIh"
            },
            {
                "_pk": 42199707,
                "z82lEz2vLCfrreJ2v8qe": "Italien",
                "VdSxh45mLPMLuxHbmZeh": "IT",
                "YrnAkMBqyAxMEcv1tgIh1": "2014-04-22 09:59:47.766",
                "YrnAkMBqyAxMEcv1tgIh2": "testuser",
                "YrnAkMBqyAxMEcv1tgIh3": "2014-04-22 09:59:47.766",
                "YrnAkMBqyAxMEcv1tgIh4": "testuser",
                "_title": "Italien",
                "_info": "IT",
                "_statusUID": null,
                "_uchash": 1213484123,
                "_uid": "YrnAkMBqyAxMEcv1tgIh"
            }
        ]
    }

    -

  • SearchResult ("uid": String, "name": String, "pk": Number/String, "text": String)
    Beispiel für ein SearchResult-JSONObject:

    Codeblock
    {"uid":"KIb7Pmxm3AnJtdBWXWsJ",
     "name":"Artikel"
     "pk":40000217
     "text":"anzahl=4, lieferung=2013-06-28, lieferbar=null, name=Schrank, preis=256.17"}

    -

  • ReferenceValue ("pk": Number/String, "name": String)
    Beispiel für ein ReferenceValue-JSONObject:

    Codeblock
    {"pk":40006894,
     "name":"Herr Rossi"}

    -

  • SubEntity ("name": String, "Entity": String, "field": String)
    Beispiel für ein SubEntity-JSONObject:

    Codeblock
    {"name":"Artikel,
     "Entity":"KIb7Pmxm3AnJtdBWXWsJ",
     "field":"szU1s75TFT6kGF7l0Whj"}

    -

  • State ("pk": Number/String, "name": String, "numeral": Number, "current": Boolean, "icon": Base64-Image, optional)
    Beispiel für ein State-JSONObject:

    Codeblock
    {"pk":40000717,
     "name":"Zugewiesen",
     "numeral":10,
     "current":true}

    -

  • Menu ("path": String, "entries": Array("uid": String, "name": String, "icon": Base64-Image, optional))
    Beispiel für ein Menu-JSONObject:

    Codeblock
    {"path":"Freetime",
     "entries":[{"uid":"oJeMHK7Y9A-1L7fOVrocA","name":"Ladder"},
                {"uid":"k4lF4lDOcA-nl36NMw","name":"TreeHouse","icon":"iVBORw0KGgoAAAANSUhEUgA"},
                {"uid":"Uzmz50InTg-yJ21HtZIA","name":"New Entity","icon":"iVBORw0KGgoAAAANSUhEUgA"}]}

Datentypen:

Um die 4 JSON-Datentypen (String, Number, Boolean, Null) weiter zu definieren, kann der Datentyp explizit in von den MetaDaten ermittelt werden, z.B. durch den Service "Field". Folgende Datentypen werden u.a. geliefert.

...

HTTP-Statuscodes:

...