SlideShare a Scribd company logo
1 of 33
Download to read offline
Web-Technologien
Hypertext Transfer Protocol (HTTP)
Representational State Transfer (REST)
Vorlesung
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
1
Prof. Dr. rer. nat.
Nane Kratzke
Praktische Informatik und
betriebliche Informationssysteme
• Raum: 17-0.10
• Tel.: 0451 300 5549
• Email: nane.kratzke@fh-luebeck.de
• Sprechzeiten: Mi. 14:00 bis 16:00
(nach Mail-Voranmeldung, oder jederzeit
mit Termin)
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
2
Zum Nachlesen ...
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
3
Chapter 5:
Representational State Transfer (REST)
5.1 Deriving REST
5.2 REST Architectural Styles
5.3 REST Architectural Views
HTTP in a Nutshell ...
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
4
• Hypertext Transfer Protocol (HTTP) ist ein zustandsloses Protokoll
zur Übertragung von Daten auf der Anwendungsschicht.
• Es wird hauptsächlich eingesetzt, um Webseiten (HTML-
Dokumente) mit einem Webbrowser zu laden.
• Es ist jedoch nicht darauf beschränkt und kann auch als allgemeines
Datenprotokoll eingesetzt werden (siehe bspw. REST).
https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
URI – Uniform Resource Identifier
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
5
Ein Uniform Resource Identifier (Abk. URI) ist ein Identifikator und besteht aus
einer Zeichenfolge, die zur Identifizierung einer Ressource (wie z.B. Webseiten,
Dateien, Webservices, E-Mail-Empfängern, etc.) dient.
Aus: Tanenbaum, van Steen; Verteilte Systeme; Pearson; Abb. 12.16 (Bsp. für URIs)
URL – Uniform Resource Locator
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
6
https://de.wikipedia.org/wiki/Uniform_Resource_Identifier
More
detailed
Ein Uniform Resource
Locator (Abk. URL) ist
eine spezielle Form einer
URI, die vor allem im
Webkontext gebräuchlich
ist.
Uri
https://api.dartlang.org/1.13.2/dart-core/Uri-class.html
URL – Uniform Resource Locator
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
7
Uri url = Uri.parse(
"http://example.com:992/animal/bird?species=seagul#wings"
);
print("Scheme: ${url.scheme}");
print("Authority: ${url.authority}");
print("Host: ${url.host}");
print("Port: ${url.port}");
print("Path: ${url.path}");
print("Query: ${url.query}");
print("Fragment: ${url.fragment}");
HTTP Request
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
8
GET POST HEAD PUT DELETE OPTIONS
HTTP Methoden
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
9
Aus: Tanenbaum, van Steen; Verteilte Systeme; Pearson; Abb. 12.11 (Von HTTP unterstützte
Operationen/Methoden; nicht vollständig, umfasst nur die häufigsten Operationen)
HTTP wurde als allgemein verwendbares Client-Server Protokoll entworfen. D.h.
Ressourcen lassen sich nicht nur lesend (GET) von einem Server anfordern (was im
Web sicherlich die am meisten verwendete Form ist, wenn man mit Webbrowsern
„surft“), sondern auch erzeugen (POST), verändern (PUT), löschen (DELETE) bzw. nur
Meta Informationen abrufen (HEAD).
Welche Methoden auf einer Ressource anwendbar sind, lässt sich mittels OPTIONS
herausfinden.
HTTPClientRequest
https://api.dartlang.org/1.13.2/dart-io/HttpClientRequest-class.html
HTTP Request
Erzeugen und Auswerten mit Dart
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
10
import 'dart:io';
[...]
final client = new HttpClient();
HttpClientRequest request =
await client.get('www.fh-luebeck.de', 80, '/index.html');
// Body schreiben
final body = "This is the message for the body";
request.contentLength = body.length;
request.write(body);
// Header
print("${request.method} ${request.uri}");
print(request.headers);
// Body
print("n$body");
Achtung:Wegendart:ionuralsKommandozeilenappund
nichtimBrowserlauffähig!FürBrowserbittedart:htmlund
HttpRequestnutzen.LeichtandereAPIberücksichtigen.
HTTP Request
(Ausgabe)
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
11
GET http://www.fh-luebeck.de/index.html
user-agent: Dart/1.13 (dart:io)
accept-encoding: gzip
content-length: 32
host: www.fh-luebeck.de
This is the message for the body
Vorherige Codezeilen würden folgende Konsolenausgabe erzeugen.
HTTP Request (Header Fields)
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
12
https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Aus:Tanenbaum,vanSteen;VerteilteSysteme;Pearson;Abb.12.13
(EinigeHTTP-Nachrichtenköpfe)
Über eine Reihe von
Headern kann der Client
dem Server mitteilen,
welche Arten von
Antworten er verarbeiten
kann.
Umgekehrt, kann der
Server dem Client über
Header mitteilen, welche
Art von Dokument
ausgeliefert wurde.
HTTP Response
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
13
Content Types
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
14
Aus: Tanenbaum, van Steen; Verteilte Systeme; Pearson; Abb. 12.2 (Sechs MIME-Typen der
allgemeinen Ebene und einige verbreitete Untertypen, es fehlt allerdings bspw.
application/json)
MIME =
Multipurpose
Internet Mail
Exchange
Ursprünglich für
Mail Protokolle
gedacht, wird aber
auch für Content-
Types bei HTTP
genutzt, um die Art
des Dokumentes in
der HTTP Response
anzugeben.
HTTPClientResponse
https://api.dartlang.org/1.13.2/dart-io/HttpClientResponse-class.html
HTTP Response
Erzeugen und Auswerten mit Dart
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
15
import 'dart:io';
import 'dart:convert‘;
[...]
final client = new HttpClient();
HttpClientRequest req =
await client.get('www.fh-luebeck.de', 80, '/index.html');
HttpClientResponse resp = await request.close();
// Response Header
print(
"${req.method} ${req.uri} ${resp.statusCode} ${resp.reasonPhrase}“
);
print("${resp.headers}");
print("");
// Response Body
final body = await resp.transform(UTF8.decoder).join("n");
print(body);
Achtung:Wegendart:ionuralsKommandozeilenappundnichtim
Browserlauffähig!FürBrowserbittedart:htmlundHttpRequest
nutzen.LeichtandereAPIberücksichtigen.
HTTP Response
(Ausgabe)
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
16
GET http://www.fh-luebeck.de/index.html 200 OK
x-powered-by: PHP/5.4.45-0+deb7u2
cache-control: max-age=0
date: Mon, 25 Jan 2016 08:20:36 GMT
vary: Accept-Encoding
content-encoding: gzip
content-length: 8572
content-type: text/html; charset=utf-8
server: Apache
expires: Mon, 25 Jan 2016 08:20:36 GMT
<!DOCTYPE html>
<html lang="de">
<head>
[...]
Vorherige Codezeilen, würden folgende Konsolenausgabe erzeugen.
HTTP Statuscodes
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
17
• 1xx Informationen
• 2xx Erfolgreiche Operation
• 3xx Umleitung (Redirect)
• 4xx Client Fehler (z.B. Bad
Request, Not Found)
• 5xx Server Fehler
Gute Übersicht gebräuchlicher HTTP
Statuscodes:
http://www.restapitutorial.com/httpstatuscodes.html
Zum Nachlesen ...
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
18
Chapter 5:
Representational State Transfer (REST)
5.1 Deriving REST
5.2 REST Architectural Styles
5.3 REST Architectural Views
REST in a Nutshell ...
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
19
• Representational State Transfer (REST) ist ein Architekturstil für
verteilte Systeme auf Basis von HTTP
• REST APIs dienen primär der Maschine-Maschine-Kommunikation
• REST ist eine Alternative zu ähnlichen Ansätzen wie SOAP oder RPC
• REST Requests arbeiten auf Ressourcen (anders als bspw. RPC)
• Client und Server können in anderen Sprachen realisiert sein (language
agnostic)
• REST Responses nutzen daher gerne sprachunabhängige
Serialisierungsformate wie bspw. JSON oder XML
• Die für REST nötige Infrastruktur und Protokolle sind im WWW bereits
vorhanden
• Da das WWW (horizontal) skalierbar ist, sind es REST-basierte Systeme
zumeist auch (wenn man ein paar Dinge beachtet)
https://de.wikipedia.org/wiki/Representational_State_Transfer
Für REST benötigte HTTP Methoden
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
20
Methode Bedeutung Idempotent Sicher CRUD
POST Fügt eine neue
Ressource hinzu
create
GET Fordert eine
Ressource an
x x read
PUT Ändert eine
Ressource
x update
DELETE Löscht eine
Ressource
x delete
Sicher (safe): Eine Operation ändert nicht den Zustand
(nebeneffektsfreie Operation)
Idempotent: Wird eine Operation zweimal hintereinander ausgeführt,
ist die zweite Operation sicher (d.h. ändert nichts mehr am Zustand)
Same-Origin-Policy
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
21
Quelle: https://de.wikipedia.org/wiki/Same-Origin-Policy
Die Same-Origin-Policy (SOP) ist ein Sicherheitskonzept,
das clientseitigen Skriptsprachen untersagt, auf
Ressourcen zuzugreifen, deren Speicherort nicht
dem Origin entspricht. Sie stellt ein Sicherheitselement in
modernen Browsern zum Schutz vor Angriffen dar.
Hintergrund: Skriptsprachen im Browser haben Zugriff auf
Kommunikation zwischen Browser und Web-Server. Dies
beinhaltet sowohl das Auslesen, die Manipulation, das
Empfangen und Senden von Daten.
Daraus ergibt sich die Sicherheitsanforderung, dass
keine Daten aus einem Kontext (zum Beispiel der
Verbindung des Browsers zu der Seite einer Bank) von
einem Skript aus einem anderen Kontext zugreifbar oder
manipulierbar sein darf. Um dies zu erreichen, wird beim
Zugriff eines Skriptes auf eine Ressource die Herkunft
(origin) von beiden verglichen. Der Zugriff wird nur
erlaubt, wenn Skript und angeforderte Ressource
dieselbe Herkunft (origin) haben (vom selben Server
stammen).
Same Origin Definition
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
22
http://www.example.com/dir/page.html
Die Same-Origin-Policy (SOP) ist erfüllt, wenn bei zwei Ressourcen deren
URL-Anteile Scheme, Host und Port übereinstimmen.
Scheme Host Port Origin
SOP und REST vertragen sich nicht immer
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
23
Die Same-Origin-Policy (SOP) ist dann ggf. hinderlich, wenn von einem Server eine
Webapplikation geladen wird, die mit einem zweiten (nicht notwendig identischem)
Server eine z.B. REST-basierte Kommunikation aufbauen muss.
In solchen Fällen kann der HTTP Server, der follow up requests bearbeitet, seine
Responses mittels CORS Headers (Cross Origin Resource Sharing) kennzeichnen.
Der HTTP Client verzichtet dann auf eine Same Origin Prüfung.
CORS
Ermöglichen mit Dart
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
24
/**
* Sets CORS headers for HTTP responses.
*/
void enableCors(HttpResponse response) {
response.headers.add(
"Access-Control-Allow-Origin",
"*"
);
response.headers.add(
"Access-Control-Allow-Methods",
"POST, GET, DELETE, PUT, OPTIONS"
);
response.headers.add(
"Access-Control-Allow-Headers",
"Origin, Content-Type, Accept, Charset"
);
}
Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, der Webclients Cross-
Origin-Requests ermöglicht. Die Einschränkungen, die durch die SOP auferlegt sind,
können vom Server aufgehoben werden. Der Server kann den Zugriff durch setzen
entsprechender Access-Control-Allow-* Response Header erlauben/einschränken.
Ein einfacher REST-basierter Hello World
Service
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
25
Methode Resource CRUD Beschreibung Beispiel
POST /greet/:lang Create Erzeugt einen neuen Gruß POST /greet/deutsch
greet=hallo%20welt
GET /greet/:lang Read Liest einen Gruß für Sprache :lang GET /greet/deutsch
PUT /greet/:lang Update Ändert einen Gruß für Sprache :lang PUT /greet/deutsch
Greet=Hallo%20Welt
DELETE /greet/:lang Delete Löscht den Gruß der Sprache :lang DELETE /greet/deutsch
GET /greets List Listet alle im Service gespeicherten
Grüße (Antwort als JSON Map)
GET /greets
Das REST-Prinzip soll exemplarisch an einem kleinen
Hello World Service demonstriert werden, der
mehrsprachige Gruß Ressourcen („Hello World“
Flosklen) verwaltet. Der Service soll um Grüße in
fremden Sprachen ergänzt werden, einen Gruß in einer
spezifischen Sprache ausgeben, Grüße bestehender
Sprachen ändern und löschen können. Ferner soll er
einen Überblick über alle hinterlegten Sprachen und
zugeordneten Grüße liefern können.
Ein einfacher REST Server in Dart
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
26
// A simple REST based Hello World service.
class Server {
// Service state. Default languages and greets (UTF-8 encoded!).
var greets = {
"dutch" : "Hello wereld",
"english" : "Hello world",
"french" : "Bonjour monde",
"german" : "Hallo Welt",
"italian" : "Ciao mondo",
"portuguese" : "Olá mundo",
"spanish" : "Hola mundo"
};
// Internally used for JSON pretty printing in JSON responses.
final json = new JsonEncoder.withIndent(' ');
// Resource Path definitions.
final greetUrl = new UrlPattern(r'/greet/(w+)'); // /greet/:lang
final greetsUrl = new UrlPattern(r'/greets'); // /greets
[...]
}
Ein einfacher REST Server in Dart
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
27
import 'dart:io';
import 'package:route/server.dart';
[...]
/**
* Starts the REST API server.
*/
Future<Router> serve({ip: '0.0.0.0', port: 4040}) async {
final server = await HttpServer.bind(ip, port);
final router = new Router(server)
..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet)
..serve(greetUrl, method: 'POST' ).listen(createGreet)
..serve(greetUrl, method: 'GET' ).listen(readGreet)
..serve(greetUrl, method: 'PUT' ).listen(updateGreet)
..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet)
..serve(greetsUrl, method: 'GET' ).listen(listGreets);
return new Future.value(router);
}
OPTIONS /greet/:lang
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
28
/**
* Handles OPTIONS /greet/:lang requests
* (used by the dart:html HttpRequest class).
* This is necessary to handle HTTP client behaviors
* (often an OPTIONS call is launched to determine
* whether a POST, DELETE, PUT call is allowed).
*/
void optionsGreet(HttpRequest req) {
HttpResponse res = req.response;
enableCors(res);
res.write("POST, GET, DELETE, PUT, OPTIONS");
res.close();
}
final router = new Router(server)
..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet)
..serve(greetUrl, method: 'POST' ).listen(createGreet)
..serve(greetUrl, method: 'GET' ).listen(readGreet)
..serve(greetUrl, method: 'PUT' ).listen(updateGreet)
..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet)
..serve(greetsUrl, method: 'GET' ).listen(listGreets);
Es gibt diverse HTTP Client
Libraries, die bei POST,
DELETE und PUT vorher
per OPTIONS anfragen, was
für Methoden auf einer
Ressource überhaupt
zulässig sind.
Es macht für diese Fälle
Sinn für jede Ressource
einen entsprechenden
OPTIONS Handler
vorzusehen, ansonsten
scheitert ein Request bereits
beim BITTE BITTE sagen.
POST /greet/:lang
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
29
/**
* Handles POST /greet/:lang requests to create a new language specific greet.
* Params: greet (greet in language :lang)
*/
void createGreet(HttpRequest req) {
HttpResponse res = req.response; // To be created response
enableCors(res); // set CORS headers
final lang = greetUrl.parse(req.uri.path).first; // Language part of path
req.transform(UTF8.decoder).join("n").then((body) { // req is stream (body)
final params = Uri.parse("?$body").queryParameters; // body contains params
if (greets.containsKey(lang)) { // lang already existing
res.statusCode = HttpStatus.CONFLICT; // 409
res.reasonPhrase = "Already existing";
res.close(); // Send response (error)
return;
}
if (!params.containsKey('greet')) { // no greet parameter
res.statusCode = HttpStatus.BAD_REQUEST; // 400
res.reasonPhrase = "Missing parameter";
res.close(); // Send response (error)
return;
}
greets[lang] = params['greet']; // Change server state
res.statusCode = HttpStatus.CREATED; // 201
res.close(); // Send response (succes)
});
}
greet=Hallo%20Welt
GET /greet/:lang
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
30
/**
* Handles GET /greet/:lang requests to read
* a language specific greet.
*/
void readGreet(HttpRequest req) {
HttpResponse res = req.response;
enableCors(res);
final lang = greetUrl.parse(req.uri.path).first;
if (!greets.containsKey(lang)) {
res.statusCode = HttpStatus.NOT_FOUND; // 404
res.reasonPhrase = "Not Found";
res.write("Not Found");
res.close(); // Send response (error)
return;
}
res.write(greets[lang]); // Read Status
res.close(); // Send response (success)
}
final router = new Router(server)
..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet)
..serve(greetUrl, method: 'POST' ).listen(createGreet)
..serve(greetUrl, method: 'GET' ).listen(readGreet)
..serve(greetUrl, method: 'PUT' ).listen(updateGreet)
..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet)
..serve(greetsUrl, method: 'GET' ).listen(listGreets);
DELETE /greet/:lang
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
31
/**
* Handles DELETE /greet/:lang requests to delete
* a language specific greet.
*/
void deleteGreet(HttpRequest req) {
HttpResponse res = req.response;
enableCors(res);
final lang = greetUrl.parse(req.uri.path).first;
greets.remove(lang); // Löschoperation
res.close();
}
final router = new Router(server)
..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet)
..serve(greetUrl, method: 'POST' ).listen(createGreet)
..serve(greetUrl, method: 'GET' ).listen(readGreet)
..serve(greetUrl, method: 'PUT' ).listen(updateGreet)
..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet)
..serve(greetsUrl, method: 'GET' ).listen(listGreets);
Eine DELETE Operation ist
idempotent. D.h.
wiederholte Löschung (bzw.
das löschen nicht existenter
Ressourcen) sollten nicht in
einem Fehler enden.
GET /greets
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
32
/**
* Handles GET /greets requests to list all
* language specific greets (JSON).
*/
void listGreets(HttpRequest req) {
HttpResponse res = req.response;
enableCors(res);
res.headers.contentType = new ContentType(
"application", "json", charset: 'UTF-8‘
);
res.write(json.convert(greets));
res.close();
}
final router = new Router(server)
..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet)
..serve(greetUrl, method: 'POST' ).listen(createGreet)
..serve(greetUrl, method: 'GET' ).listen(readGreet)
..serve(greetUrl, method: 'PUT' ).listen(updateGreet)
..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet)
..serve(greetsUrl, method: 'GET' ).listen(listGreets);
Liefert alle greets
Ressourcen.
Zusammenfassung
• HTTP
• Uniform Resource Identifiers (URI) und Locators (URL)
• HTTP Request (Client) und Response (Server)
• HTTP Methoden
• HTTP Header
• HTTP Content Types (MIME)
• HTTP Status Codes
• Dart Libraries für HTTP
• Same Origin Policy (SOP) und Cross Origin Resource
Sharing (CORS)
• REST
• CRUD und HTTP Methoden
• Sichere und idempotente Operationen
• REST am Bsp. eines Hello World Service
• Dart Libraries für REST
Prof. Dr. rer. nat. Nane Kratzke
Praktische Informatik und betriebliche Informationssysteme
33

