You are on page 1of 9

5/21/2011

Tartalom Objektumorientlt szoftvertervezs


REpresentational State Transfer (REST)
Simon Balzs, BME IIT, 2011.
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 2

HTTP REST REST kritikk JAX-RS Elosztott technolgik

HTTP GET

HTTP
Request: GET /index.html HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 Connection: keep-alive Response: HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Encoding: gzip Server: gws Content-Length: 10200 <!doctype html><html><head>

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

HTTP GET: http://www.abc.com/login?user=xy&pass=123


HTTP Method Local URL Version

HTTP POST: http://www.abc.com/login


HTTP Method Local URL Version

GET /login?user=xy&pass=123 HTTP/1.1 Host: www.abc.com User-Agent: Mozilla/5.0 Connection: keep-alive


Headers+ Empty line

POST /login HTTP/1.1 Host: www.abc.com User-Agent: Mozilla/5.0 Content-Type: application/x-www-form-urlencoded Content-Length: 16 user=xy&pass=123

Host name
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

Query params
5

Headers+ Empty line

Host name
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

HTTP Body: Post parameters 6

5/21/2011

REST
REpresentational State Transfer RESTful HTTP HTTP protokoll kibvtse

REST

GET, POST, PUT, DELETE

Bemen paramterek:
URL rsze URL query string POST paramter HTTP body

Visszatrsi rtk:
HTTP body

Nagyon egyszer: bngszbl is tesztelhet


Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 7 Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 8

REST alapelvei
Minden erforrshoz azonost rendelse Dolgok sszekapcsolsa CRUD mveletek hasznlata Tbbfle adatreprezentci llapotmentes kommunikci

Erforrsok azonostval
URI: Universal Resource Identifier
mindennek az alapja (URN, URL)

URN: Universal Resource Name


olyan URI, amely nem tartalmaz helyinformcit pl. urn:isbn:0307346617 elny: soha nem romlanak el htrny: nem tartalmaznak informcit arrl, hogyan kell feloldani ket

URL: Universal Resource Locator


olyan URI, amely helyinformcit is tartalmaz htrny: knnyen elromolhatnak, fleg, ha utalnak a mgttes technolgira, pl. http://someserver.com/ActionServlet?blah=blah de lehet jl is hasznlni ket, pl. http://company1.com/customer/123456

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

10

Erforrsok azonostval
Hasznljunk URL-t!
az URL egy erforrs egyrtelm azonostja helyinformci miatt knny feloldani legyen fggetlen a mgttes technolgitl

Dolgok sszekapcsolsa
J URL cmeket kell vlasztani Ennek sok elnye van:
hatkonyan tovbbadhatk az adatok utlag betlthetk analgia: C++ pointerek biztonsgosabb megolds: az adatok hozzfrsi jogosultsgait knnyebb ellenrizni

Erforrsok lehetnek:
dokumentumok (blogok, hrek, stb.) adatok (szmts eredmnye, metaadatok, stb.) szolgltatsok (SOAP web service, REST, stb.) fogalmak (emberek, szervezetek, stb.)
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 11

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

12

5/21/2011

Erforrs-URL-ek rtelmezse
Az URL hierarchikusnak tnik Kliens:
nem szabad rtelmeznie az URL-t csak azonostknt felhasznlnia gy kell viselkednie, mint egy bngsznek a struktra ugyanis vltozhat

Mveletek erforrsokon
CRUD: create, read, update, delete Tulajdonsgok (a HTTP specifikcibl):
safe (biztonsgos): a kliens olyan mveletet hajt vgre, ami csak lekrdez, s nem tehet felelss az okozott mellkhatsokrt idempotent: a mvelet ismtelt vgrehajtsa ugyanazt az eredmnyt produklja

Nincs szksg interfszler nyelvre Az erforrsok manipulsra elegend a ngy mvelet: GET, POST, PUT, DELETE Ez a Hypertext As the Engine of State Transfer (HATEOS) elv
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 13

Klnbz idempotens mveletek egyms utn trtn ismtelt vgrehajtsa nem felttlenl ugyanazt az eredmnyt adja
pl. olvas-trl-olvas

Mellkhatsok nlkli mveletek ismtelt vgrehajtsa mindig ugyanazt az eredmnyt adja


Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 14

Mveletek erforrsokon
CRUD safe idempotent cacheable

Tbbfle adatreprezentci
HTML:
csak emberek szmra gyakran vltozhat a struktra szmtgp szmra formlisabb kell (pl. XML, JSON, stb.)

GET POST PUT DELETE

read create update/ create delete

igen nem nem nem

igen nem igen igen

igen nem nem nem

Vlasztani kell tudni a klnbz reprezentcik kztt Egy lehetsges, de rossz megolds:
http://company1.com/2009/report.html http://company1.com/2009/report.xml http://company1.com/2009/report.xls

