Spring Web Services

765 views

Published on

* 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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
765
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
23
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Spring Web Services

  1. 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. 2. Spring WS, REST, HTTP Vzdáleny přístup k datůmSunday 13 May 2012 2
  3. 3. Vzdálený přístup k datům • Motivace • Integrace heterogeních sytému • Mashups • Strojové zpracování datSunday 13 May 2012 3
  4. 4. Remote service bridge Remote service bridgeSunday 13 May 2012 4Remote service bridge je jenom jednou z dalších možností, kromě UI, jak vystavit aplikačnílogiku
  5. 5. Jak na webové služby • Spring • Spring WS (SOAP) • Spring MVC (REST) • Spring Remoting • HTTP, Hessian, Burlap, RMISunday 13 May 2012 5- každá z těchto technologií má sve výhody a nevýhody
  6. 6. WS (SOAP) • Průmyslový standard • WSDL descriptor a XSD • Interoperabilní technologie • .NET, Java, Ruby... • Protokolově nezávislé • HTTP, JMS, XMPP, SMTPSunday 13 May 2012 6
  7. 7. WS (REST) • Navržené s ohledem na HTTP • Metody, Statusy, Cont. type nego. • Jednoduchý interface • POST, PUT, GET, DELETE • Různé reprezentace • JSON, XMLSunday 13 May 2012 7
  8. 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. 9. RPC vs. Zprávy Service interface Client Server Client Stub Service Service RPC facade logic stub implementaceSunday 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. 10. RPC vs. Zprávy Client ClientStub Message Protokol logic adapter adapter Message Server Protokol Message Service adapter adapter implementaceSunday 13 May 2012 10vyměňují se zprávy (dokumenty/resources) namísto zakrývání vzdáleného volání
  11. 11. Web ServicesSunday 13 May 2012 11
  12. 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žbaSunday 13 May 2012 12
  13. 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í serverSunday 13 May 2012 • runtime 13
  14. 14. Techniky návrhu • Contract first • Začínáme definicí XSD a WSDL • Contract last • Začínáme kódemSunday 13 May 2012 14Spring WS podporuje pouze contract first
  15. 15. Contract first • Výhody • Robustnost • Výkonnost • Interoperabilita • Nevýhody • Složitější (znalost XSD, WSDL)Sunday 13 May 2012 15robustnost = nepodléhá refactoru (změna názvu metod apod.)interoperabilita = problém s různymi generátory WSDL/XSD, typy atd.
  16. 16. Contract first • Návrh zpráv (dokumentů) pro komunikaci server/client • Popis kontraktu • Struktura zpráv/dokumentů • Volitlně popis služby • WSDLSunday 13 May 2012 16Spring WS - XSD, Relax NG, Schematron
  17. 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 17Namespace předchází konfliktum pokud mixujeme různé XML fragmenty
  18. 18. XSD <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://dagblog.cz/BookReservation" xmlns:rs="http://dagblog.cz/BookReservation"> <element name="Reservation"> <complexType> <all> <element name="bookId" type="long"/> <element name="reservationId" type="long" minOccurs="0" nillable="true"/> </all> </complexType> </element> </schema> <Reservation> <bookId>1</bookId> </Reservation>Sunday 13 May 2012 18
  19. 19. Definice kontraktu služebSunday 13 May 2012 19
  20. 20. WSDL • Definice zpráv • Definice operací (ports) • Definice bindingu • Aplikační protokol • Transportní protokolSunday 13 May 2012 20- Není povinné pro Spring WS- SpringWS umí vygenerovat a automaticky vystavit- Vhodné mít pro klienty
  21. 21. <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http:// schemas.xmlsoap.org/wsdl/soap/" xmlns:schema="http://dagblog.cz/BookReservation/schema" xmlns:rs="http://dagblog.cz/BookReservation" targetNamespace="http://dagblog.cz/BookReservation"> <wsdl:types> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:import namespace="http://dagblog.cz/BookReservation/schema" schemaLocation="BookReservation.xsd"/> </xsd:schema> </wsdl:types> <wsdl:message name="ClaimReservationRequest"> <wsdl:part element="schema:ClaimReservationRequest" name="ClaimReservationRequest"/> </wsdl:message> <wsdl:message name="ClaimReservationResponse"> <wsdl:part element="schema:ClaimReservationResponse" name="ClaimReservationResponse"/> </wsdl:message> <wsdl:portType name="BookReservationResource"> <wsdl:operation name="ClaimReservation"> <wsdl:input message="rs:Reservation" name="ClaimReservationRequest"/> <wsdl:output message="rs:Reservation" name="ClaimReservationResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="BookReservationBinding" type="rs:BookReservationResource"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="ClaimReservation"> <soap:operation soapAction="http://dagblog.cz/BookReservation/ClaimReservation"/> <wsdl:input name="ClaimReservationRequest"><soap:body use="literal"/></wsdl:input> <wsdl:output name="ClaimReservationResponse"><soap:body use="literal"/></wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="BookReservationService"> <wsdl:port binding="rs:BookReservationBinding" name="BookReservationResourcePort"> <soap:address location="http://localhost:8080/springws/ws/"/> </wsdl:port> </wsdl:service> </wsdl:definitions>Sunday 13 May 2012 21
  22. 22. SOAP • SOAP • Simple Object Access Protocol • Definuje způsob komunikace služeb • Platformově nezávislý • Nezávislý na transp. protokolu • Definuje bindingSunday 13 May 2012 22
  23. 23. SOAPSunday 13 May 2012 23zjednodušeně řečeno SOAP je obálka pro naše zprávy, která zaručí jejich doručení
  24. 24. SOAP zpráva <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <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 24
  25. 25. SpringWSSunday 13 May 2012 25
  26. 26. SpringWSSunday 13 May 2012 26core - SOAP, zakladni abstrakce, server i klient, message dispatching, HTTPsupport - dalsi protokoly (JSM, SMTP, Jabber)xml - WS Security a napojeni do Spring security
  27. 27. SpringWSSunday 13 May 2012 27
  28. 28. Request processingSunday 13 May 2012 28
  29. 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 29SpringWS nám umožňuje se zaměřit pouze na payload (vlastní zpráva), zbytek (SOAP) je v jehorežiiKeep it simple
  30. 30. Zprava a její zpracování • Jakým způsobem může endpoint zpracovat payload • Low level • DOM, SAX, StAX • Marshalling • JAXB, Castor, XML beansSunday 13 May 2012 30Rozdíl SAX a DOMDOM = (JDOM, XOM, Dom4j)Vysvětlení rozdílu Low level a Marshallingu (kdy použít jedno a kdy druhé)
  31. 31. EndpointSunday 13 May 2012 31
  32. 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 32význam anotací
  33. 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
  34. 34. Klientský přístup k WSSunday 13 May 2012 34
  35. 35. WebServiceTemplate • Zjednodušuje přístup k WS • Zaměření pouze na payload • žádný SOAP • Konvenční metody pro volání služebSunday 13 May 2012 35Možné použítWebServiceGatewaySupport
  36. 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. 37. • Praktické cvičení • Pojďmě si navrhnout a naimplementovat WS rozhraní k naší rezervační služběSunday 13 May 2012 37
  38. 38. RESTSunday 13 May 2012 38
  39. 39. REST • Representational State Transfer • Roy Fielding • Architektonický styl • Škálovatelnost • HTTP je i aplikační protokol • Web není jenom o prohlížečíchSunday 13 May 2012 39
  40. 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. 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í komunikaciSunday 13 May 2012 41
  42. 42. Proč REST • Stačí pouze HTTP klient • Dostupný na každé platformě • Žádné XML peklo • Vše se řídí HTTP protokolemSunday 13 May 2012 42Né každý zná HTTP protokol ;-)
  43. 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. 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á chybaSunday 13 May 2012 44Aplikace se nemusí navrhovat a vytvářet vlastní protokol
  45. 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 deathSunday 13 May 2012 45
  46. 46. Reprezentace resourců • XML, JSON, text... • volba pomocí content negotian • Media type (iniciuje klient) • Klientská data • Content-type • Odpověď (pouze hint) • AcceptSunday 13 May 2012 46
  47. 47. REST vs. WS • Volte podle konzumentů • WS • vhodné do korporátního prostředí (standard) • REST • vhodné pro internetové appky • mashups a integraceSunday 13 May 2012 47REST je velmi vhodný pro mobilní aplikace
  48. 48. Ukázka GoodData REST APISunday 13 May 2012 48demonstrovat použití HTTP klienta - content/accept, errors atd.
  49. 49. REST v Jave • JAX-RS Java 6 EE Standard • Vývoj RESTových služeb • Není podpora psaní REST klienta • Implementace • Jersey, RESTEasy, RestletSunday 13 May 2012 49
  50. 50. Spring MVC a RESTSunday 13 May 2012 50
  51. 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, @RequestParamSunday 13 May 2012 51
  52. 52. Klíčové anotace • @RequestBody • @ResponseBody • Řídí použití vlastní konverzi mezi modelem a HTTP request/ response • Vlastní práce je na message convertorechSunday 13 May 2012 52
  53. 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
  54. 54. Klientský přístupSunday 13 May 2012 54
  55. 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 klientoviSunday 13 May 2012 55
  56. 56. RestTemplate APISunday 13 May 2012 56
  57. 57. @Component public class BookReservationClientRest { @Autowired private RestTemplate restTemplate; public Reservation reserveBook(long bookId) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON)); ReservationImpl reservation = new ReservationImpl(); reservation.setBookId(bookId); URI uri = URI.create("http://localhost:8080/springws/rest/reservation/"); HttpEntity<ReservationImpl> requestEntity = new HttpEntity<ReservationImpl>(reservation, headers); ResponseEntity<ReservationImpl> response = restTemplate.postForEntity(uri), requestEntity, ReservationImpl.class); return response.getBody(); } } <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans"> <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" /> </beans>Sunday 13 May 2012 57
  58. 58. • Praktické cvičení • Pojďmě si navrhnout a naimplementovat REST rozhraní k naší rezervační služběSunday 13 May 2012 58

×