More Related Content

What's hot

MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析Takahiro Inoue
 
Présentation commerciale TECH-ERP
Présentation commerciale TECH-ERP Présentation commerciale TECH-ERP
Présentation commerciale TECH-ERP Tech-IT Maroc
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Aziz Darouichi
 
Initiation à Android
Initiation à AndroidInitiation à Android
Initiation à AndroidLilia Sfaxi
 
寝プログラミングのススメ
寝プログラミングのススメ寝プログラミングのススメ
寝プログラミングのススメYoshitaka Kawashima
 
BigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans HadoopBigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans HadoopLilia Sfaxi
 
Python Interview Questions And Answers
Python Interview Questions And AnswersPython Interview Questions And Answers
Python Interview Questions And AnswersH2Kinfosys
 
BigData_TP4 : Cassandra
BigData_TP4 : CassandraBigData_TP4 : Cassandra
BigData_TP4 : CassandraLilia Sfaxi
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Wen-Tien Chang
 
Reitit - Clojure/North 2019
Reitit - Clojure/North 2019Reitit - Clojure/North 2019
Reitit - Clojure/North 2019Metosin Oy
 
3D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 2014
3D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 20143D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 2014
3D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 2014roboard
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するkwatch
 
明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築MILI-LLC
 
ソーシャルアプリにおけるRedisの活用事例とトラブル事例
ソーシャルアプリにおけるRedisの活用事例とトラブル事例ソーシャルアプリにおけるRedisの活用事例とトラブル事例
ソーシャルアプリにおけるRedisの活用事例とトラブル事例leverages_event
 
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術Masahiro Nagano
 