A helyes megolds: Accept HTTP fejlc, pl.


GET /2009/report HTTP/1.1 Host: company1.com Accept: application/xml

POST: a szerver rendel hozz azonostt PUT: a kliens hatrozza meg az azonostt
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 15

Nem tmogatott MIME tpus esetn: HTTP 406 Error


Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 16

llapotmentes kommunikci
A REST nmagban llapotmentes De az alkalmazsnak lehet llapota:
erforrsban trolva (nem a memriban) kliens oldalon (zenetcsernl mindig tkldve)

REST kritikk

Elnyk:
sklzhatsg: nem kell session-t fenntartani klnbz szerverpldnyok is kiszolglhatnak egyms utni krseket a szerver lellthat, jraindthat kt krs kztt
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 17 Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 18

5/21/2011

REST kritikk
CRUD mveleteken kvl msra nem alkalmas Nincs interfszler Tl sok bels rszletet elrul Tervezsi guideline-ok hinya Middleware funkcik hinya Nincs publish-subscribe ill. aszinkron kommunikci
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 19

CRUD mveleteken kvl ms


Lehet msra is hasznlni, pl.:
http://example.com/sum?a=2&b=3

De ez csals:
az URI-nek egyrtelmen azonostania kell az erforrst

Mgsem csals:
az erforrs a kett s a hrom sszege

Krds: melyik HTTP metdust hasznljuk itt?


GET j lesz: hivatkozhat, cache-elhet, nincs mellkhats, safe, idempotent

De: sok esetben szksg van mellkhatsra. Ekkor melyik HTTP metdust hasznljuk?
clszeren: POST a szerver vlasza pedig egy URI az eredmnyre az eredmny gy redirect-tel megkaphat, jrahasznosthat, cache-elhet, stb.
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 20

Nincs interfszler
Interfszler:
lerja a mveleteket s a paramterek tpust a szemantikt nem tipikus hasznlat: kliens stub, szerver skeleton generlsa

Tl sok bels rszlet


A CRUD mveleteken kvl lehet ms is
ez tetszlegesen bonyolult lehet, akrcsak egy SOAP vagy RPC hvs

REST:
csak 4 fajta mvelet adatok: tipikusan XML-ben => XSD

Ajnlott megolds:
szveges lers a mveletek szemantikjrl pl. HTML lers jn vissza egy GET hatsra

A REST nem azt jelenti, hogy a bels adatreprezentcit publiklni kell


csak a szemllet ms: mveletkzpont helyett adatkzpont

Ha mgis formlis lers kell:


WADL: Web Application Description Language WSDL 2.0 de ezek nem nagyon tmogatottak (Java vilgban van r plda, .NET-ben egyltaln nem)
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 21

Szably: az erforrsokat csak URI-n keresztl szabad publiklni


gy akr mg egyszerbb is a vdelmk
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 22

Tervezsi guideline-ok hinya


Nincsenek hivatalos best-practice-ek Nincs szabvnyos mdja annak, hogyan oldjuk meg a felmerl problmkat Nincs ajnls arra, hogyan transzformljuk t a szolgltatsainkat REST-re Nincs ajnls arra, hogyan nzzen ki egy URI Valban, ezek a vdak igazak, de a jzan sz s a tapasztalat segt
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 23

Middleware funkcik hinya


Nincs tranzakcikezels:
valban

Nincs megbzhat zenetklds


nem tudni, hogy egy mvelet sikeres volt-e ha HTTP 200 OK vlasz jtt: sikerlt ha nem jn vlasz: nem tudni de: az idempotens mveletek (GET, PUT, DELETE) jrakldhetk POST esetn azonban vigyzni kell
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 24

5/21/2011

Publish-subscribe, aszinkronits
REST: kliens-szerver modell Publish-subscribe:
RSS egy lehetsges megolds de: itt is a kliens kezdemnyez GET-tel, ami hatkonyan cache-elhet ez a notification-by-polling

JAX-RS

Aszinkronits:
ha a szerver hossz mveletet vgez megolds: vlaszknt HTTP 202 Accepted lehetsgek:
a szerver visszaadja az eredmny URI-jt, amit a kliens pollozhat a kliens ad egy URI-t a krsben, ahol a szerver rtestheti t
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 25 Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 26

JAX-RS
JAX-RS: Java API for RESTful Web Services (JSR-311) Java osztlyok lekpzse REST erforrsokra Java annotcik segtsgvel Fontosabb implementcik:
hivatalos (Sun-Oracle): Jersey JBoss: RESTeasy Apache CXF Restlet
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 27

