SlideShare ist ein Scribd-Unternehmen logo
1 von 96
Downloaden Sie, um offline zu lesen
Lars Röwekamp | CIO New Technologies | open knowledge GmbH
#WISSENTEILEN
@_openKnowledge
@mobileLarson
Web APIs
jenseits von REST & Request/Response
ÜBER OPEN KNOWLEDGE
Branchenneutrale Softwareentwicklung und IT-Beratung
#WISSENTEILEN
ÜBER MICH
Wer bin ich - und wen ja, wie viele?
• CIO New Technologies
• Enterprise & Mobile
• Autor, Speaker, Coach & Mentor
• Snowboard & MTB Enthusiast
• Mehrfacher Vater, einfacher Ehemann
Lars Röwekamp (a.k.a. @mobileLarson)
#WISSENTEILEN
LR
Living in a
RESTful World
#WISSENTEILEN
lang laufende Anfragen
serverseitige Ereignisse
komplexe Abfragen
„Sorry, ich bin leider
nicht so gut in ...“*
*REST @work
„But it‘s not
REST if you
do (not) ...“
Mein Server
und ich ...
#WISSENTEILEN
„WT#!?“ *
(*a.k.a. „i don‘t care as long as it works for me.“)
#WISSENTEILEN
lang laufende
Anfragen
#WISSENTEILEN
Request-Response Modell
#WISSENTEILEN
Request-Response Modell
#WISSENTEILEN
Request-Response Modell
#WISSENTEILEN
I had a
Dream
#WISSENTEILEN
Reactive-Flow Modell
#WISSENTEILEN
public interface ReactiveMongoDBOperations {
<T> Mono<T> find (Query query, Class<T> entityClass);
<T> Flux<T> findAll(Query query, Class<T> entityClass);
<T> Mono<T> insert(T objectToSave, String collectionName);
<T> Mono<T> insert(Mono<? extends T> objectToSave);
}
#WISSENTEILEN
RouterFunction<?> route = route(GET("/persons/{id}"), request -> {
Mono<Person> person = Mono.justOrEmpty(request.pathVariable("id"))
.map(Integer::valueOf)
.then(repository::find);
return Response.ok().body(fromPublisher(person, Person.class));
}));
#WISSENTEILEN
RouterFunction<?> route = route(GET("/persons/{id}"), request -> {
Mono<Person> person = Mono.justOrEmpty(request.pathVariable("id"))
.map(Integer::valueOf)
.then(repository::find);
return Response.ok().body(fromPublisher(person, Person.class));
}).and(route(GET("/persons"), request -> {
Flux<Person> people = repository.findAll();
return Response.ok().body(fromPublisher(people, Person.class));
}));
#WISSENTEILEN
RouterFunction<?> route = route(GET("/persons/{id}"), request -> {
Mono<Person> person = Mono.justOrEmpty(request.pathVariable("id"))
.map(Integer::valueOf)
.then(repository::find);
return Response.ok().body(fromPublisher(person, Person.class));
}).and(route(GET("/persons"), request -> {
Flux<Person> people = repository.findAll();
return Response.ok().body(fromPublisher(people, Person.class));
}).and(route(POST("/persons"), request -> {
Mono<Person> person = request.body(toMono(Person.class));
return Response.ok().build(repository.insert(person));
}));
#WISSENTEILEN
„Are u kidding?“
?
#WISSENTEILEN
HTTP /1.0 202 Accepted
Location: http://....
#WISSENTEILEN
Fire & Forget*
#WISSENTEILEN
Polling Modell
#WISSENTEILEN
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public Response processOrder(Order order) throws ... {
UUID orderId = orderService.process(order);
return Response
.accepted(). // HTTP accepted 202
.location(new URI(„orders/“ + orderId + „/status“))
.build();
}
Fire & Forget* mit JAX-RS
(* eigentlich Polling!)
#WISSENTEILEN
@GET
@Path("/{orderNo}")
@Produces(MediaType.APPLICATION_JSON)
public Response getOrder(@PathParam("orderNo") UUID orderNo) {
Order order = orderService.getOrder(orderNo);
if (order.isEmpty()) {
return Response.noContent().build();
} else {
return Response.ok().entity(order).build();
}
}
Polling mit JAX-RS
#WISSENTEILEN
Long-Polling
#WISSENTEILEN
Long Polling Modell
#WISSENTEILEN
@POST
public void createCustomer(Customer customer,
@Suspended AsyncResponse asyncResponse) {
Response response = createCustomer(customer);
asyncResponse.resume(response);
}
asynchronous JAX-RS 2.0
#WISSENTEILEN
@POST
public void createCustomer(Customer customer,
@Suspended AsyncResponse asyncResponse) {
asyncResponse.setTimeout(10, TimeUnit.SECONDS);
asyncResponse.setTimeoutHandler(ar -> ar.resume(
Response.status(Status.SERVICE_UNAVAILABLE)
.entity("Operation timed out").build()));
Response response = createCustomer(customer);
asyncResponse.resume(response);
}
asynchronous JAX-RS 2.0
#WISSENTEILEN
@POST
public void createCustomer(final Customer customer,
@Suspended final AsyncResponse asyncResponse) {
asyncResponse.setTimeout(10, TimeUnit.SECONDS);
asyncResponse.setTimeoutHandler(...);
executor.execute(() -> {
Response response = createCustomer(customer);
asyncResponse.resume(response);
});
}
asynchronous JAX-RS 2.0
#WISSENTEILEN
@POST
public void createCustomer(final Customer customer,
@Suspended final AsyncResponse asyncResponse) {
asyncResponse.register(throwable -> {
if (throwable != null) {
LOG.error("Operation failed.", t);
return;
}
LOG.info("Operation successful.");
});
...
}
asynchronous JAX-RS 2.0
#WISSENTEILEN
Client client = ClientBuilder
.newBuilder().build()
.target("https://...")
.request().async()
.get(new InvocationCallback<Result>() {
public void completed(Result result) {
...
}
public void failed(Throwable error) {
...
}
});
asynchronous JAX-RS 2.0
#WISSENTEILEN
Piggy-Back
#WISSENTEILEN
Piggy Bag Modell
#WISSENTEILEN
HTTP/1.0 200 OK
Server: ...
MIME-Version: 1.0
Content-Type: multipart/x-mixed-replace;boundary=EOM
--EOM
Content-Type application/json
{...}
--EOM
Content-Type application/octet-stream
{...}
--EOM
Piggy Back mit REST
#WISSENTEILEN
Piggy Back mit JAX-RS 2.0
(*nur via eigenem MessageBodyWriter)
#WISSENTEILEN
public class BooksResource {
@Produces("multipart/mixed")
public Map<String, Object> getBooks() {
Map<String, Object> map
= new LinkedHashMap<String, Object>();
map.put("text/xml", new JaxbBook());
map.put("application/json", new JSONBook());
map.put("application/octet-stream", imageInputStream);
return map;
}
...
}
Piggy Back mit APACHE CXF
#WISSENTEILEN
serverseitige
Ereignisse
#WISSENTEILEN
serverseitige
Ereignisse
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Was steckt dahinter?
• Paradigmenwechsel in der Kommunikation
• Abkehr vom klassischen Request/Response
• Client meldet sich am Server an
• Server kann Client jederzeit “Daten“ schicken
• Session kann von beiden Seiten beendet werden
Serverseitige Ereignisse
#WISSENTEILEN
Server-Sent Events
#WISSENTEILEN
Server-Sent Event Modell
#WISSENTEILEN
Was sind Server-Sent Events?
• senden von Daten vom Server zum Client
• nutzt normales HTTP Protokoll
• built-in Support für Reconnection
• via JS, falls kein Browser Support vorhanden
• lediglich UTF-8 Daten (keine Binärdaten)
• Limitierung der offenen Connections
Server-Sent Event 1x1
#WISSENTEILEN
HTTP/1.0 202 Accepted
Content-Type: text/event-stream
event: event-name
id: unique id
data: custom data
Server-Sent Event Protokoll
#WISSENTEILEN
var eventSource = new EventSource(url);
eventSource.addEventListener("event-name", function(e) {
...
});
Server-Sent Event JS Client
#WISSENTEILEN
@WebServlet(urlPatterns = "/status", asyncSupported = true)
public class SseServlet extends HttpServlet {
...
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException {
AsyncContext context = req.startAsync();
... // put context to queue and finish doGet (connect)
}
protected void asyncProcessing() {
context.getResponse().getWriter();
}
}
Server-Sent Event mit AsyncServlet*
(*SSE „hand-made“ Edition)
#WISSENTEILEN
// register process
...
private SseBroadcaster channel;
@GET
@Path("subscribe")
@Produces(MediaType.SERVER_SENT_EVENTS) // "text/event-stream"
public void subscribe(@Context Sse sse, @Context SseEventSink eventSink) {
String uuid = UUID.randomUUID().toString();
OutboundSseEvent event = sse.newEventBuilder()
.id(uuid).data(“Subscription accepted. ID – “+ uuid).build();
eventSink.send(event).
channel.register(eventSink);
}
Server-Sent Event mit Java EE 8*
(*SSE „Standard“ Edition)
#WISSENTEILEN
// broadcast to registerd client
...
private SseBroadcaster channel;
public void update() {
OutboundSseEvent event = sse.newEventBuilder()
.name(...).data(myJsonObject).mediaType(APPLICATION_JSON_TYPE).build();
channel.broadcast(event);
}
Server-Sent Event mit Java EE 8*
(*SSE „Standard“ Edition)
#WISSENTEILEN
WebSockets
#WISSENTEILEN
Websocket Modell
#WISSENTEILEN
Was ist WebSockets?
• Full-Duplex Real-Time Kommunikation
• extrem leichtgewichtig dank HTTP Upgrade
• breiter Browser-Support
• Client eröffnet die Session
• Client und/oder Server sendet Nachricht(en)
• Client und/oder Server beendet Session
WebSockets 1x1
#WISSENTEILEN
#WISSENTEILEN
var socket = new WebSocket("ws://host:8080/path/");
socket.onopen = function(event) {...}
socket.onmessage = function(event) {...}
socket.onclose = function(event) {...}
socket.onerror = function(event) {...}
socket.send("Message-Inhalt");
WebSocket JS Client
#WISSENTEILEN
@ServerEndpoint("/socket")
public class MySocketEndpoint {
@OnOpen
public void open(Session newSession) {
try {
newSession.getBasicRemote().sendText("hello, thx for connecting");
} catch (IOException | EncodeException e) {...}
}
@OnMessage
public void receive(String message) { ... }
}
WebSocket mit Java EE 7+
#WISSENTEILEN
komplexe
Abfragen
#WISSENTEILEN
// Bestellungen: Kaffee mit Milch zu 2 €
GET /orders?type=coffee&ingredient=milk&price=2
Komplexe Abfragen mit REST
btw: UND oder ODER oder UND/ODER?
#WISSENTEILEN
// Bestellungen: Kaffee mit Milch oder günstiger als 2 €
GET /orders?type=coffee;ingredient=milk,price<=2
Komplexe Abfragen mit REST
btw: Klammerung?
#WISSENTEILEN
// Bestellungen: Kaffee mit Milch oder günstiger als 2 €
// RQL query ... (must possibly be encoded!)
GET /orders?query=
and(eq(type,coffee),
or(eq(ingredients,MILK),lt(price,2))
// RQL alternative query – FIQL (URI friendly) - ...
GET /orders?query=
type==coffee;(ingredients==MILK,price=lt=2)
Komplexe Abfragen mit RQL*
*https://github.com/persvr/rql
#WISSENTEILEN
Resource Query Language
• Object-Style Query Language
• FIQL Superset (erweiterbar)
• Spezifikation & JS Parser (Client & Server)
• JS Array, SQL, MongoDB, Elastic Search
• Java Parser + JPA Criteria Builder
Komplexe Abfragen mit RQL*
*https://github.com/persvr/rql
#WISSENTEILEN
Komplexe Abfragen mit REST
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“?
GET /people/1
Komplexe Abfragen mit REST
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“ und in welchen Filmen
hat er mitgespielt?
GET /people/1/films (falls es der Endpoint anbietet)
GET /films/1
GET /films/2
GET /films/3
Komplexe Abfragen mit REST
#WISSENTEILEN
Wer genau ist eigentlich dieser „Luke“ und in welchen Filmen
hat er mitgespielt und auf welchen Raumschiffen ist er darin gefahren?
GET /people/1/starships (falls es der Endpoint anbietet)
GET /starships/12
GET /starships/22
Komplexe Abfragen mit REST
#WISSENTEILEN
Wie alt ist Luke und welche Haarfarbe hat er?
Mit welchem Spruch wurden die Filme eröffnet, in denen er mitgespielt hat?
Und wie teuer waren überhaupt die Raumschiffe auf denen er gefahren ist?
GET /?F#CKING/detail (n+1 problem)
GET /?F#CKING/all (job problem)
Komplexe Abfragen mit REST
#WISSENTEILEN
Umdenken, du musst!
#WISSENTEILEN
Motivation:
„ We see a conflict between the desire to load all
information in a single round trip while keeping REST
resources well isolated.”
Komplexe Abfragen: „Umdenken du musst!“
(Facebook, 2012)
#WISSENTEILEN
Motivation:
Komplexe Abfragen: „Umdenken du musst!“
(Facebook, 2012)
#WISSENTEILEN
GraphQL Idee:
• Beliebige Abfragen via Objekt-Graph
auf dem ich navigieren kann.
• Lieferung des Abfrage-Results in einem
einzigen Round-Trip.
Komplexe Abfragen: „Umdenken du musst!“
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Was zeichnet GraphQL aus?
• hierarchicial
• product centric
• strongly typed & instrospective
• client specific queries
• application-layer protokol
GraphQL Charakteristika
#WISSENTEILEN
Fragen, was du willst,
du musst!
#WISSENTEILEN
#WISSENTEILEN
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
{
person(name:„Luke“) {
haircolor,
age
films {
name,
openiningCrawl
}
starships {
name,
price
}
}
}
Komplexe Abfragen mit GraphQL
Wie alt ist Luke und welche
Haarfarbe hat er?
Mit welchem “Spruch“ wurden
die Filme eröffnet in denen er
mitgespielt hat?
Und wie teuer waren
überhaupt die Schiffe auf
denen er gefahren ist?
#WISSENTEILEN
#WISSENTEILEN
#WISSENTEILEN
Woher weiß das Backend was ich will?
• API Schema als gemeinsame Basis
• Query als Anfrage vom Client
• Step 1: parse (Query into an abstract syntax tree)*
• Step 2: validate (against Schema)**
• Step 3: execute (Resolve Functions)
GraphQL und das Backend
(*syntaktisch korrekt , **semantisch korrekt)
#WISSENTEILEN
// A very simple GraphQL schema example
type Character {
name: String! // non nullable
appearsIn: [Episode]! // array of ..., non nullable
}
type Starship {
id: ID! // unique ID
name: String!
length(unit: LengthUnit = METER): Float // parameter
}
GraphQL und das Backend
#WISSENTEILEN
GraphQL
vs.
REST Aggregation?
Aggregation?
Aggregation?
#WISSENTEILEN
GraphQL
vs.
REST
Aggregation!
#WISSENTEILEN
Der GraphQL Server
• Query Parser
• Data Fetcher
• Data Aggregator
• Chaching von Result Graphs
• Aktuallisierung von Result Graphs
GraphQL und das Backend
#WISSENTEILEN
Muss ich das alles selber bauen?
• Nein! Es gibt ...
• Clients, Server, DB, Libraries, Tools ...
für Java, JavaScript, Python, Ruby, PHP, C/C++, GO, Scala, .Net,
SQL, ...
> http://graphql.org
> https://github.com/chentsulin/awesome-graphql
GraphQL und das Backend
#WISSENTEILEN
Cool, ist das wirklich alles so einfach?
• relative neue Technologie (im Fluss)
• Chaching?
• Dupletten?
• Information Hiding?
• Versionierung? (vs. deprecated)
GraphQL und Ich
#WISSENTEILEN
? ? ?
FRAGEN
#WISSENTEILEN
Kontakt
LARS RÖWEKAMP
CIO NEW TECHNOLOGIES
lars.roewekamp@openknowledge.de
+49 (0)441 4082 – 101
@mobileLarson
@_openknowledge
OFFENKUNDIGGUT
#WISSENTEILEN
Bildnachweise
#01: © kenishirotie – shutterstock.com
#13: © RichVintage – istockphoto.com
#18: © pathdoc – shutterstock.com
#67: © jpgfactory – istockphoto.com
All other pictures inside this presentation orginate from
pixabay.com.
#WISSENTEILEN

Weitere ähnliche Inhalte

Was ist angesagt?

Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten SystemenOPEN KNOWLEDGE GmbH
 
Java EE goes Microservices. Are you serious?
Java EE goes Microservices. Are you serious?Java EE goes Microservices. Are you serious?
Java EE goes Microservices. Are you serious?OPEN KNOWLEDGE GmbH
 
Aus der Rubrik "Spaß mit Microservices": Transaktionen
Aus der Rubrik "Spaß mit Microservices": TransaktionenAus der Rubrik "Spaß mit Microservices": Transaktionen
Aus der Rubrik "Spaß mit Microservices": TransaktionenOPEN KNOWLEDGE GmbH
 
Microservices mit dem MicroProfile
Microservices mit dem MicroProfileMicroservices mit dem MicroProfile
Microservices mit dem MicroProfileOPEN KNOWLEDGE GmbH
 
The Day after – nach dem Release ist vor dem Release
The Day after – nach dem Release ist vor dem ReleaseThe Day after – nach dem Release ist vor dem Release
The Day after – nach dem Release ist vor dem ReleaseOPEN KNOWLEDGE GmbH
 
App war gestern: Mobile Engagement als Teil der Enterprise-Strategie
App war gestern: Mobile Engagement als Teil der Enterprise-StrategieApp war gestern: Mobile Engagement als Teil der Enterprise-Strategie
App war gestern: Mobile Engagement als Teil der Enterprise-StrategieOPEN KNOWLEDGE GmbH
 
Cloud Architekturen - von "less Server" zu Serverless
Cloud Architekturen - von "less Server" zu ServerlessCloud Architekturen - von "less Server" zu Serverless
Cloud Architekturen - von "less Server" zu ServerlessOPEN KNOWLEDGE GmbH
 
Zukunftssichere Architekturen mit Microservices
Zukunftssichere Architekturen mit MicroservicesZukunftssichere Architekturen mit Microservices
Zukunftssichere Architekturen mit MicroservicesOPEN KNOWLEDGE GmbH
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!OPEN KNOWLEDGE GmbH
 
Die Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von MicroservicesDie Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von MicroservicesOPEN KNOWLEDGE GmbH
 
Mobile Ideation – der sanfte Weg zum mobilen Mehrwert
Mobile Ideation – der sanfte Weg zum mobilen MehrwertMobile Ideation – der sanfte Weg zum mobilen Mehrwert
Mobile Ideation – der sanfte Weg zum mobilen MehrwertOPEN KNOWLEDGE GmbH
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungOPEN KNOWLEDGE GmbH
 
iOS: einheitliche Oberflächen mit Auto Layout
iOS: einheitliche Oberflächen mit Auto LayoutiOS: einheitliche Oberflächen mit Auto Layout
iOS: einheitliche Oberflächen mit Auto LayoutOPEN KNOWLEDGE GmbH
 
Spaß mit Microservices: Transaktionen
Spaß mit Microservices: TransaktionenSpaß mit Microservices: Transaktionen
Spaß mit Microservices: TransaktionenOPEN KNOWLEDGE GmbH
 
Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?
Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?
Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?OPEN KNOWLEDGE GmbH
 

Was ist angesagt? (20)

App-Delivery-Pipeline
App-Delivery-PipelineApp-Delivery-Pipeline
App-Delivery-Pipeline
 
Shared Data in verteilten Systemen
Shared Data in verteilten SystemenShared Data in verteilten Systemen
Shared Data in verteilten Systemen
 
Java EE goes Microservices. Are you serious?
Java EE goes Microservices. Are you serious?Java EE goes Microservices. Are you serious?
Java EE goes Microservices. Are you serious?
 
Aus der Rubrik "Spaß mit Microservices": Transaktionen
Aus der Rubrik "Spaß mit Microservices": TransaktionenAus der Rubrik "Spaß mit Microservices": Transaktionen
Aus der Rubrik "Spaß mit Microservices": Transaktionen
 
Microservices mit dem MicroProfile
Microservices mit dem MicroProfileMicroservices mit dem MicroProfile
Microservices mit dem MicroProfile
 
The Day after – nach dem Release ist vor dem Release
The Day after – nach dem Release ist vor dem ReleaseThe Day after – nach dem Release ist vor dem Release
The Day after – nach dem Release ist vor dem Release
 
App war gestern: Mobile Engagement als Teil der Enterprise-Strategie
App war gestern: Mobile Engagement als Teil der Enterprise-StrategieApp war gestern: Mobile Engagement als Teil der Enterprise-Strategie
App war gestern: Mobile Engagement als Teil der Enterprise-Strategie
 
Cloud Architekturen - von "less Server" zu Serverless
Cloud Architekturen - von "less Server" zu ServerlessCloud Architekturen - von "less Server" zu Serverless
Cloud Architekturen - von "less Server" zu Serverless
 
Zukunftssichere Architekturen mit Microservices
Zukunftssichere Architekturen mit MicroservicesZukunftssichere Architekturen mit Microservices
Zukunftssichere Architekturen mit Microservices
 
Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!Hilfe, ich will meinen Monolithen zurück!
Hilfe, ich will meinen Monolithen zurück!
 
Enterprise Java auf Diät
Enterprise Java auf DiätEnterprise Java auf Diät
Enterprise Java auf Diät
 
Enterprise Java on Steroids
Enterprise Java on SteroidsEnterprise Java on Steroids
Enterprise Java on Steroids
 
Die Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von MicroservicesDie Matrix: Enterprise-Architekturen jenseits von Microservices
Die Matrix: Enterprise-Architekturen jenseits von Microservices
 
Mobile Ideation – der sanfte Weg zum mobilen Mehrwert
Mobile Ideation – der sanfte Weg zum mobilen MehrwertMobile Ideation – der sanfte Weg zum mobilen Mehrwert
Mobile Ideation – der sanfte Weg zum mobilen Mehrwert
 
Java EE meets Microservices
Java EE meets MicroservicesJava EE meets Microservices
Java EE meets Microservices
 
Mehr Sicherheit durch Automatisierung
Mehr Sicherheit durch AutomatisierungMehr Sicherheit durch Automatisierung
Mehr Sicherheit durch Automatisierung
 
iOS: einheitliche Oberflächen mit Auto Layout
iOS: einheitliche Oberflächen mit Auto LayoutiOS: einheitliche Oberflächen mit Auto Layout
iOS: einheitliche Oberflächen mit Auto Layout
 
Spaß mit Microservices: Transaktionen
Spaß mit Microservices: TransaktionenSpaß mit Microservices: Transaktionen
Spaß mit Microservices: Transaktionen
 
Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?
Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?
Von „less Server“ bis „Serverless“: Wie viel Cloud soll es sein?
 
Serverless: The Missing Manual
Serverless: The Missing ManualServerless: The Missing Manual
Serverless: The Missing Manual
 

Ähnlich wie Web-API-Design jenseits von REST und Request/Response

Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservicesmesseb
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardOPEN KNOWLEDGE GmbH
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...OPEN KNOWLEDGE GmbH
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 
Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit RustJens Siebert
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?QAware GmbH
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenMayflower GmbH
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile ServicesSascha Dittmann
 
Reaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaReaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaMarkus Klink
 
Hands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und StolperfallenHands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und Stolperfalleninovex GmbH
 
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2dayElegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2dayMario-Leander Reimer
 
In-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und KubernetesIn-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und KubernetesQAware GmbH
 
Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!gedoplan
 
Anbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web ServicesAnbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web ServicesAndré Wussow
 

Ähnlich wie Web-API-Design jenseits von REST und Request/Response (20)

Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservices
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative Standard
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 
Vorlesung SOA - DIS AG.pptx
Vorlesung SOA - DIS AG.pptxVorlesung SOA - DIS AG.pptx
Vorlesung SOA - DIS AG.pptx
 
Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit Rust
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
 
Web-API Design in Java
Web-API Design in JavaWeb-API Design in Java
Web-API Design in Java
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Hands-On Microservices mit Java
Hands-On Microservices mit JavaHands-On Microservices mit Java
Hands-On Microservices mit Java
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Services
 
Reaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaReaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und Akka
 
Hands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und StolperfallenHands-on Hystrix - Best Practices und Stolperfallen
Hands-on Hystrix - Best Practices und Stolperfallen
 
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2dayElegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
Elegantes In-Memory Computing mit Apache Ignite und Kubernetes. @data2day
 
In-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und KubernetesIn-Memory Computing mit Apache Ignite und Kubernetes
In-Memory Computing mit Apache Ignite und Kubernetes
 
Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!Schnell, schneller, Quarkus!!
Schnell, schneller, Quarkus!!
 
Anbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web ServicesAnbindung von Silverlight an RESTful Web Services
Anbindung von Silverlight an RESTful Web Services
 
TypeScript
TypeScriptTypeScript
TypeScript
 

Mehr von OPEN KNOWLEDGE GmbH

Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIWarum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIOPEN KNOWLEDGE GmbH
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationOPEN KNOWLEDGE GmbH
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!OPEN KNOWLEDGE GmbH
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. OPEN KNOWLEDGE GmbH
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoOPEN KNOWLEDGE GmbH
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenOPEN KNOWLEDGE GmbH
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsOPEN KNOWLEDGE GmbH
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeOPEN KNOWLEDGE GmbH
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingOPEN KNOWLEDGE GmbH
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusOPEN KNOWLEDGE GmbH
 
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?OPEN KNOWLEDGE GmbH
 
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“OPEN KNOWLEDGE GmbH
 
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...OPEN KNOWLEDGE GmbH
 

Mehr von OPEN KNOWLEDGE GmbH (20)

Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AIWarum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
Warum der Computer "Nein" sagt - Mehr Nachvollziehbarkeit dank Explainable AI
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
 
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
 
Nie wieder Log-Files!
Nie wieder Log-Files!Nie wieder Log-Files!
Nie wieder Log-Files!
 
Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!Cloud-native and Enterprise Java? Hold my beer!
Cloud-native and Enterprise Java? Hold my beer!
 
From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud. From Zero to still Zero: The most beautiful mistakes going into the cloud.
From Zero to still Zero: The most beautiful mistakes going into the cloud.
 
API Expand Contract
API Expand ContractAPI Expand Contract
API Expand Contract
 
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & CoReady for the Future: Jakarta EE in Zeiten von Cloud Native & Co
Ready for the Future: Jakarta EE in Zeiten von Cloud Native & Co
 
Shared Data in verteilten Architekturen
Shared Data in verteilten ArchitekturenShared Data in verteilten Architekturen
Shared Data in verteilten Architekturen
 
Machine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.jsMachine Learning mit TensorFlow.js
Machine Learning mit TensorFlow.js
 
KI und Architektur
KI und ArchitekturKI und Architektur
KI und Architektur
 
It's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale NetzeIt's not Rocket Science: Neuronale Netze
It's not Rocket Science: Neuronale Netze
 
Business-Mehrwert durch KI
Business-Mehrwert durch KIBusiness-Mehrwert durch KI
Business-Mehrwert durch KI
 
API-Design, Microarchitecture und Testing
API-Design, Microarchitecture und TestingAPI-Design, Microarchitecture und Testing
API-Design, Microarchitecture und Testing
 
Supersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: QuarkusSupersonic Java für die Cloud: Quarkus
Supersonic Java für die Cloud: Quarkus
 
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
Das ist doch alles nur Frontend - Wer braucht da schon Architektur?
 
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
Auf geht‘s in die Cloud: „Das kann doch nicht so schwer sein!“
 
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
Das Product Goal oder "Ohne Ziele laufen eben alle in die Richtung, die ihnen...
 

Web-API-Design jenseits von REST und Request/Response