What's hot (20)

MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
 
Présentation commerciale TECH-ERP
Présentation commerciale TECH-ERP Présentation commerciale TECH-ERP
Présentation commerciale TECH-ERP
 
Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références Chapitre4: Pointeurs et références
Chapitre4: Pointeurs et références
 
Initiation à Android
Initiation à AndroidInitiation à Android
Initiation à Android
 
Lab3-DB_Neo4j
Lab3-DB_Neo4jLab3-DB_Neo4j
Lab3-DB_Neo4j
 
Merise
MeriseMerise
Merise
 
寝プログラミングのススメ
寝プログラミングのススメ寝プログラミングのススメ
寝プログラミングのススメ
 
BigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans HadoopBigData_TP2: Design Patterns dans Hadoop
BigData_TP2: Design Patterns dans Hadoop
 
Python Interview Questions And Answers
Python Interview Questions And AnswersPython Interview Questions And Answers
Python Interview Questions And Answers
 
BigData_TP4 : Cassandra
BigData_TP4 : CassandraBigData_TP4 : Cassandra
BigData_TP4 : Cassandra
 
Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛Ruby Rails 老司機帶飛
Ruby Rails 老司機帶飛
 
Dapper
DapperDapper
Dapper
 
Reitit - Clojure/North 2019
Reitit - Clojure/North 2019Reitit - Clojure/North 2019
Reitit - Clojure/North 2019
 
