SlideShare a Scribd company logo
1 of 58
Download to read offline
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
Spring WS, REST, HTTP
                     Vzdáleny přístup k datům




Sunday 13 May 2012                              2
Vzdálený přístup k datům


                     • Motivace
                      • Integrace heterogeních sytému
                       • Mashups
                      • Strojové zpracování dat


Sunday 13 May 2012                                      3
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
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
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
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
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
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á
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í
Web Services




Sunday 13 May 2012                  11
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
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
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
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.
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
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
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
Definice kontraktu služeb




Sunday 13 May 2012                              19
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
<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
SOAP
                     • SOAP
                      • Simple Object Access Protocol
                      • Definuje způsob komunikace
                        služeb
                      • Platformově nezávislý
                      • Nezávislý na transp. protokolu
                       • Definuje binding
Sunday 13 May 2012                                       22
SOAP




Sunday 13 May 2012                                                                 23

zjednodušeně řečeno SOAP je obálka pro naše zprávy, která zaručí jejich doručení
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
SpringWS




Sunday 13 May 2012              25
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
SpringWS




Sunday 13 May 2012              27
Request processing




Sunday 13 May 2012                        28
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
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é)
Endpoint




Sunday 13 May 2012              31
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í
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
Klientský přístup k WS




Sunday 13 May 2012                            34
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
@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
• Praktické cvičení

                       • Pojďmě si navrhnout a naimplementovat WS
                         rozhraní k naší rezervační službě




Sunday 13 May 2012                                                  37
REST




Sunday 13 May 2012          38
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
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
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
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 ;-)
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
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
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
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
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
Ukázka GoodData REST API




Sunday 13 May 2012                                                48

demonstrovat použití HTTP klienta - content/accept, errors atd.
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
Spring MVC a REST




Sunday 13 May 2012                       50
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
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
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
Klientský přístup




Sunday 13 May 2012                       54
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
RestTemplate API




Sunday 13 May 2012                      56
@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
• Praktické cvičení

                       • Pojďmě si navrhnout a naimplementovat REST
                         rozhraní k naší rezervační službě




Sunday 13 May 2012                                                    58

More Related Content

Viewers also liked

Argumentaci+¦n jur+¡dica
Argumentaci+¦n jur+¡dicaArgumentaci+¦n jur+¡dica
Argumentaci+¦n jur+¡dicaRoxana Feniix
 
Stravovanie pocas rakoviny
Stravovanie pocas rakovinyStravovanie pocas rakoviny
Stravovanie pocas rakovinySamuel Šramko
 
Best of #selský rozum #digital
Best of #selský rozum #digitalBest of #selský rozum #digital
Best of #selský rozum #digitalpriasystem
 
E-learning Development and Exchange: practical lessons from developing e-lang...
E-learning Development and Exchange: practical lessons from developing e-lang...E-learning Development and Exchange: practical lessons from developing e-lang...
E-learning Development and Exchange: practical lessons from developing e-lang...eLearning Papers
 
Bahan ajar tik
Bahan ajar tikBahan ajar tik
Bahan ajar tikzaviro
 
Petr Klápště - Ekologický urbanismus sídel
Petr Klápště - Ekologický  urbanismus sídelPetr Klápště - Ekologický  urbanismus sídel
Petr Klápště - Ekologický urbanismus sídelViktor Karlík
 
Košťanský zpravodaj - prosinec 2013
Košťanský zpravodaj - prosinec 2013Košťanský zpravodaj - prosinec 2013
Košťanský zpravodaj - prosinec 2013Pavel Vondra
 
Banners broker cz prezentace česky
Banners broker cz prezentace českyBanners broker cz prezentace česky
Banners broker cz prezentace českyMartin Jilek
 
GfK neuromarketing - no more black box
GfK neuromarketing - no more black boxGfK neuromarketing - no more black box
GfK neuromarketing - no more black boxSIMAR
 
Lectura 3 10-2014
Lectura 3 10-2014Lectura 3 10-2014
Lectura 3 10-2014mosansar
 
Vzpomínka ti zůstane
Vzpomínka ti zůstaneVzpomínka ti zůstane
Vzpomínka ti zůstanenewspiritexist
 

Viewers also liked (19)

Wolz 2
Wolz 2Wolz 2
Wolz 2
 
Argumentaci+¦n jur+¡dica
Argumentaci+¦n jur+¡dicaArgumentaci+¦n jur+¡dica
Argumentaci+¦n jur+¡dica
 
Stravovanie pocas rakoviny
Stravovanie pocas rakovinyStravovanie pocas rakoviny
Stravovanie pocas rakoviny
 