JAX-RS plda
Application servlet:
ltalnos servlet egy RESTful alkalmazshoz megadja, hogy mely osztlyok vannak RESTknt publiklva kell hozz web.xml is mindig gy nz ki:
@javax.ws.rs.ApplicationPath("resources") public class ApplicationConfig extends javax.ws.rs.core.Application { }

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

28

Szmolgp plda
import import import import javax.ws.rs.GET; javax.ws.rs.Path; javax.ws.rs.Produces; javax.ws.rs.QueryParam; Csnya, de a double nem m kdik:

Paramterek
Paramter annotcik:
@PathParam: URI template paramter (az URI egy darabja) @QueryParam: URI query paramter @MatrixParam: URI mtrix paramter @FormParam: POST paramter @CookieParam: Cookie paramter @HeaderParam: HTTP header paramter

@Path("calculator") javax.ws.rs.WebApplicationException public class Calculator A message body writer for Java type, { class java.lang.Double, and MIME @GET media type, text/plain, was not found @Path("add") @Produces("text/plain") public String add( @QueryParam("left") double left, @QueryParam("right") double right) { return ""+(left+right); } } http://localhost:8080/RestApp1/resources/calculator/add?left=3.0&right=5.0 Objektumorientlt szoftvertervezs (C) 29
Simon Balzs, BME IIT, 2011.

Tmogatott tpusok:
1. primitv tpusok 2. olyan T tpusok, amelyeknek van egy darab String paramterrel rendelkez konstruktoruk 3. olyan T tpusok, amelyek statikus fggvnyknt tartalmazzk a kvetkez szignatrj metdusok valamelyikt:
public static T valueOf(String) public static T fromString(String)

4. List<T>, Set<T>, SortedSet<T>, ahol T a fenti 2-es vagy 3-as esetbl kerl ki
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 30

5/21/2011

Param pldk
@Path("calculator") public class Calculator { @POST @Path("add") public String add(@???Param("left") double left, @???Param("right") double right) {} }

Visszatrsi rtk
Lehetsges visszatrsi rtkek:
void, null: res vlasz 204 No Content sttuszkddal Response: kzvetlenl rhat a vlasz stream GenericEntity: generikus tpusok visszaadsra (type erasure miatt) egyb tpus

@Path("add"), @QueryParam
http:///calculator/add?left=3.0&right=5.0

@Path("add/{left}/{right}"), @PathParam
http:///calculator/add/3.0/5.0

Nem minden Java tpus tmogatott


pl. String igen, Double nem megolds:
MessageBodyReader MessageBodyWriter
31 Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 32

@Path("add"), @MatrixParam
http:///calculator/add;left=3.0;right=5.0

@Path("add"), @PostParam
http:///calculator/add
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

MessageBodyWriter
public interface MessageBodyWriter<T extends Object> { public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType); public long getSize(T t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType); public void writeTo(T t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException; }