3D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 2014
3D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 20143D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 2014
3D Printer 關鍵軟體控制技術之分析與探討 @ COSCUP 2014
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築明日からはじめられる Docker + さくらvpsを使った開発環境構築
明日からはじめられる Docker + さくらvpsを使った開発環境構築
 
Dash Intro.pdf
Dash Intro.pdfDash Intro.pdf
Dash Intro.pdf
 
ソーシャルアプリにおけるRedisの活用事例とトラブル事例
ソーシャルアプリにおけるRedisの活用事例とトラブル事例ソーシャルアプリにおけるRedisの活用事例とトラブル事例
ソーシャルアプリにおけるRedisの活用事例とトラブル事例
 
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
 

Viewers also liked

Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...
Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...
Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...Nane Kratzke
 
Diego Ricol Freyre: casas unicas
Diego Ricol Freyre: casas unicasDiego Ricol Freyre: casas unicas
Diego Ricol Freyre: casas unicasDiego Ricol Freyre
 
Cac tenerife
Cac tenerifeCac tenerife
Cac tenerifeecucrw
 
Pinnacle Group Presentation
Pinnacle Group PresentationPinnacle Group Presentation
Pinnacle Group PresentationLorissa Walker
 
Deyplasa pvc catalogo
Deyplasa pvc catalogoDeyplasa pvc catalogo
Deyplasa pvc catalogoJavier Alonso
 
Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...
Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...
Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...s-mueller
 
Informe comunidades de práctica 1er semestre 10102014.pdf
Informe comunidades de práctica 1er semestre 10102014.pdfInforme comunidades de práctica 1er semestre 10102014.pdf
Informe comunidades de práctica 1er semestre 10102014.pdfFlorencia Garcia Rambeaud
 
Trebo Lis Numero 4[1]
Trebo Lis Numero 4[1]Trebo Lis Numero 4[1]
Trebo Lis Numero 4[1]FCO PERAN
 
Felicitacion Navidad 2008-2009 FEP-USO
Felicitacion Navidad 2008-2009 FEP-USOFelicitacion Navidad 2008-2009 FEP-USO
Felicitacion Navidad 2008-2009 FEP-USOguestbcdfff0
 
Troy Petteway Resume_ 02Jun2011
Troy Petteway Resume_ 02Jun2011Troy Petteway Resume_ 02Jun2011
Troy Petteway Resume_ 02Jun2011Troy Petteway
 
Honeywell Access OKP0N26 Data Sheet
Honeywell Access OKP0N26 Data SheetHoneywell Access OKP0N26 Data Sheet
Honeywell Access OKP0N26 Data SheetJMAC Supply
 
GUIÓN LITERARIO - PILOTO - ÚNICOS
GUIÓN LITERARIO - PILOTO - ÚNICOSGUIÓN LITERARIO - PILOTO - ÚNICOS
GUIÓN LITERARIO - PILOTO - ÚNICOSPepe Ruiz
 
Curso SEO
Curso SEOCurso SEO
Curso SEOmuga1
 
Madrid RegióN InéDita
Madrid RegióN InéDitaMadrid RegióN InéDita
Madrid RegióN InéDitaloveis .
 
Mcdowellaaron_masteryjournaltimeline
Mcdowellaaron_masteryjournaltimelineMcdowellaaron_masteryjournaltimeline
Mcdowellaaron_masteryjournaltimelineAaron McDowell
 

Viewers also liked (20)

Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...
Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...
Smuggling Multi-Cloud Support into Cloud-native Applications using Elastic Co...
 
Catalogo1
Catalogo1Catalogo1
Catalogo1
 
Diego Ricol Freyre: casas unicas
Diego Ricol Freyre: casas unicasDiego Ricol Freyre: casas unicas
Diego Ricol Freyre: casas unicas
 
Cac tenerife
Cac tenerifeCac tenerife
Cac tenerife
 
Pinnacle Group Presentation
Pinnacle Group PresentationPinnacle Group Presentation
Pinnacle Group Presentation
 
Deyplasa pvc catalogo
Deyplasa pvc catalogoDeyplasa pvc catalogo
Deyplasa pvc catalogo
 
Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...
Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...
Stuck and Frustrated or In Flow and Happy: Sensing Developers’ Emotions and P...
 
Informe comunidades de práctica 1er semestre 10102014.pdf
Informe comunidades de práctica 1er semestre 10102014.pdfInforme comunidades de práctica 1er semestre 10102014.pdf
Informe comunidades de práctica 1er semestre 10102014.pdf
 
Trebo Lis Numero 4[1]
Trebo Lis Numero 4[1]Trebo Lis Numero 4[1]
Trebo Lis Numero 4[1]
 
Felicitacion Navidad 2008-2009 FEP-USO
Felicitacion Navidad 2008-2009 FEP-USOFelicitacion Navidad 2008-2009 FEP-USO
Felicitacion Navidad 2008-2009 FEP-USO
 
Teknologikaravanen - katalog
Teknologikaravanen - katalogTeknologikaravanen - katalog
Teknologikaravanen - katalog
 
Troy Petteway Resume_ 02Jun2011
Troy Petteway Resume_ 02Jun2011Troy Petteway Resume_ 02Jun2011
Troy Petteway Resume_ 02Jun2011
 
Trg dept group rules and tea break
Trg dept group rules and tea breakTrg dept group rules and tea break
Trg dept group rules and tea break
 
Honeywell Access OKP0N26 Data Sheet
Honeywell Access OKP0N26 Data SheetHoneywell Access OKP0N26 Data Sheet
Honeywell Access OKP0N26 Data Sheet
 
GUIÓN LITERARIO - PILOTO - ÚNICOS
GUIÓN LITERARIO - PILOTO - ÚNICOSGUIÓN LITERARIO - PILOTO - ÚNICOS
GUIÓN LITERARIO - PILOTO - ÚNICOS
 
Curso SEO
Curso SEOCurso SEO
Curso SEO
 
Madrid RegióN InéDita
Madrid RegióN InéDitaMadrid RegióN InéDita
Madrid RegióN InéDita
 
Mcdowellaaron_masteryjournaltimeline
Mcdowellaaron_masteryjournaltimelineMcdowellaaron_masteryjournaltimeline
Mcdowellaaron_masteryjournaltimeline
 
Master en Comunicación, Organización de Eventos y Protocolo
Master en Comunicación, Organización de Eventos y ProtocoloMaster en Comunicación, Organización de Eventos y Protocolo
Master en Comunicación, Organización de Eventos y Protocolo
 
A Ds World Credentials
A Ds World   CredentialsA Ds World   Credentials
A Ds World Credentials
 

Similar to RESTful APIs mit Dart

Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Nane Kratzke
 
Schnittstellen und Webservices
Schnittstellen und WebservicesSchnittstellen und Webservices
Schnittstellen und WebservicesJakob .
 
Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Nane Kratzke
 
Python, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und RaumfahrtforschungPython, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und RaumfahrtforschungAndreas Schreiber
 
Die Open eHealth Integration Platform
Die Open eHealth Integration PlatformDie Open eHealth Integration Platform
Die Open eHealth Integration Platformkrasserm
 
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher SoftwareEinsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher SoftwareAndreas Schreiber
 
Python in der Luft- und Raumfahrt
Python in der Luft- und RaumfahrtPython in der Luft- und Raumfahrt
Python in der Luft- und RaumfahrtAndreas Schreiber
 
HTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungHTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungChristian Baranowski
 
