RESTful Web-Services mit JAX-RS - Java User Group Stuttgart … · 2014-11-02 · (Expert Group JSR...

31
RESTful Web-Services mit JAX-RS 30. Oktober 2014 Alter Scheuer, Stuttgart-Degerloch Markus KARG (Expert Group JSR 339, 370 / JAX-RS 2.0, 2.1) Copyright © 2009-2014 Markus Karg, Pforzheim RESTful Web-Services mit JAX-RS ~ JUG Stuttgart JUG Stuttgart

Transcript of RESTful Web-Services mit JAX-RS - Java User Group Stuttgart … · 2014-11-02 · (Expert Group JSR...

RESTful Web-Servicesmit JAX-RS

30. Oktober 2014Alter Scheuer, Stuttgart-Degerloch

Markus KARG(Expert Group JSR 339, 370 / JAX-RS 2.0, 2.1)

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

JUG Stuttgart

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Agenda

Was ist nur so toll an diesem „REST“?

JAX-RS – Schon wieder eine neue API!

„Echtes“ REST mit JAX-RS

Die Zukunft von JAX-RS, EJB & Co. – Java EE 8 Big Picture

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Was ist nur so toll an diesem „REST“?

Copyright © 2009 -2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Was ist ein Web-Service?

Copyright © 2009-2014 Markus Karg, Pforzheim

WebServerBrowser

Irgendein

ProgrammMaschineMaschine

MenschMensch

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

WWW

HTTP GET, POST z. B.

HTMLPDF

HTTP GET, PUT, POST, DELETE

z. B.XML

JSONWebServer

Vorteile

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Alles kann mit allem „reden“, ohne die Anwendungen nennenswert zu ändern.

● Global und seit Jahrzehnten etablierte Standards (vgl. iDocs, CORBA, Treiber)

[URL, HTTP, MIME, UTF-8, XML/JSON]

● Lose Kopplung (nur miteinander reden, nicht miteinander verheiraten)

● Bestehende Infrastruktur unterstützt uns optimal (Firewalls, Caching, Security)

„Lingua Franca für M2M“

Ketzerische Thesen

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Mehr Clients Mehr Server: Nicht-linear skalierbar – ⇒ O(n2)!

● Non-RESTful Web-Services bilden einen unnötigen Layer oberhalb HTTP

● ...sind oftmals proprietär und erfinden für alles das Rad neu

● ...sind sehr komplex („CISC-Style“) und oftmals schwer zu verstehen

● ...sind wenig objekt-orientiert, meist RPC oder CRUD

● ...sind meist schwierig zu analysieren, wenn sie klemmen

● ...und bergen viele weitere kleine und große Probleme!

...wieso also nicht reines HTTP?

Ketzerische Antithesen

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Das WWW ist Prototyp der idealen Software-Architektur!

● Nicht Menschen surfen im WWW sondern Maschinen

● Nicht HTML wird geliefert sondern XML oder JSON

● Nicht Buttons bieten Aktionen an, sondern Link-Header

„Internet WWW der Dinge“Copyright © 2009-2014 Markus Karg, Pforzheim

REST

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Representational State Transfer [Fielding, 2000]

Resource = Ampelanlage an einer Kreuzung

Representational State = Ein XML- oder JSON-Dokument mit der Information, welche Ampel gerade welche Farbe zeigt

Die Zusendung des Dokuments an die Steuerung schaltet die Farben der einzelnen Ampeln aus der Ferne.

● REST ist ein Paradigma, keine Technologie.

● Adressierbare Ressourcen {+ verhandelbares Datenformat} + Verben + Zustandslosigkeit + HATEOAS

● Speziell im Web: URL {+ MIME} + HTTP + Matrix-Params + Link-HeaderHATEOAS – Hypermedia As The Engine Of State:

Status des Maschine-Maschine-Dialogs steckt in der Nachricht selbst, nicht im Client und auch nicht im Server.

(http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm)

REST ist toll!

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● „Unbegrenzte“ Skalierbarkeit – Jeder Server bringt zusätzliche Leistung

● Mehr Clients pro Server da kein Status auf dem Server

● Kein SPOF; Reboot und Neuinitialisierung eines beliebigen Servers

● Wir müssen nichts neues lernen, wir machen einfach das WWW nach!

● Firewalls, Caches, Sicherheit... geschenkt!

● Mitlesen der Kommunikation im Klartext wenn's klemmt

● 1:1-Zuordnung von HTTP-Aufrufen zu Aktionen

● Keine spezielle Software-Unterstützung nötig...

...und wozu braucht man dann dieses „JAX-RS“?!

Schon wieder eine neue Java-API...! :-(

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

JAX-RS vs JAX-WS/RPC

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

JAX-WS, JAX-RPC

SOAP, meist Remote Procedure Call, meist stateful, WS-Darkstar, schwergewichtig und komplex

JAX-RS

REST/HTTP, stateless, leichtgewichtig und simpel

JAX-RS vs Servlet API

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Servlet-API

Ersatz für CGI und ISAPI/NSAPI, entbindet Java-implementierte Server-Extensions von der Kenntnis der zugrundeliegenden, nativen Server-API (Bottom-Up, Technologie-

Wrapper). Vereinheitlicht Web-Server-Produkte (z. B. Apache, IIS).

JAX-RS

Erleichtert das Schreiben von RESTful Web Services in Java (Top-Down, Anwendungs-Framework) durch Abstraktion des Domänenmodells von der Technik. Vereinheitlicht

Java-REST-Frameworks (z. B. Jersey, Apache CXF).

JAX-RS vs JSF

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Java Server Faces

Zum Schreiben von Anwendungen mit „Web-Oberfläche“ (für Menschen).

GUI-zentrisch.

JAX-RS

Zum Schreiben von Web Services (für Maschinen).

Domänenmodell im Zentrum.

REST Maturity Model

Copyright © 2009 -2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

0 SOAP oder RPC/XMLEinzelne URI für gesamten ServiceEinzelnes HTTP-Verb für alle Aktionen

1 + Natives HTTP+ Verschiedene URIs für getrennte Ressourcen

2 + Verschiedene HTTP-Verben (DELETE, OPTIONS, HEAD...)

3 + HATEOAS (Hypermedia-Navigation)... „Basics“ seit JAX-RS 2.0

http://martinfowler.com/articles/richardsonMaturityModel.html

JAX-RS-Universum

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● JAX-RS Container hostet eine JAX-RS-Anwendung (= Web Application)

● Web Application besteht aus Web Resources und Extensions (Filter, Provider, etc.)

● Automatisches Finden und Montieren der Anwendung, lose Bindung

● Starke Erweiterbarkeit durch klar definierte Schnittstellen innerhalb des Containers

● IoC, POJOs, deklarative Programmierung mittels Annotations

● Context and Dependency Injection

● Domänen-orientiert, automatische Codierung/Dekodierung

● Unabhängig von Servlets / JSF

„Echtes“ REST mit JAX-RS

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Adressierbarkeit

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

curl http://.../banking/api/konten/DE00123456812345678

@Path("konten/{iban}")public class Konto {

@PathParam("iban")private IBAN iban;

}

Konto und IBAN sind Objekte, keine Strings!Wir kümmern uns nicht um deren Erzeugung!

Verhandelbares Datenformat

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

curl -H "Accept: application/xml;application/json" --data "Markus Karg" http://.../banking/api/konten

@POSTpublic Eroeffnungsbestaetigung kontoEroeffnen(EroeffnungsAntrag antrag) {

String neueKontonummer = "1234567";String kontoInhaber = antrag.getAntragsteller();return new Eroeffnungsbestaetigung(neueKontonummer, kontoInhaber);

}

@Produces(APPLICATION_XML)public class JaxbWriter implements MessageBodyWriter<Object> {…}

XML wird über JAXB (noch) automatisch unterstütztJSON wird in den meisten Produkten automatisch unterstützt

Zustandslosigkeit

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

curl http://.../banking/api/konten/DE00123456812345678;monat=Mai;von=15;bis=21

@Path("konten/{iban}")public class Konto {

@PathParam("iban")private String iban;

@GETpublic Kontoauszug kontoauszugAbrufen(

@MatrixParam("monat") Monat monat,@MatrixParam("von") int von,@MatrixParam("bis") int bis) {

return new Kontoauszug(iban, monat, von, bis);}

}

Zustand wird automatisch aus dem Request hergestelltZustand (Monat) ist ein Objekt, kein String!

Verben

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

curl -X DELETE http://.../banking/api/konten/DE00123456812345678

@Path("konten/{iban}")public class Konto {

@PathParam("iban")private IBAN iban;

@DELETEpublic Kuendigungsbestaetigung kuendigen() {

return new Kuendigungsbestaetigung(iban);}

}

Verben sind Annotations

HTTP (nahezu) vollständig enthalten

Beliebige eigene Verben möglich (z. B. MOVE)

HATEOAS

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

@POSTpublic Response betragAbheben(@Context UriInfo uri) {

Link.Builder b = Link.fromUri(uri.getPath());Link self = b.rel("self").build();Link kontoauszugAbrufen = b.rel("kontoauszug").build();Link kuendigen = b.rel("kuendigen").build();Link betragAbheben = b.rel("abheben").build();ResponseBuilder r = Response.ok().links(self, kontoauszugAbrufen, kuendigen);if (saldo.compareTo(ZERO) > 0)

r.links(betragAbheben);return r.build();

}

< HTTP/1.1 200 OK< Server: Apache-Coyote/1.1< Link: <konten/DE1234>; rel="self"< Link: <konten/DE1234>; rel="self kontoauszug"< Link: <konten/DE1234>; rel="self kontoauszug kuendigen"< Link: <konten/DE1234>; rel="self kontoauszug kuendigen abheben"Link: <konten/DE1234>; rel="self kontoauszug kuendigen abheben"< Content-Length: 0< Date: Wed, 16 Jul 2014 20:42:22 GMT

„verbesserungswürdig“

JAX-RS Features

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Vollständig typisiert, Anwendung ist von Technik isoliert – Kein Hantieren mit Strings, Streams oder HTTP● HTTP/1.1 incl. ETags und Conditional Requests zur Leistungserhöhung● Separation of Concerns (Anwendungsdomänen-POJOs ↔ Datenstrom-Ebene)● Auto Discovery, Konfigurations-API (Properties injizieren und ändern), CDI● Dynamic Sub-Resources Mapping (z. B. Wenn … dann Pfad auf Resource A mappen, sonst auf Resource B …)● HTTP-Headers ↔ POJOs● Providers● Entity Providers (MBR, MBW), viele Standard-Provider u. a. JAXB, JSON● Content Negotiation● Context Resolvers (z. B. JAXBContext)● Exception Mapping Providers (Exception ↔ HTTP-Status-Code)● WebApplicationException● Security● Bean Validation API● Asychronous Programming (Multi-Fiber-Support verbes⇒ serte Skalierung)● Client API (Wiederverwendbare Session und vorbereitete Aufruf-Templates)● Static & Dynamic Filters (Datenstrom-Ebene) und Interceptoren (Java-Objekte) für Caching, Compression, etc.● …

„HTTP-basierte Anwendungs-Infrastruktur“

Resources

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● JAX-RS 2.0 Specification PDF and JavaDocs – https://jcp.org/aboutJava/communityprocess/final/jsr339/index.html

● JAX-RS 2.0 JavaDocs Online – https://jax-rs-spec.java.net/nonav/2.0/apidocs/

● JAX-RS 2.0 Reference Implementation (Jersey) – https://jersey.java.net/

● Maven GAV Coordinates: <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.0</version>

[email protected] Adopt JAX-RS!

Die Zukunft von Java EE

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

„We plan to enhance the managed bean model to make ease of use features that are currently available only to

selected components available to all managed beans via the mechanisms provided by CDI.“ (JSR 366 / Bill Shannon et al.)

Die Zukunft von Java EE

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Auf lange Sicht nur noch ein Container und ein Bean-Typ (i. S. „Cloud-POJO“)

● EJB i. S. JAX-WS, Stateful Beans, JRMI und IIOP stirbt aus (IIOP, EJB 2 optional in EE 8)

● Aus EJB-Typen (TX, Timers, MDB, Resource-Access) werden hinzufügbare Fähigkeiten

● Aufsplittung in reines REST und MVC API – Gemeinsame Infrastruktur in Diskussion

Zielarchitektur: „Lightweight Cloud“: JAX-RS + CDI-annotierte FähigkeitenZielarchitektur: „Lightweight Cloud“: JAX-RS + CDI-annotierte Fähigkeiten

Die Zukunft von Java EE

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Java EE = JAX-RS + CDI + Injectable Features

MVC = JAX-RS 2.0 Non-REST + JSF 2.2 Facelets & Flows

JAX-RS 2.1 = JAX-RS 2.0 - MVC

JSF 2.3 = JSF 2.2 - MVC

MVC API's JAX-RS-Basis ist noch spekulativ!MVC API's JAX-RS-Basis ist noch spekulativ!

Die Zukunft von JAX-RS

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

● Server-Sent Events: Der Todesstoß für JMS und AMQP?

● Weniger JAX-RS-Annotations, mehr CDI!

● Deklarative Sicherheit (Java EE)

● Nicht-blockierende Filter, reactive Client API

● JAXB wird optional

● JSONB API vermutlich zwingend

● Verbessertes HATEOAS (mehr REST)

● JAX-Resources = MVC-Controller

Die Zukunft von EJB

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

Das EJB-Team bei Oracle existiert allem Anschein nach nicht mehr.

Führende Mitarbeiter des EJB-Teams wurden anderen Teams zugeordnet.

„Oracle wird ein Team formieren, sollte es eine Notwendigkeit für eine neue EJB-Version geben.“ (Reza Rahman, Oracle)

Es gibt bis heute keinen JSR für eine neue EJB-Version.

Die Zukunft von JSF

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart

„...the scope of new features is intentionally limited...“

„...the set of issues addressed is very much up to what the expert group is willing to contribute...“

(JSR 372, Edward Burns et al.)

Interpretation: Oracle hat nicht vor, neue Features in nennenswertem Umfang beizusteuern. Wenn die Community ein Feature vorschlägt, soll sie es auch gleich

programmieren!

Q & A

Copyright © 2009-2014 Markus Karg, Pforzheim

RESTful Web-Services mit JAX-RS ~ JUG Stuttgart