SimpleREST - Der Anfang

SimpleREST - Der Anfang

Ich stand vor dem Problem einen REST fähigen Server aufzubauen, bei dem Benutzer und Geräte sich auf je eine spezielle weise authentifizieren können.

Danach sollten sie sicher nur auf Ihre Schnittstellen zugreifen. Je nach Berechtigung darf ein User die Firmendaten ändern oder nicht.

Unter Java (meine Spezialität) fällt mir da sofort Spring ein. Kurz eingelesen. Tutorials probiert, gegoogelt, nochmal probiert, noch mehr gegoogelt.
Nach ein paar Tagen Einarbeitungszeit merkte ich schnell, dass die Einarbeitungszeit wahrscheinlich mehrere Monate in Anspruch nehmen wird. Nicht so ganz mein Weg.

Da ich ja sowieso der Fan von "Was du kannst, mach selber, dann weißt du auch warum es nicht geht!" bin, entschied ich mich eine solche Schnittstelle selbst zu bauen.

Basis

  • netty: Der kleine schlanke Webserver bringt schon viele Funktionen mit. Hoch optimiert, gut gesichert und tausendmal verwendet. Eine gute Basis.
  • Jackson: JSON Dokumente lesen und schreiben. Einfach und schnell. Kommt auch auf die Liste.
  • apache commons: fehlen so gut wie bei keinem Projekt

Die Idee

Kein Dependency Injection, keine unsichtbaren Fäden. Ganz einfache, gute und sauberer PoJo (Plain old Java Objects).

Ein neuer Server: server = RestHttpServer.Start(8000);
Java Exception abfangen und ausgeben: server.enableExceptionHandling();
404 wenn nicht gefunden:  server.enableNotFoundHandling();
Ein neuer Pfad: server.getRootEndpoint().addSubPath("pfad"); // also http://localhost:8000/pfad

Nun ein GetRequest :

http://localhost:8000/pfad/click

server.getRootEndpoint().addSubPath("pfad").addRestEndpoint(new GetEndpoint("click") {
            @Override
            public void Call(Conversion conversion, Map<String, String> UrlParameter) {
conversion.getResponse().setData("Hallo");
}
});

Ich möchte aber auch Parameter: http://localhost:8000/123456789/click

server.getRootEndpoint().addSubPath(":variable").addRestEndpoint(new GetEndpoint("click") {
            @Override
            public void Call(Conversion conversion, Map<String, String> UrlParameter) {
conversion.getResponse().setData(UrlParameter.get("variable"));
}
});

 

Die Sicherheitsebene (Wer darf was) kann als Pfad (Alles dahinter ist geschützt) oder auf Endpoint (darfst du das?) gemacht werden.

CRUD

Create, Update, Read, Delete. Der einheitliche Zugriff auf Objekte ist sehr wichtig. Mit dem CRUDHelper wird das auch schon vereinfacht:

CRUDUser userTypeHelper = new CRUDUser("user", server.getRootEndpoint());

Geschwindigkeit

Wichtig ist, dass es leichtgewichtig ist und nicht zu viel Zeit nimmt. Bei jedem Aufruf bekommt man eine Rückgabe, wie lange dieser Aufruf im Server gebraucht hat. Zu beginn sind diese Zeiten noch bei Werten um 14ms. Je öfter ein Aufruf gemacht wird, desto mehr Optimierungen (von Jackson und Netty) arbeiten und man kommt auf Zeiten unter 1ms.

Weitere Features

  • Einfachste Bedienung
  • Schneller Start
  • Schnelle Ergebnisse.
  • Static File Endpoint für HTML oder sonstige Dateien aus dem JAR selbst oder einem Verzeichnis
  • Catch All Endpoint. Wenn nichts passt, dann übernimmt er.
  • Pfadvariablen. Einfach einen Pfad mit einem ":" vor dem Namen und er ist ein Parameter
  • Headerbearbeitung (User Login laut JWT oder Authentication)
  • Cookiebearbeitung
  • JWT - Authentifizierung mit JWT
  • JsonPostEndpoint<Type> wandelt den bekommenen JSON direkt in ein Objekt.

 

Schau einfach auf die Webseite ->

Hilfe

Das Projekt ist Open Source und wurde noch einige male erweitert. Davon später mehr. Aber ich brauche auch Hilfe. Jeder der mitarbeiten möchte: Ideen einbringen, testen, dokumentieren, Automatisierte Tests, beschleunigen, ... der ist herzlich willkommen. Egal welchen Wissensstand er/sie hat. Jeder hilft. Auch indem er es einfach nur verwendet.

 

 

Posted on

Ing. Roland Schuller

Harland 44, 3372 Blindenmarkt
@: roland@it-open.at
T: +43 676 63 54 793
W: it-open.at
RSS: RSS Feed
Blogheim.at Logo