Textanalyse mit UIMA und Hadoop
Textanalyse mit UIMA und HadoopTextanalyse mit UIMA und Hadoop
Textanalyse mit UIMA und Hadoopinovex GmbH
 
Templates, Code & Tools
Templates, Code & ToolsTemplates, Code & Tools
Templates, Code & ToolsUlrich Krause
 
Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservicesmesseb
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht SkriptsprachenA. LE
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashStephan Schmidt
 
Webtechnologien Grundlagen und Auswahl geeigneter Web Rahmenwerke
Webtechnologien Grundlagen und Auswahl geeigneter Web RahmenwerkeWebtechnologien Grundlagen und Auswahl geeigneter Web Rahmenwerke
Webtechnologien Grundlagen und Auswahl geeigneter Web Rahmenwerkeadoubleu
 

Similar to RESTful APIs mit Dart (20)

Interaktives Web
Interaktives WebInteraktives Web
Interaktives Web
 
Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)Dart (Teil II der Tour de Dart)
Dart (Teil II der Tour de Dart)
 
Rest
RestRest
Rest
 
SoSe 2013 | Basisinformationstechnologie II - 03_Rechnerkommunikation-II
SoSe 2013 | Basisinformationstechnologie II - 03_Rechnerkommunikation-IISoSe 2013 | Basisinformationstechnologie II - 03_Rechnerkommunikation-II
SoSe 2013 | Basisinformationstechnologie II - 03_Rechnerkommunikation-II
 
Schnittstellen und Webservices
Schnittstellen und WebservicesSchnittstellen und Webservices
Schnittstellen und Webservices
 
Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)Dart (Teil I der Tour de Dart)
Dart (Teil I der Tour de Dart)
 
Python, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und RaumfahrtforschungPython, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und Raumfahrtforschung
 
Die Open eHealth Integration Platform
Die Open eHealth Integration PlatformDie Open eHealth Integration Platform
Die Open eHealth Integration Platform
 
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher SoftwareEinsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
 
Python in der Luft- und Raumfahrt
Python in der Luft- und RaumfahrtPython in der Luft- und Raumfahrt
Python in der Luft- und Raumfahrt
 
HTTP und Java Servlets Programmierung
HTTP und Java Servlets ProgrammierungHTTP und Java Servlets Programmierung
HTTP und Java Servlets Programmierung
 
Vorlesung SOA - DIS AG.pptx
Vorlesung SOA - DIS AG.pptxVorlesung SOA - DIS AG.pptx
Vorlesung SOA - DIS AG.pptx
 
Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1Web Entwicklung mit PHP - Teil 1
Web Entwicklung mit PHP - Teil 1
 
Textanalyse mit UIMA und Hadoop
Textanalyse mit UIMA und HadoopTextanalyse mit UIMA und Hadoop
Textanalyse mit UIMA und Hadoop
 
Templates, Code & Tools
Templates, Code & ToolsTemplates, Code & Tools
Templates, Code & Tools
 
Bit sosem 2016-wieners-sitzung-07_rechnerkommunikation-ii
Bit sosem 2016-wieners-sitzung-07_rechnerkommunikation-iiBit sosem 2016-wieners-sitzung-07_rechnerkommunikation-ii
Bit sosem 2016-wieners-sitzung-07_rechnerkommunikation-ii
 
Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservices
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht Skriptsprachen
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit Flash
 
Webtechnologien Grundlagen und Auswahl geeigneter Web Rahmenwerke
Webtechnologien Grundlagen und Auswahl geeigneter Web RahmenwerkeWebtechnologien Grundlagen und Auswahl geeigneter Web Rahmenwerke
Webtechnologien Grundlagen und Auswahl geeigneter Web Rahmenwerke
 

More from Nane Kratzke

Smart like a Fox: How clever students trick dumb programming assignment asses...
Smart like a Fox: How clever students trick dumb programming assignment asses...Smart like a Fox: How clever students trick dumb programming assignment asses...
Smart like a Fox: How clever students trick dumb programming assignment asses...Nane Kratzke
 
#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...
#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...
#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...Nane Kratzke
 
About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...
About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...
About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...Nane Kratzke
 
Serverless Architectures - Where have all the servers gone?
Serverless Architectures - Where have all the servers gone?Serverless Architectures - Where have all the servers gone?
Serverless Architectures - Where have all the servers gone?Nane Kratzke
 
There is no impenetrable system - So, why we are still waiting to get breached?
There is no impenetrable system - So, why we are still waiting to get breached?There is no impenetrable system - So, why we are still waiting to get breached?
There is no impenetrable system - So, why we are still waiting to get breached?Nane Kratzke
 
Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...
Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...
Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...Nane Kratzke
 
We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?
We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?
We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?Nane Kratzke
 
About an Immune System Understanding for Cloud-native Applications - Biology ...
About an Immune System Understanding for Cloud-native Applications - Biology ...About an Immune System Understanding for Cloud-native Applications - Biology ...
About an Immune System Understanding for Cloud-native Applications - Biology ...Nane Kratzke
 
Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?
Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?
Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?Nane Kratzke
 
Was die Cloud mit einem brennenden Haus zu tun hat
Was die Cloud mit einem brennenden Haus zu tun hatWas die Cloud mit einem brennenden Haus zu tun hat
Was die Cloud mit einem brennenden Haus zu tun hatNane Kratzke
 
What the cloud has to do with a burning house?
What the cloud has to do with a burning house?What the cloud has to do with a burning house?
What the cloud has to do with a burning house?Nane Kratzke
 
ClouNS - A Cloud-native Application Reference Model for Enterprise Architects
ClouNS - A Cloud-native Application Reference Model for Enterprise ArchitectsClouNS - A Cloud-native Application Reference Model for Enterprise Architects
ClouNS - A Cloud-native Application Reference Model for Enterprise ArchitectsNane Kratzke
 
ppbench - A Visualizing Network Benchmark for Microservices
ppbench - A Visualizing Network Benchmark for Microservicesppbench - A Visualizing Network Benchmark for Microservices
ppbench - A Visualizing Network Benchmark for MicroservicesNane Kratzke
 
About Microservices, Containers and their Underestimated Impact on Network Pe...
About Microservices, Containers and their Underestimated Impact on Network Pe...About Microservices, Containers and their Underestimated Impact on Network Pe...
About Microservices, Containers and their Underestimated Impact on Network Pe...Nane Kratzke
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und LambdasNane Kratzke
 
Cloud Economics in Training and Simulation
Cloud Economics in Training and SimulationCloud Economics in Training and Simulation
Cloud Economics in Training and SimulationNane Kratzke
 
Are cloud based virtual labs cost effective? (CSEDU 2012)
Are cloud based virtual labs cost effective? (CSEDU 2012)Are cloud based virtual labs cost effective? (CSEDU 2012)
Are cloud based virtual labs cost effective? (CSEDU 2012)Nane Kratzke
 
What Cost Us Cloud Computing
What Cost Us Cloud ComputingWhat Cost Us Cloud Computing
What Cost Us Cloud ComputingNane Kratzke
 
Overcoming Cost Intransparency of Cloud Computing
Overcoming Cost Intransparency of Cloud ComputingOvercoming Cost Intransparency of Cloud Computing
Overcoming Cost Intransparency of Cloud ComputingNane Kratzke
 

More from Nane Kratzke (19)

Smart like a Fox: How clever students trick dumb programming assignment asses...
Smart like a Fox: How clever students trick dumb programming assignment asses...Smart like a Fox: How clever students trick dumb programming assignment asses...
Smart like a Fox: How clever students trick dumb programming assignment asses...
 