Best of #selský rozum #digital
Best of #selský rozum #digitalBest of #selský rozum #digital
Best of #selský rozum #digital
 
E-learning Development and Exchange: practical lessons from developing e-lang...
E-learning Development and Exchange: practical lessons from developing e-lang...E-learning Development and Exchange: practical lessons from developing e-lang...
E-learning Development and Exchange: practical lessons from developing e-lang...
 
FAnn vánoce 2003
FAnn vánoce 2003FAnn vánoce 2003
FAnn vánoce 2003
 
Bahan ajar tik
Bahan ajar tikBahan ajar tik
Bahan ajar tik
 
Adaptació
AdaptacióAdaptació
Adaptació
 
Petr Klápště - Ekologický urbanismus sídel
Petr Klápště - Ekologický  urbanismus sídelPetr Klápště - Ekologický  urbanismus sídel
Petr Klápště - Ekologický urbanismus sídel
 
evolucijska
evolucijskaevolucijska
evolucijska
 
Graphic
GraphicGraphic
Graphic
 
Adopce signatur
Adopce signaturAdopce signatur
Adopce signatur
 
Košťanský zpravodaj - prosinec 2013
Košťanský zpravodaj - prosinec 2013Košťanský zpravodaj - prosinec 2013
Košťanský zpravodaj - prosinec 2013
 
Effie 2003 - Urobme to!
Effie 2003 - Urobme to!Effie 2003 - Urobme to!
Effie 2003 - Urobme to!
 
Banners broker cz prezentace česky
Banners broker cz prezentace českyBanners broker cz prezentace česky
Banners broker cz prezentace česky
 
GfK neuromarketing - no more black box
GfK neuromarketing - no more black boxGfK neuromarketing - no more black box
GfK neuromarketing - no more black box
 
Lectura 3 10-2014
Lectura 3 10-2014Lectura 3 10-2014
Lectura 3 10-2014
 
Vzpomínka ti zůstane
Vzpomínka ti zůstaneVzpomínka ti zůstane
Vzpomínka ti zůstane
 
Napoleon v Rusku
Napoleon v RuskuNapoleon v Rusku
Napoleon v Rusku
 

Similar to Spring Web Services

Similar to Spring Web Services (7)

Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou Tvari
 
Spring Transactions
Spring TransactionsSpring Transactions
Spring Transactions
 
Spring ioc
Spring iocSpring ioc
Spring ioc
 
ASP.NET MVC a TDD
ASP.NET MVC a TDDASP.NET MVC a TDD
ASP.NET MVC a TDD
 
2010 X33EJA Web Services
2010 X33EJA Web Services2010 X33EJA Web Services
2010 X33EJA Web Services
 
Spring aop
Spring aopSpring aop
Spring aop
 
Spring dao
Spring daoSpring dao
Spring dao
 

More from Roman Pichlík

More from Roman Pichlík (10)

Cynycal software
Cynycal softwareCynycal software
Cynycal software
 
App Design Architecture
App Design ArchitectureApp Design Architecture
App Design Architecture
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
Spring Testing
Spring TestingSpring Testing
Spring Testing
 
Spring J2EE
Spring J2EESpring J2EE
Spring J2EE
 
Spring ioc-advanced
Spring ioc-advancedSpring ioc-advanced
Spring ioc-advanced
 
Spring integration
Spring integrationSpring integration
Spring integration
 
MongoDB for Java Developers
MongoDB for Java DevelopersMongoDB for Java Developers
MongoDB for Java Developers
 
Nosql from java developer pov
Nosql from java developer povNosql from java developer pov
Nosql from java developer pov
 
Dependency Injection Frameworky
Dependency Injection FrameworkyDependency Injection Frameworky
Dependency Injection Frameworky
 

Spring Web Services

  • 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í
  • 11. Web Services Sunday 13 May 2012 11
  • 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
  • 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
  • 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
  • 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. SOAP • SOAP • Simple Object Access Protocol • Definuje způsob komunikace služeb • Platformově nezávislý • Nezávislý na transp. protokolu • Definuje binding Sunday 13 May 2012 22
  • 23. SOAP Sunday 13 May 2012 23 zjednodušeně řečeno SOAP je obálka pro naše zprávy, která zaručí jejich doručení
  • 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
  • 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
  • 34. Klientský přístup k WS Sunday 13 May 2012 34
  • 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
  • 50. Spring MVC a REST Sunday 13 May 2012 50
  • 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
  • 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. • Praktické cvičení • Pojďmě si navrhnout a naimplementovat REST rozhraní k naší rezervační službě Sunday 13 May 2012 58