Stateful / Stateless ==================== Server SOAP https://abc.cs.univie.ac.at/ ^ | | | | V Client SOAP https://cewebs.cs.univie.ac.at/ ^ | | | | V Browser (Langner - Brave) Connection State - Stehende Verbindung Application State - Intern im Client oder Server SOAP - Funktionsortiert (Stateless) (HTTP) ========================================== * rueckgabewert funktionsname(parameter1, parameter2, parameter3, ...) * [] readPersons(alter: 17) * HeaderFile C: include ergebnis1 = funktionA(p1,p2,p3); ergebnis2 = funktionB(p1,p2,p3); #RPC ergebnis3 = funktionC(p1); #DOCUMENT SOAP: Server: Implementiere meienfunktionalitaet.h Client: Benutze die Funktionalitaet Headerfile - WSDL: WO liegt die Implemtierung (Libary) eigentlich? Endpunkt: http://bla/blax Client Internet Server ------ -------- ------ Native Datentypen (Array) -> SOAP Lib -> HTTTTTTTTTTTP (XML) -> Soap Lib -> Native Datentypen (Array) REST - Datenorientiert (Stateless) (HTTP) ========================================= Es gibt keine Funktion, alles was ich will ist Daten austauschen. CRUD - bei Datenbanken get -> Read post -> Create delete -> Delete put -> Update patch -> Update, aber anders Auch wichtig: Ressource -> weil in einer DB gibts ja auch tabellen Endpunkt: viele, ein Baum GET http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons -> liste der personen POST http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons -> eine neue person anlegen, rueckgabe id (e.g. 3) GET http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/3 -> ah, das sind die daten von der person 3 GET http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/1 -> details zur ersten person PUT http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/2 -> ich ersetze die daten zweiten person PUT http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/2/alter -> ich ersetze alter zweiten person Daten: POST http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons -> eine neue person anlegen Was geb ich rein: { 'name' => 'Mangler', 'geistiges_alter': 12, 'physisches_alter': 50 } Was gibt der Aufruf zruck: 3 GET http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/3 -> ich frag es ab { 'name' => 'Mangler', 'geistiges alter': 12, 'physisches alter': 50 } GET http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/3/geistiges_alter -> ich frag ein detail ab 12 PUT http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/ -> ersetze alle personen, ausgangslage es gibt 3 [ { 'name' => 'Mangler', 'geistiges_alter': 12, 'physisches_alter': 50 }, { 'name' => 'Langner', 'geistiges_alter': 12, 'physisches_alter': 19 } ] Danach gibt es keine anderen User mehr -> tragisch PATCH http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/ -> ersetze alle personen, ausgangslage es gibt 3 [ null, # erster user wird nicht angetouched null, # zweiter user wird nicht angetouched { 'name' => 'Mangler', 'geistiges_alter': 12, 'physisches_alter': 51 }, dritter user wird durch mangler ersetzt { 'name' => 'Langner', 'geistiges_alter': 12, 'physisches_alter': 19 }, vierter user wird neue angelegt ] Danach gibt es keine anderen User mehr -> tragisch PUT http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/ -> ersetze alle personen, ausgangslage es gibt 3 { 3: { 'name' => 'Mangler', 'geistiges_alter': 12, 'physisches_alter': 50 }, 4: { 'name' => 'Langner', 'geistiges_alter': 12, 'physisches_alter': 19 } } es gibt EBENFALLS keine user 1 und 2 mehr, weil PUT immer alles ersetzt PATCH http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/ -> ersetze alle personen, ausgangslage es gibt 3 { 3: { 'name' => 'Mangler', 'geistiges_alter': 12, 'physisches_alter': 50 }, 4: { 'name' => 'Langner', 'geistiges_alter': 12, 'physisches_alter': 19 } } user 1 und 2 werden nicht angetoucht, 3 und 4 ersetzt bei PUT und PATCH immer ID wichtig (also nicht ID, sondern der ressource path) GET http://wwwlab.cs.univie.ac.at/~manglej6/rest/persons/3 -> ich darf da drauf nicht zugreifen 403 forbidden zurueckgeben (HTTP Statuscode) PHP: http_response_code(403); => DIFFERNCE BETWEEN PUT AND PATCH: IDEMPOTENCY Problem; was wenn ich 1 + 1 machen will? GET http://wwwlab.cs.univie.ac.at/~manglej6/calculate/1/plus/1 -> 2 GET http://wwwlab.cs.univie.ac.at/~manglej6/calculate/1/plus/3 -> 4 POST http://wwwlab.cs.univie.ac.at/~manglej6/calculate/plus?o1=2&o2=3 -> result12 (sollte das lange dauern) GET http://wwwlab.cs.univie.ac.at/~manglej6/calculate/plus/result12 -> 5 GET http://wwwlab.cs.univie.ac.at/~manglej6/calculate/plus/result12 -> 5 spaeter noch mal abfragen DELETE http://wwwlab.cs.univie.ac.at/~manglej6/calculate/plus/result12 -> ich brauch das nicht mehr