#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...
#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...
#BTW17 on Twitter (Die Bundestagswahl 2017 auf Twitter - war der Ausgang abzu...
 
About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...
About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...
About being the Tortoise or the Hare? Making Cloud Applications too Fast and ...
 
Serverless Architectures - Where have all the servers gone?
Serverless Architectures - Where have all the servers gone?Serverless Architectures - Where have all the servers gone?
Serverless Architectures - Where have all the servers gone?
 
There is no impenetrable system - So, why we are still waiting to get breached?
There is no impenetrable system - So, why we are still waiting to get breached?There is no impenetrable system - So, why we are still waiting to get breached?
There is no impenetrable system - So, why we are still waiting to get breached?
 
Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...
Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...
Towards a Lightweight Multi-Cloud DSL for Elastic and Transferable Cloud-nati...
 
We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?
We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?
We have the Bricks to Build Cloud-native Cathedrals - But do we have the mortar?
 
About an Immune System Understanding for Cloud-native Applications - Biology ...
About an Immune System Understanding for Cloud-native Applications - Biology ...About an Immune System Understanding for Cloud-native Applications - Biology ...
About an Immune System Understanding for Cloud-native Applications - Biology ...
 
Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?
Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?
Der Bundestagswahlkampf 2017 auf Twitter - War der Ausgang abzusehen?
 
Was die Cloud mit einem brennenden Haus zu tun hat
Was die Cloud mit einem brennenden Haus zu tun hatWas die Cloud mit einem brennenden Haus zu tun hat
Was die Cloud mit einem brennenden Haus zu tun hat
 
What the cloud has to do with a burning house?
What the cloud has to do with a burning house?What the cloud has to do with a burning house?
What the cloud has to do with a burning house?
 
ClouNS - A Cloud-native Application Reference Model for Enterprise Architects
ClouNS - A Cloud-native Application Reference Model for Enterprise ArchitectsClouNS - A Cloud-native Application Reference Model for Enterprise Architects
ClouNS - A Cloud-native Application Reference Model for Enterprise Architects
 
ppbench - A Visualizing Network Benchmark for Microservices
ppbench - A Visualizing Network Benchmark for Microservicesppbench - A Visualizing Network Benchmark for Microservices
ppbench - A Visualizing Network Benchmark for Microservices
 
About Microservices, Containers and their Underestimated Impact on Network Pe...
About Microservices, Containers and their Underestimated Impact on Network Pe...About Microservices, Containers and their Underestimated Impact on Network Pe...
About Microservices, Containers and their Underestimated Impact on Network Pe...
 
Java Streams und Lambdas
Java Streams und LambdasJava Streams und Lambdas
Java Streams und Lambdas
 
Cloud Economics in Training and Simulation
Cloud Economics in Training and SimulationCloud Economics in Training and Simulation
Cloud Economics in Training and Simulation
 
Are cloud based virtual labs cost effective? (CSEDU 2012)
Are cloud based virtual labs cost effective? (CSEDU 2012)Are cloud based virtual labs cost effective? (CSEDU 2012)
Are cloud based virtual labs cost effective? (CSEDU 2012)
 
What Cost Us Cloud Computing
What Cost Us Cloud ComputingWhat Cost Us Cloud Computing
What Cost Us Cloud Computing
 
Overcoming Cost Intransparency of Cloud Computing
Overcoming Cost Intransparency of Cloud ComputingOvercoming Cost Intransparency of Cloud Computing
Overcoming Cost Intransparency of Cloud Computing
 