MessageBodyWriter plda
@Produces("text/*") @Provider public class SimpleTypeWriter implements MessageBodyWriter { @Override public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { return type.equals(Integer.class) || type.equals(Double.class); }

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

33

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

34

MessageBodyWriter plda
@Override public long getSize(Object t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { return -1; }

MessageBodyWriter plda
@Override public void writeTo(Object t, Class type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(entityStream)); writer.write(t.toString()); writer.flush(); }
35

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

36

5/21/2011

Szmolgp plda revisited


import import import import javax.ws.rs.GET; javax.ws.rs.Path; javax.ws.rs.Produces; javax.ws.rs.QueryParam; Mostmr m kdik

HTTP methods, mime-types


HTTP method annotcik:
@GET, @POST, @PUT, @DELETE, @HEAD

@Path("calculator") public class Calculator { @GET @Path("add") @Produces("text/plain") public double add( @QueryParam("left") double left, @QueryParam("right") double right) { return left+right; } } http://localhost:8080/RestApp1/resources/calculator/add?left=3.0&right=5.0 Objektumorientlt szoftvertervezs (C) 37
Simon Balzs, BME IIT, 2011.

HTTP content-type annotcik:


@Consumes: milyen formtum bemeneteket fogad az operci @Produces: milyen formtum kimeneteket kpes ellltani az operci

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

38

XML s JSON
Bemen paramterek s az eredmny formtuma legtbbszr XML vagy JSON J hr: egysgesen kezelhetk JAXB technolgia:
Java-XML lekpzs, sorosts eredetileg SOAP-tpus web szolgltatsokhoz de XML mellett mostmr JSON-ra is alkalmas

XML s JSON plda


sample/package-info.java: Kliens oldali @javax.xml.bind.annotation.XmlSchema( JSON miatt res! namespace="", elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package sample; sample/Person.java: @XmlRootElement @XmlType @XmlAccessorType(XmlAccessType.FIELD) public class Person { @XmlElement private String name; @XmlElement private int age; @XmlElement private List<Person> friends; public Person() { this.friends = new ArrayList<Person>(); }

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

39

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

40

XML s JSON plda


@Path("person") public class PersonService { @GET @Path("getpb") @Produces("application/json") public Person getPerson() { Person pb = new Person(); pb.setName("Peter Bishop"); pb.setAge(27); Person od = new Person(); od.setName("Olivia Dunham"); od.setAge(26); pb.getFriends().add(od); Person bod = new Person(); bod.setName("Bolivia Dunham"); bod.setAge(26); pb.getFriends().add(bod); return pb; } Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. }

XML eredmny
curl -v -X GET -H"Accept: application/xml" http://localhost:8080/RestApp1/resources/person/getpb > GET /RestApp1/resources/person/getpb HTTP/1.1 > User-Agent: curl/7.20.1 (i686-pc-cygwin) > Host: localhost:8080 > Accept: application/xml > < HTTP/1.1 200 OK < X-Powered-By: Servlet/3.0 < Server: GlassFish Server Open Source Edition 3.0.1 < Content-Type: application/xml < Content-Length: 227 < Date: Sun, 13 Mar 2011 12:21:17 GMT < <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <person><name>Peter Bishop</name><age>27</age> <friends><name>Olivia Dunham</name><age>26</age></friends> <friends><name>Bolivia Dunham</name><age>26</age></friends> </person> Objektumorientlt szoftvertervezs (C)
Simon Balzs, BME IIT, 2011.

41

42

5/21/2011

JSON eredmny
curl -v -X GET -H"Accept: application/json" http://localhost:8080/RestApp1/resources/person/getpb > GET /RestApp1/resources/person/getpb HTTP/1.1 > User-Agent: curl/7.20.1 (i686-pc-cygwin) > Host: localhost:8080 > Accept: application/json > < HTTP/1.1 200 OK < X-Powered-By: Servlet/3.0 < Server: GlassFish Server Open Source Edition 3.0.1 < Content-Type: application/json < Transfer-Encoding: chunked < Date: Sun, 13 Mar 2011 12:21:19 GMT < {"name":"Peter Bishop","age":"27", "friends":[{"name":"Olivia Dunham","age":"26"}, {"name":"Bolivia Dunham","age":"26"}]}
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011. 43

REST kliens
Nem rsze a JAX-RS specifikcinak Mindenki mshogyan implementlja Jersey (Sun-Oracle):
csak alacsony szint hozzfrs

RESTeasy (JBoss):
van alacsony szint hozzfrs is de lehet tpusosan (annotlt interfsz) is hasznlni
Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

44

import import import import import

com.sun.jersey.api.client.Client; com.sun.jersey.api.client.WebResource; com.sun.jersey.api.client.config.ClientConfig; com.sun.jersey.api.client.config.DefaultClientConfig; javax.ws.rs.core.MediaType;

Jersey kliens

Jersey kliens
public Person getPersonPB_XML() { Person pb = webResource. path("getpb"). accept(MediaType.APPLICATION_XML_TYPE). get(Person.class); return pb; } public Person getPersonPB_JSON() { Person pb = webResource. path("getpb"). accept(MediaType.APPLICATION_JSON_TYPE). get(Person.class); return pb; }
45

public class PersonClient { private WebResource webResource; private Client client; private static final String BASE_URI = "http://localhost:8080/RestApp1/resources"; public PersonClient() { ClientConfig config = new DefaultClientConfig(); client = Client.create(config); webResource = client.resource(BASE_URI).path("person"); } public void close() { client.destroy(); Objektumorientlt szoftvertervezs (C) }
Simon Balzs, BME IIT, 2011.

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

46

Jersey kliens fprogram


public class Main { public static void main(String[] args) { PersonClient pc = new PersonClient(); try{ Person pbx = pc.getPersonPB_XML(); System.out.println("XML: "+pbx.getName()); Person pbj = pc.getPersonPB_JSON(); System.out.println("JSON: "+pbj.getName()); } finally { pc.close(); } } }

Elosztott szolgltatsok megvalstsra alkalmas technolgik

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

47

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

48

5/21/2011

Elosztott technolgik
RMI CORBA WS REST
Elosztott

Elosztott technolgik
RMI x Szabvnyos Programnyelvfggetlen Szles kr tmogats Egyszer Egyszer API Gyors Biztonsg, tranzakcik x x x x x x CORBA x x x x WS x x x x REST x x x x x x x

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

49

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

50

Elosztott technolgik
RMI CORBA WS REST

Protokoll

RMI

IIOP

SOAP

HTTP

Interfszler

Java interface

IDL

WSDL

nincs/ WADL

Katalgus

JNDI

Naming Service

UDDI

Objektumorientlt szoftvertervezs (C) Simon Balzs, BME IIT, 2011.

51