* Jakým způsobem můžeme vystavovat aplikační logiku
* RPC versus výměna zpráv
* Rozdíl SOAP a REST služby, za jakých okolností bychom měli použít jedno nebo druhé
* Spring WS
* Návrh kontraktu
* Ukázka Endpointu
* Spring MVC REST
* Návrh REST resourcu
* Ukázka REST controlleru
1. Spring framework
Motto: Musíte rozbít vejce když chcete udělat omeletu
Spring framework training materials by Roman Pichlík is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Sunday 13 May 2012 1
2. Spring WS, REST, HTTP
Vzdáleny přístup k datům
Sunday 13 May 2012 2
3. Vzdálený přístup k datům
• Motivace
• Integrace heterogeních sytému
• Mashups
• Strojové zpracování dat
Sunday 13 May 2012 3
4. Remote service bridge
Remote
service
bridge
Sunday 13 May 2012 4
Remote service bridge je jenom jednou z dalších možností, kromě UI, jak vystavit aplikační
logiku
5. Jak na webové služby
• Spring
• Spring WS (SOAP)
• Spring MVC (REST)
• Spring Remoting
• HTTP, Hessian, Burlap, RMI
Sunday 13 May 2012 5
- každá z těchto technologií má sve výhody a nevýhody
6. WS (SOAP)
• Průmyslový standard
• WSDL descriptor a XSD
• Interoperabilní technologie
• .NET, Java, Ruby...
• Protokolově nezávislé
• HTTP, JMS, XMPP, SMTP
Sunday 13 May 2012 6
7. WS (REST)
• Navržené s ohledem na HTTP
• Metody, Statusy, Cont. type nego.
• Jednoduchý interface
• POST, PUT, GET, DELETE
• Různé reprezentace
• JSON, XML
Sunday 13 May 2012 7
8. Spring Remoting
• Hessian, Spring HTTP, Burlap
• Proprietární technologie
• Interoperabilita omezená
• Více se jedná o RCP
• Rychlé prototypování
Sunday 13 May 2012 8
9. RPC vs. Zprávy
Service interface
Client Server
Client Stub
Service Service
RPC facade
logic stub implementace
Sunday 13 May 2012 9
- distribujeme chování (služba se jeví lokální, ale není)
- máme touhu věřit, že síť je spolehlivá
10. RPC vs. Zprávy
Client
ClientStub Message Protokol
logic adapter adapter
Message
Server
Protokol Message Service
adapter adapter implementace
Sunday 13 May 2012 10
vyměňují se zprávy (dokumenty/resources) namísto zakrývání vzdáleného volání
12. Z čeho se skládjí WS
• Definice zpráv
• Definice kontraktu služby
• Binding do aplikačního protokolu
• Binding do transportního
protokolu
• Runtime
• Vlastní služba
Sunday 13 May 2012 12
13. Z čeho se skládjí WS
• Aplikační vývojář
• Definice zpráv a kontraktu služby
• Vlastní služba
• SpringWS
• binding SOAP a transport
• Aplikační server
Sunday 13 May 2012
• runtime 13
14. Techniky návrhu
• Contract first
• Začínáme definicí XSD a WSDL
• Contract last
• Začínáme kódem
Sunday 13 May 2012 14
Spring WS podporuje pouze contract first
15. Contract first
• Výhody
• Robustnost
• Výkonnost
• Interoperabilita
• Nevýhody
• Složitější (znalost XSD, WSDL)
Sunday 13 May 2012 15
robustnost = nepodléhá refactoru (změna názvu metod apod.)
interoperabilita = problém s různymi generátory WSDL/XSD, typy atd.
16. Contract first
• Návrh zpráv (dokumentů) pro
komunikaci server/client
• Popis kontraktu
• Struktura zpráv/dokumentů
• Volitlně popis služby
• WSDL
Sunday 13 May 2012 16
Spring WS - XSD, Relax NG, Schematron
17. Příklad zprávy (rezervace knih)
<rs:Reservation xmlns:rs="http://dagblog.cz/BookReservation">
<rs:bookId>1</rs:bookId>
</rs:Reservation>
Sunday 13 May 2012 17
Namespace předchází konfliktum pokud mixujeme různé XML fragmenty
20. WSDL
• Definice zpráv
• Definice operací (ports)
• Definice bindingu
• Aplikační protokol
• Transportní protokol
Sunday 13 May 2012 20
- Není povinné pro Spring WS
- SpringWS umí vygenerovat a automaticky vystavit
- Vhodné mít pro klienty
26. SpringWS
Sunday 13 May 2012 26
core - SOAP, zakladni abstrakce, server i klient, message dispatching, HTTP
support - dalsi protokoly (JSM, SMTP, Jabber)
xml - WS Security a napojeni do Spring security
29. Endpoint
• Základní abstrakce
• Velmi podobné Controleru z
Spring MVC
• Bridge mezi aplikační logikou a
světem WS (SOAP)
Sunday 13 May 2012 29
SpringWS nám umožňuje se zaměřit pouze na payload (vlastní zpráva), zbytek (SOAP) je v jeho
režii
Keep it simple
30. Zprava a její zpracování
• Jakým způsobem může endpoint
zpracovat payload
• Low level
• DOM, SAX, StAX
• Marshalling
• JAXB, Castor, XML beans
Sunday 13 May 2012 30
Rozdíl SAX a DOM
DOM = (JDOM, XOM, Dom4j)
Vysvětlení rozdílu Low level a Marshallingu (kdy použít jedno a kdy druhé)
32. Spring WS endpoint
@Endpoint
public class ReservationServiceWSEndpoint {
private static final String SCHEMA_NS = "http://dagblog.cz/BookReservation/schema";
@Autowired
private ReservationService reservationService;
@PayloadRoot(namespace = SCHEMA_NS, localPart = "ClaimReservationRequest")
@ResponsePayload
public Element bookRequest(@RequestPayload Element bookReservationRequest) throws
Exception {
....
}
}
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
mapping
<soapenv:Body>
<sch:ClaimReservationRequest xmlns:sch="http://dagblog.cz/BookReservation/schema">
<rs:Reservation xmlns:rs="http://dagblog.cz/BookReservation">
<rs:bookId xmlns:rs="http://dagblog.cz/BookReservation">1</rs:bookId>
</rs:Reservation>
</sch:ClaimReservationRequest>
</soapenv:Body>
</soapenv:Envelope>
Sunday 13 May 2012 32
význam anotací
33. Co dále SpringWS umožňuje
• Definice transportního protokolů
• Endpoint zůstává stejný
• Handlování vyjímek a překlad na
SOAP Faults
• Podpora psaní testů Endpointů
Sunday 13 May 2012 33
35. WebServiceTemplate
• Zjednodušuje přístup k WS
• Zaměření pouze na payload
• žádný SOAP
• Konvenční metody pro volání
služeb
Sunday 13 May 2012 35
Možné použít
WebServiceGatewaySupport
36. @Component
public class BookReservationClientWS {
private final Namespace namespace =
Namespace.getNamespace("rs", "http://dagblog.cz/BookReservation");
@Autowired
private WebServiceTemplate webServiceTemplate;
private static final String MESSAGE =
"<sch:ClaimReservationRequest xmlns:sch="http://dagblog.cz/BookReservation/schema">" +
" <rs:Reservation xmlns:rs="http://dagblog.cz/BookReservation">" +
" <rs:bookId>1</rs:bookId>" +
" </rs:Reservation>" +
"</sch:ClaimReservationRequest>";
public Reservation reserveBook(long bookId) {
StreamSource source = new StreamSource(new StringReader(MESSAGE));
JDOMResult jdomResult = new JDOMResult();
webServiceTemplate.sendSourceAndReceiveToResult(source, jdomResult);
Document document = jdomResult.getDocument();
Element reservationElement = document.getRootElement();
Long reservationId = Long.valueOf(reservationElement.getChild("reservationId",namespace).getValue());
Long bookIdRet = Long.valueOf(reservationElement.getChild("bookId",namespace).getValue());
ReservationImpl reservationImpl = new ReservationImpl();
reservationImpl.setBookId(bookIdRet);
reservationImpl.setReservationId(reservationId);
return reservationImpl;
}
}
Sunday 13 May 2012 36
37. • Praktické cvičení
• Pojďmě si navrhnout a naimplementovat WS
rozhraní k naší rezervační službě
Sunday 13 May 2012 37
39. REST
• Representational State Transfer
• Roy Fielding
• Architektonický styl
• Škálovatelnost
• HTTP je i aplikační protokol
• Web není jenom o prohlížečích
Sunday 13 May 2012 39
40. Základní principy
• Vystavujeme Resourcy
• namísto služeb a jejich metod
• Resource může mít 4. základní
operace
• PUT, GET, DELETE, POST
• Klient si řídí reprezentaci resourců
• JSON, XML, HTML, plain text...
Sunday 13 May 2012 40
- velmi jednoduche oproti službám a jejich kontraktům
41. Základní principy
• Bezestavová architektura
• Prolinkování
• Resourcy se vzájemně odkazují
• Navigovatelnost (jak jí známe z
webu)
• HTTP hlavičky a Status kódy řídí
komunikaci
Sunday 13 May 2012 41
42. Proč REST
• Stačí pouze HTTP klient
• Dostupný na každé platformě
• Žádné XML peklo
• Vše se řídí HTTP protokolem
Sunday 13 May 2012 42
Né každý zná HTTP protokol ;-)
43. REST návrh aplikace
• Navrhujeme resourcy z pohledu
požadavků aplikace
• Rezervace, Kniha, Transakce,
Platba
• Navrhujeme URI space a
reprezentace
• Návrh navigovatelnosti/
prolinkování
Sunday 13 May 2012 43
44. HTTP status kódy
• Součást HTTP specifikace
• Interpretaci významu odpovědi
• 1xx = Informační statusy
• 2xx = Úspěšně zpracováno
• 3xx = Přesměrování
• 4xx = Klientská chyba
• 5xx = Serverová chyba
Sunday 13 May 2012 44
Aplikace se nemusí navrhovat a vytvářet vlastní protokol
45. Příklady HTTP status kódů
• 200 Ok - úspěšně vyřízen
• 201 Created - úspěšně vytvořen
• 301 Moved - přesunut
• 404 Not Found - nenalezen
• 500 Internal Server Error
• Eufemismus pro Blue screen of death
Sunday 13 May 2012 45
46. Reprezentace resourců
• XML, JSON, text...
• volba pomocí content negotian
• Media type (iniciuje klient)
• Klientská data
• Content-type
• Odpověď (pouze hint)
• Accept
Sunday 13 May 2012 46
47. REST vs. WS
• Volte podle konzumentů
• WS
• vhodné do korporátního
prostředí (standard)
• REST
• vhodné pro internetové appky
• mashups a integrace
Sunday 13 May 2012 47
REST je velmi vhodný pro mobilní aplikace
48. Ukázka GoodData REST API
Sunday 13 May 2012 48
demonstrovat použití HTTP klienta - content/accept, errors atd.
49. REST v Jave
• JAX-RS Java 6 EE Standard
• Vývoj RESTových služeb
• Není podpora psaní REST
klienta
• Implementace
• Jersey, RESTEasy, Restlet
Sunday 13 May 2012 49
51. Spring MVC
• REST support od 3.0
• Rozšíření Spring MVC
• Vývoj klient i server části aplikace
• Anotace ze standardního Spring
MVC
• @Controller, @RequestMapping
• @PathVariable, @RequestParam
Sunday 13 May 2012 51
52. Klíčové anotace
• @RequestBody
• @ResponseBody
• Řídí použití vlastní konverzi mezi
modelem a HTTP request/
response
• Vlastní práce je na message
convertorech
Sunday 13 May 2012 52
53. HttpMessageConverter
• Konvertuje mezi HTTP request a
response a argumenty/
návratovými typy metod
• Registrované v HandleAdapter
• Defaultně aktivované
• XML, JSON...
• Řídí se Media typem v HTTP hl.
Sunday 13 May 2012 53
55. RestTemplate
• Třída pro práci s REST APIs
• Podporuje UriTempate a
HttpMessageConvertory
• Umožňuje zaměřit se pouze na
vlastní aplikační logiku
• Vlastní abstrakce pro HTTP
• Nezávislost na HTTP klientovi
Sunday 13 May 2012 55