RESTful APIs mit Dart

  • 1. Web-Technologien Hypertext Transfer Protocol (HTTP) Representational State Transfer (REST) Vorlesung Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 1
  • 2. Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme • Raum: 17-0.10 • Tel.: 0451 300 5549 • Email: nane.kratzke@fh-luebeck.de • Sprechzeiten: Mi. 14:00 bis 16:00 (nach Mail-Voranmeldung, oder jederzeit mit Termin) Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 2
  • 3. Zum Nachlesen ... Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 3 Chapter 5: Representational State Transfer (REST) 5.1 Deriving REST 5.2 REST Architectural Styles 5.3 REST Architectural Views
  • 4. HTTP in a Nutshell ... Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 4 • Hypertext Transfer Protocol (HTTP) ist ein zustandsloses Protokoll zur Übertragung von Daten auf der Anwendungsschicht. • Es wird hauptsächlich eingesetzt, um Webseiten (HTML- Dokumente) mit einem Webbrowser zu laden. • Es ist jedoch nicht darauf beschränkt und kann auch als allgemeines Datenprotokoll eingesetzt werden (siehe bspw. REST). https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
  • 5. URI – Uniform Resource Identifier Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 5 Ein Uniform Resource Identifier (Abk. URI) ist ein Identifikator und besteht aus einer Zeichenfolge, die zur Identifizierung einer Ressource (wie z.B. Webseiten, Dateien, Webservices, E-Mail-Empfängern, etc.) dient. Aus: Tanenbaum, van Steen; Verteilte Systeme; Pearson; Abb. 12.16 (Bsp. für URIs)
  • 6. URL – Uniform Resource Locator Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 6 https://de.wikipedia.org/wiki/Uniform_Resource_Identifier More detailed Ein Uniform Resource Locator (Abk. URL) ist eine spezielle Form einer URI, die vor allem im Webkontext gebräuchlich ist.
  • 7. Uri https://api.dartlang.org/1.13.2/dart-core/Uri-class.html URL – Uniform Resource Locator Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 7 Uri url = Uri.parse( "http://example.com:992/animal/bird?species=seagul#wings" ); print("Scheme: ${url.scheme}"); print("Authority: ${url.authority}"); print("Host: ${url.host}"); print("Port: ${url.port}"); print("Path: ${url.path}"); print("Query: ${url.query}"); print("Fragment: ${url.fragment}");
  • 8. HTTP Request Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 8 GET POST HEAD PUT DELETE OPTIONS
  • 9. HTTP Methoden Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 9 Aus: Tanenbaum, van Steen; Verteilte Systeme; Pearson; Abb. 12.11 (Von HTTP unterstützte Operationen/Methoden; nicht vollständig, umfasst nur die häufigsten Operationen) HTTP wurde als allgemein verwendbares Client-Server Protokoll entworfen. D.h. Ressourcen lassen sich nicht nur lesend (GET) von einem Server anfordern (was im Web sicherlich die am meisten verwendete Form ist, wenn man mit Webbrowsern „surft“), sondern auch erzeugen (POST), verändern (PUT), löschen (DELETE) bzw. nur Meta Informationen abrufen (HEAD). Welche Methoden auf einer Ressource anwendbar sind, lässt sich mittels OPTIONS herausfinden.
  • 10. HTTPClientRequest https://api.dartlang.org/1.13.2/dart-io/HttpClientRequest-class.html HTTP Request Erzeugen und Auswerten mit Dart Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 10 import 'dart:io'; [...] final client = new HttpClient(); HttpClientRequest request = await client.get('www.fh-luebeck.de', 80, '/index.html'); // Body schreiben final body = "This is the message for the body"; request.contentLength = body.length; request.write(body); // Header print("${request.method} ${request.uri}"); print(request.headers); // Body print("n$body"); Achtung:Wegendart:ionuralsKommandozeilenappund nichtimBrowserlauffähig!FürBrowserbittedart:htmlund HttpRequestnutzen.LeichtandereAPIberücksichtigen.
  • 11. HTTP Request (Ausgabe) Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 11 GET http://www.fh-luebeck.de/index.html user-agent: Dart/1.13 (dart:io) accept-encoding: gzip content-length: 32 host: www.fh-luebeck.de This is the message for the body Vorherige Codezeilen würden folgende Konsolenausgabe erzeugen.
  • 12. HTTP Request (Header Fields) Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 12 https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html Aus:Tanenbaum,vanSteen;VerteilteSysteme;Pearson;Abb.12.13 (EinigeHTTP-Nachrichtenköpfe) Über eine Reihe von Headern kann der Client dem Server mitteilen, welche Arten von Antworten er verarbeiten kann. Umgekehrt, kann der Server dem Client über Header mitteilen, welche Art von Dokument ausgeliefert wurde.
  • 13. HTTP Response Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 13
  • 14. Content Types Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 14 Aus: Tanenbaum, van Steen; Verteilte Systeme; Pearson; Abb. 12.2 (Sechs MIME-Typen der allgemeinen Ebene und einige verbreitete Untertypen, es fehlt allerdings bspw. application/json) MIME = Multipurpose Internet Mail Exchange Ursprünglich für Mail Protokolle gedacht, wird aber auch für Content- Types bei HTTP genutzt, um die Art des Dokumentes in der HTTP Response anzugeben.
  • 15. HTTPClientResponse https://api.dartlang.org/1.13.2/dart-io/HttpClientResponse-class.html HTTP Response Erzeugen und Auswerten mit Dart Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 15 import 'dart:io'; import 'dart:convert‘; [...] final client = new HttpClient(); HttpClientRequest req = await client.get('www.fh-luebeck.de', 80, '/index.html'); HttpClientResponse resp = await request.close(); // Response Header print( "${req.method} ${req.uri} ${resp.statusCode} ${resp.reasonPhrase}“ ); print("${resp.headers}"); print(""); // Response Body final body = await resp.transform(UTF8.decoder).join("n"); print(body); Achtung:Wegendart:ionuralsKommandozeilenappundnichtim Browserlauffähig!FürBrowserbittedart:htmlundHttpRequest nutzen.LeichtandereAPIberücksichtigen.
  • 16. HTTP Response (Ausgabe) Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 16 GET http://www.fh-luebeck.de/index.html 200 OK x-powered-by: PHP/5.4.45-0+deb7u2 cache-control: max-age=0 date: Mon, 25 Jan 2016 08:20:36 GMT vary: Accept-Encoding content-encoding: gzip content-length: 8572 content-type: text/html; charset=utf-8 server: Apache expires: Mon, 25 Jan 2016 08:20:36 GMT <!DOCTYPE html> <html lang="de"> <head> [...] Vorherige Codezeilen, würden folgende Konsolenausgabe erzeugen.
  • 17. HTTP Statuscodes Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 17 • 1xx Informationen • 2xx Erfolgreiche Operation • 3xx Umleitung (Redirect) • 4xx Client Fehler (z.B. Bad Request, Not Found) • 5xx Server Fehler Gute Übersicht gebräuchlicher HTTP Statuscodes: http://www.restapitutorial.com/httpstatuscodes.html
  • 18. Zum Nachlesen ... Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 18 Chapter 5: Representational State Transfer (REST) 5.1 Deriving REST 5.2 REST Architectural Styles 5.3 REST Architectural Views
  • 19. REST in a Nutshell ... Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 19 • Representational State Transfer (REST) ist ein Architekturstil für verteilte Systeme auf Basis von HTTP • REST APIs dienen primär der Maschine-Maschine-Kommunikation • REST ist eine Alternative zu ähnlichen Ansätzen wie SOAP oder RPC • REST Requests arbeiten auf Ressourcen (anders als bspw. RPC) • Client und Server können in anderen Sprachen realisiert sein (language agnostic) • REST Responses nutzen daher gerne sprachunabhängige Serialisierungsformate wie bspw. JSON oder XML • Die für REST nötige Infrastruktur und Protokolle sind im WWW bereits vorhanden • Da das WWW (horizontal) skalierbar ist, sind es REST-basierte Systeme zumeist auch (wenn man ein paar Dinge beachtet) https://de.wikipedia.org/wiki/Representational_State_Transfer
  • 20. Für REST benötigte HTTP Methoden Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 20 Methode Bedeutung Idempotent Sicher CRUD POST Fügt eine neue Ressource hinzu create GET Fordert eine Ressource an x x read PUT Ändert eine Ressource x update DELETE Löscht eine Ressource x delete Sicher (safe): Eine Operation ändert nicht den Zustand (nebeneffektsfreie Operation) Idempotent: Wird eine Operation zweimal hintereinander ausgeführt, ist die zweite Operation sicher (d.h. ändert nichts mehr am Zustand)
  • 21. Same-Origin-Policy Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 21 Quelle: https://de.wikipedia.org/wiki/Same-Origin-Policy Die Same-Origin-Policy (SOP) ist ein Sicherheitskonzept, das clientseitigen Skriptsprachen untersagt, auf Ressourcen zuzugreifen, deren Speicherort nicht dem Origin entspricht. Sie stellt ein Sicherheitselement in modernen Browsern zum Schutz vor Angriffen dar. Hintergrund: Skriptsprachen im Browser haben Zugriff auf Kommunikation zwischen Browser und Web-Server. Dies beinhaltet sowohl das Auslesen, die Manipulation, das Empfangen und Senden von Daten. Daraus ergibt sich die Sicherheitsanforderung, dass keine Daten aus einem Kontext (zum Beispiel der Verbindung des Browsers zu der Seite einer Bank) von einem Skript aus einem anderen Kontext zugreifbar oder manipulierbar sein darf. Um dies zu erreichen, wird beim Zugriff eines Skriptes auf eine Ressource die Herkunft (origin) von beiden verglichen. Der Zugriff wird nur erlaubt, wenn Skript und angeforderte Ressource dieselbe Herkunft (origin) haben (vom selben Server stammen).
  • 22. Same Origin Definition Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 22 http://www.example.com/dir/page.html Die Same-Origin-Policy (SOP) ist erfüllt, wenn bei zwei Ressourcen deren URL-Anteile Scheme, Host und Port übereinstimmen. Scheme Host Port Origin
  • 23. SOP und REST vertragen sich nicht immer Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 23 Die Same-Origin-Policy (SOP) ist dann ggf. hinderlich, wenn von einem Server eine Webapplikation geladen wird, die mit einem zweiten (nicht notwendig identischem) Server eine z.B. REST-basierte Kommunikation aufbauen muss. In solchen Fällen kann der HTTP Server, der follow up requests bearbeitet, seine Responses mittels CORS Headers (Cross Origin Resource Sharing) kennzeichnen. Der HTTP Client verzichtet dann auf eine Same Origin Prüfung.
  • 24. CORS Ermöglichen mit Dart Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 24 /** * Sets CORS headers for HTTP responses. */ void enableCors(HttpResponse response) { response.headers.add( "Access-Control-Allow-Origin", "*" ); response.headers.add( "Access-Control-Allow-Methods", "POST, GET, DELETE, PUT, OPTIONS" ); response.headers.add( "Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Charset" ); } Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, der Webclients Cross- Origin-Requests ermöglicht. Die Einschränkungen, die durch die SOP auferlegt sind, können vom Server aufgehoben werden. Der Server kann den Zugriff durch setzen entsprechender Access-Control-Allow-* Response Header erlauben/einschränken.
  • 25. Ein einfacher REST-basierter Hello World Service Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 25 Methode Resource CRUD Beschreibung Beispiel POST /greet/:lang Create Erzeugt einen neuen Gruß POST /greet/deutsch greet=hallo%20welt GET /greet/:lang Read Liest einen Gruß für Sprache :lang GET /greet/deutsch PUT /greet/:lang Update Ändert einen Gruß für Sprache :lang PUT /greet/deutsch Greet=Hallo%20Welt DELETE /greet/:lang Delete Löscht den Gruß der Sprache :lang DELETE /greet/deutsch GET /greets List Listet alle im Service gespeicherten Grüße (Antwort als JSON Map) GET /greets Das REST-Prinzip soll exemplarisch an einem kleinen Hello World Service demonstriert werden, der mehrsprachige Gruß Ressourcen („Hello World“ Flosklen) verwaltet. Der Service soll um Grüße in fremden Sprachen ergänzt werden, einen Gruß in einer spezifischen Sprache ausgeben, Grüße bestehender Sprachen ändern und löschen können. Ferner soll er einen Überblick über alle hinterlegten Sprachen und zugeordneten Grüße liefern können.
  • 26. Ein einfacher REST Server in Dart Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 26 // A simple REST based Hello World service. class Server { // Service state. Default languages and greets (UTF-8 encoded!). var greets = { "dutch" : "Hello wereld", "english" : "Hello world", "french" : "Bonjour monde", "german" : "Hallo Welt", "italian" : "Ciao mondo", "portuguese" : "Olá mundo", "spanish" : "Hola mundo" }; // Internally used for JSON pretty printing in JSON responses. final json = new JsonEncoder.withIndent(' '); // Resource Path definitions. final greetUrl = new UrlPattern(r'/greet/(w+)'); // /greet/:lang final greetsUrl = new UrlPattern(r'/greets'); // /greets [...] }
  • 27. Ein einfacher REST Server in Dart Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 27 import 'dart:io'; import 'package:route/server.dart'; [...] /** * Starts the REST API server. */ Future<Router> serve({ip: '0.0.0.0', port: 4040}) async { final server = await HttpServer.bind(ip, port); final router = new Router(server) ..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet) ..serve(greetUrl, method: 'POST' ).listen(createGreet) ..serve(greetUrl, method: 'GET' ).listen(readGreet) ..serve(greetUrl, method: 'PUT' ).listen(updateGreet) ..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet) ..serve(greetsUrl, method: 'GET' ).listen(listGreets); return new Future.value(router); }
  • 28. OPTIONS /greet/:lang Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 28 /** * Handles OPTIONS /greet/:lang requests * (used by the dart:html HttpRequest class). * This is necessary to handle HTTP client behaviors * (often an OPTIONS call is launched to determine * whether a POST, DELETE, PUT call is allowed). */ void optionsGreet(HttpRequest req) { HttpResponse res = req.response; enableCors(res); res.write("POST, GET, DELETE, PUT, OPTIONS"); res.close(); } final router = new Router(server) ..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet) ..serve(greetUrl, method: 'POST' ).listen(createGreet) ..serve(greetUrl, method: 'GET' ).listen(readGreet) ..serve(greetUrl, method: 'PUT' ).listen(updateGreet) ..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet) ..serve(greetsUrl, method: 'GET' ).listen(listGreets); Es gibt diverse HTTP Client Libraries, die bei POST, DELETE und PUT vorher per OPTIONS anfragen, was für Methoden auf einer Ressource überhaupt zulässig sind. Es macht für diese Fälle Sinn für jede Ressource einen entsprechenden OPTIONS Handler vorzusehen, ansonsten scheitert ein Request bereits beim BITTE BITTE sagen.
  • 29. POST /greet/:lang Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 29 /** * Handles POST /greet/:lang requests to create a new language specific greet. * Params: greet (greet in language :lang) */ void createGreet(HttpRequest req) { HttpResponse res = req.response; // To be created response enableCors(res); // set CORS headers final lang = greetUrl.parse(req.uri.path).first; // Language part of path req.transform(UTF8.decoder).join("n").then((body) { // req is stream (body) final params = Uri.parse("?$body").queryParameters; // body contains params if (greets.containsKey(lang)) { // lang already existing res.statusCode = HttpStatus.CONFLICT; // 409 res.reasonPhrase = "Already existing"; res.close(); // Send response (error) return; } if (!params.containsKey('greet')) { // no greet parameter res.statusCode = HttpStatus.BAD_REQUEST; // 400 res.reasonPhrase = "Missing parameter"; res.close(); // Send response (error) return; } greets[lang] = params['greet']; // Change server state res.statusCode = HttpStatus.CREATED; // 201 res.close(); // Send response (succes) }); } greet=Hallo%20Welt
  • 30. GET /greet/:lang Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 30 /** * Handles GET /greet/:lang requests to read * a language specific greet. */ void readGreet(HttpRequest req) { HttpResponse res = req.response; enableCors(res); final lang = greetUrl.parse(req.uri.path).first; if (!greets.containsKey(lang)) { res.statusCode = HttpStatus.NOT_FOUND; // 404 res.reasonPhrase = "Not Found"; res.write("Not Found"); res.close(); // Send response (error) return; } res.write(greets[lang]); // Read Status res.close(); // Send response (success) } final router = new Router(server) ..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet) ..serve(greetUrl, method: 'POST' ).listen(createGreet) ..serve(greetUrl, method: 'GET' ).listen(readGreet) ..serve(greetUrl, method: 'PUT' ).listen(updateGreet) ..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet) ..serve(greetsUrl, method: 'GET' ).listen(listGreets);
  • 31. DELETE /greet/:lang Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 31 /** * Handles DELETE /greet/:lang requests to delete * a language specific greet. */ void deleteGreet(HttpRequest req) { HttpResponse res = req.response; enableCors(res); final lang = greetUrl.parse(req.uri.path).first; greets.remove(lang); // Löschoperation res.close(); } final router = new Router(server) ..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet) ..serve(greetUrl, method: 'POST' ).listen(createGreet) ..serve(greetUrl, method: 'GET' ).listen(readGreet) ..serve(greetUrl, method: 'PUT' ).listen(updateGreet) ..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet) ..serve(greetsUrl, method: 'GET' ).listen(listGreets); Eine DELETE Operation ist idempotent. D.h. wiederholte Löschung (bzw. das löschen nicht existenter Ressourcen) sollten nicht in einem Fehler enden.
  • 32. GET /greets Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 32 /** * Handles GET /greets requests to list all * language specific greets (JSON). */ void listGreets(HttpRequest req) { HttpResponse res = req.response; enableCors(res); res.headers.contentType = new ContentType( "application", "json", charset: 'UTF-8‘ ); res.write(json.convert(greets)); res.close(); } final router = new Router(server) ..serve(greetUrl, method: 'OPTIONS').listen(optionsGreet) ..serve(greetUrl, method: 'POST' ).listen(createGreet) ..serve(greetUrl, method: 'GET' ).listen(readGreet) ..serve(greetUrl, method: 'PUT' ).listen(updateGreet) ..serve(greetUrl, method: 'DELETE' ).listen(deleteGreet) ..serve(greetsUrl, method: 'GET' ).listen(listGreets); Liefert alle greets Ressourcen.
  • 33. Zusammenfassung • HTTP • Uniform Resource Identifiers (URI) und Locators (URL) • HTTP Request (Client) und Response (Server) • HTTP Methoden • HTTP Header • HTTP Content Types (MIME) • HTTP Status Codes • Dart Libraries für HTTP • Same Origin Policy (SOP) und Cross Origin Resource Sharing (CORS) • REST • CRUD und HTTP Methoden • Sichere und idempotente Operationen • REST am Bsp. eines Hello World Service • Dart Libraries für REST Prof. Dr. rer. nat. Nane Kratzke Praktische Informatik und betriebliche Informationssysteme 33