650 likes | 824 Views
Integr ácia aplikácií : Technol ógie 1 - Komunikácia. Obsah. HTTP (Hypertext Transfer Protocol) XML SOAP WSDL (Web Service Description Lang.) JMS (Java Message Service) REST (Representational State Transfer). HTTP. Hypertext Transfer Protocol. HTTP. HTTP: princíp fungovania.
E N D
Obsah • HTTP (Hypertext Transfer Protocol) • XML • SOAP • WSDL (Web Service Description Lang.) • JMS (Java Message Service) • REST (Representational State Transfer)
HTTP Hypertext Transfer Protocol
HTTP HTTP: princíp fungovania adresa dokumentu (URL): http://server/dokument
Schéma fungovania Proxy servery sa používajú typicky kvôli bezpečnosti (filtrovanie URL, filtrovanie obsahu prichádzajúcich dokumentov) alebo zvýšeniu výkonu (caching).
Požiadavka klienta na sprístupnenie dokumentu /www/index.html HTTP 1.1: RFC 2616
Using HTTP for application communication method: GET; parameters in URL (limited size) GET /getCustDetails?id=100347 HTTP/1.1 method: POST; parameters in message body POST /getCustDetails HTTP/1.1 Content-Type: text/xml <?xml version=“1.0” encoding=“UTF-8”?> <Customer> <ID>100347</ID> </Customer>
Properties • simple • rich existing infrastructure • application servers • proxy servers and load balancers • standard security solution (HTTPS = HTTP + SSL/TLS) • monitoring tools, test clients, client libraries, ... • almost no compatibility issues at the protocol level • synchronous mode • both parties + network connection must be available • in order to be reliable the client must implement retry mechanisms • server should respond in “reasonable” time (max. minutes)
HTTP a Java java.net • URL • URLConnection • HttpURLConnection • HttpsURLConnection
Príklad URL u = new URL("http://www.uniba.sk/"); URLConnection c = u.openConnection(); System.out.println("Content type: " + c.getContentType()); Map h = c.getHeaderFields(); dump(h); InputStream is = c.getInputStream(); int ch; while ((ch = is.read()) != -1) System.out.write(ch); is.close(); Communication/src/http/HttpClient.java
XML eXtensible Markup Language
Čo je to XML • XML je štandardný, na platforme nezávislý spôsob reprezentácie údajov • podobne ako HTML uzatvára údaje do značiek (tags), ale: • pri HTML sa značky týkajú spôsobu zobrazovania údajov, kým pri XML opisujú význam údajov • XML je rozšíriteľný (konkrétne značky definuje používateľ) <cenník> <káva> <názov>Nescafé</názov> <cena>167</cena> </káva> <káva> <názov>Jacobs</názov> <cena>213</cena> </káva> </cenník>
XML dokument • má fyzickú a logickú štruktúru • základom logickej štruktúry je element • prázdny • obsahujúci text a/alebo vnorené elementy • element môže mať tiež atribúty (meno="hodnota") <Cennik> <Kava nazov="Nescafé" cena="167" /> <Kava nazov="Jacobs" cena="213"> <Poznamka>platí do 10.6.2004</Poznamka> </Kava> </Cennik>
Práca s dokumentom XML • SAX (Simple API for XML) • parser, ktorý číta dokument XML a pri výskyte rôznych štrukturálnych prvkov volá používateľom určené funkcie • DOM (Document Object Model) • nástroj na reprezentáciu dokumentu formou stromu, umožňujúci čítania a modifikáciu
DOM: príklad public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); Document doc = factory.newDocumentBuilder().parse(new File("test.xml")); NodeList kavy = doc.getElementsByTagName("Kava"); for (int i = 0; i < kavy.getLength(); i++) { Element kava = (Element) kavy.item(i); System.out.println(kava.getAttribute("nazov") + ": " + kava.getAttribute("cena")); } } Communication/src/xml/*.java
Schéma XML dokumentu • XML nedefinuje význam mien elementov a ich atribútov • s výnimkou rezervovaných mien začínajúcich na „xml“ • schéma XML dokumentu, t.j. štruktúra a dátové typy elementov a ich atribútov môže byť popísaná v špeciálnom jazyku: • Document Type Definition • XML Schema • ak chcú aplikácie komunikovať, musia sa okrem syntaxe dohodnúť na význame (sémantike) jednotlivých elementov a atribútov • nad rámec XML a DTD / XML Schema
XML Schema • schéma – dokument v jazyku XSD určuje množinu vyhovujúcich XML dokumentov (inštancií tejto schémy) • popisuje elementy a ich atribúty prostredníctvom typov • typy sú: • jednoduché (pre atribúty a elementy obsahujúce len text) • zložené (pre elementy s podelementmi a/alebo atribútmi) • jednoduché typy: • preddefinované (rôzne textové a číselné typy, boolean, čas, ...) • odvodené (napr. reštrikciou) • zložené typy sú definované: • atribútmi a vnorenými elementmi (zoznam, počet výskytov, impl. hodnota, ...) • rozšírením (≈ dedenie) • ...
string, normalizedString, token base64Binary hexBinary integer [non]positiveInteger [non]negativeInteger [unsigned][long|int|short|byte] decimal, float, double boolean dateTime, date, time duration gYear, gYearMonth, gMonth, gMonthDay, gDay Name QName NCName anyURI language ID, IDREF, IDREFS, ENTITY, ENTITIES, NOTATION, NMTOKEN, NMTOKENS XML Schemapríklady jednoduchých typov
<xsd:element name="Cennik"> <xsd:complexType> <xsd:sequence> <xsd:element minOccurs="0" maxOccurs="unbounded" ref="Kava"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Kava"> <xsd:complexType> <xsd:sequence> <xsd:element name="Poznamka" type="xsd:string" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="nazov" type="xsd:string"/> <xsd:attribute name="cena" type="xsd:int"/> </xsd:complexType> </xsd:element> <Cennik> <Kavanazov="Nescafé" cena="167"/> <Kavanazov="Jacobs" cena="213"> <Poznamka>do 10.6.2004</Poznamka> </Kava> </Cennik>
Java API for XML Binding (JAXB) • umožňuje pracovať so (štruktúrovanými) XML dokumentmi ako s objektmi • podporuje dva režimy • XML schema → java (xjc) • java → XML schema (schemagen)
public static void main(String[] args) throws JAXBException, IOException { Unmarshaller unmarshaller = JAXBContext.newInstance("xsd.generated").createUnmarshaller(); Cennikc = (Cennik) unmarshaller.unmarshal (new FileReader("test.xml")); for (Kava k : c.getKava()) System.out.println(k.getNazov() + ": " + k.getCena()); } Communication/src/xsd + xsd/generated
XML Namespaces • názvy elementov a atribútov môžu byť globálne jednoznačné, ak sa pre ne určí menný priestor (namespace) • príklady: <cenníkxmlns=“http://myshop.sk/xmlschemy”> <káva> ... <xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”> <xsd:element ...>
SOAP (pôvodne Simple Object Access Protocol)
SOAP • protokol na posielanie XML správ medzi aplikáciami • schéma: aplikácia A (initial SOAP sender) posiela správu aplikácii Z (ultimate SOAP receiver) ktorá môže cestou prejsť aplikáciami B, C, D, ... (SOAP intermediaries) • prenosové protokoly sú rôzne • štandardizované je použitie HTTP • môže ísť aj o SMTP, MOM (napr. JMS), ... • formát správy: • SOAP Header • SOAP Body
SOAP Header a Body • SOAP Header prenáša najmä riadiace informácie zaisťujúce „vyššie“ služby: • adresovanie • bezpečnosť • transakcie • spoľahlivé doručenie • ... • pozostáva z položiek (Header Blocks) • zovšeobecnená obdoba položiek hlavičky v HTTP, RFC822, ... • SOAP Body prenáša samotný obsah správy • obsah nie je predpísaný – vec komunikujúcich strán
Príklad <env:Envelopexmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Body> <objxmlns="http://obchod.sk/schemy"> <káva>Nescafé</káva> <množstvo>100</množstvo> </obj> </env:Body> </env:Envelope> <env:Envelopexmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <wsse:Securityenv:mustUnderstand="true"xmlns:wsse=...> <wsse:UsernameToken> <wsse:Username>peter</wsse:Username> <wsse:Password>xxxxxx</wsse:Password> </wsse:UsernameToken> </wsse:Security> ... </env:Header> <env:Body> <objxmlns="http://obchod.sk/schemy"> <káva>Nescafé</káva> <množstvo>100</množstvo> </obj> </env:Body> </env:Envelope> značky definované v SOAP značky definované vo WS-Security značky definované aplikáciou
Čo definuje SOAP • v položke hlavičky (header block): • atribút role: pre koho je táto položka určená (URI) • atribút mustUnderstand: či jej musí príjemca rozumieť • atribút relay: čo má príjemca spraviť, ak jej nerozumie • spôsob signalizácie chýb (v Body) • spôsob realizácie RPC (nepovinný!) <env:Body> <názov operácie> <parameter1> hodnota </parameter1> <parameter2> hodnota </parameter2> ... </názov operácie> </env:Body> • detaily prenosu prostredníctvom HTTP
Verzie SOAP • SOAP 1.1 – vo forme W3C Note • SOAP 1.2 – vo forme W3C Recommendation (jún 2003) • dôraz kladený na „ideovú čistotu“ a rozšíriteľnosť
Properties • platform neutral, generally accepted • rich programming support • though compatibility is not 100% (as of today) • extensible • though more advanced specifications are not so widespread as the basic protocol • human-friendly (sometimes) • due to the use of XML • performance issues • though alternative XML encodings are emerging
WSDL Web Services Description Language
WSDL Opisuje formát správ prijímaných a posielaných webovou službou: • na abstraktnej úrovni (messages, operations, port types) • na konkrétnej úrovni (bindings, ports, services)
Abstraktný opis(1) • rozhranie (portType) pozostáva z popisu množiny súvisiacich operácií • operácia (operation) pozostáva z 1, 2 alebo viacerých správ (vstup, výstup, [chyby]) • správa (message) – pozostáva z častí (parts) definovaných ako elementy alebo typy cez XML Schema
<wsdl:definitions ...> <wsdl:types> <xsd:schema ...> <xsd:element name="A" type="xsd:double"/> <xsd:element name="B" type="xsd:double"/> <xsd:element name="C" type="xsd:double"/> </xsd:schema> </wsdl:types> <wsdl:message name="Input"> <wsdl:part name="A" element="tns:A"/> <wsdl:part name="B" element="tns:B"/> </wsdl:message> <wsdl:message name="Output"> <wsdl:part name="C" element="tns:C"/> </wsdl:message> <wsdl:portType name="CalcPortType"> <wsdl:operation name="sum"> <wsdl:input message="tns:Input“/> <wsdl:output message="tns:Output“/> </wsdl:operation> </wsdl:portType>
Konkrétny opis • element binding definuje napríklad (pre SOAP 1.1) • ktoré z (abstraktných) častí správy sa mapujú do SOAP Body a ktoré do SOAP Headers (a akým spôsobom) • štýl volania: rpc alebo document • štýl kódovania: encoded alebo literal • použitý transport (napr. HTTP, SMTP, JMS) • element service pozostáva z podelementov port, ktoré definujú, na akých fyzických adresách (napr. URL) sú prístupné jednotlivé bindings
<binding xmlns:ns1="http://test/" name="CalcPortBinding“ type="ns1:CalcPortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document“/> <operation name="sum"> <soap:operation soapAction=""/> <input> <soap:body use="literal“/> </input> <output> <soap:body use="literal“/> </output> </operation> </binding>
<servicename="CalcService"> <portname="CalcPort" binding="tns:CalcPortBinding"> <soap:address location="http://localhost:9001/calc"/> </port> </service>
Verzie WSDL • WSDL 1.1 – vo forme W3C Note • WSDL 2.0 – W3C Recommendation (jún 2007)
WS-IWeb Services Interoperability Organization • štandardy pre webové služby sú veľmi flexibilné, čo spôsobuje niekedy problémy • snaha definovať tzv. profily zabezpečujúce interoperabilitu • profil = výber z existujúcich štandardov • príklad: WS-I Basic Profile 1.1 (august 2004) • špecifikuje podmnožinu SOAP 1.1, WSDL 1.1 a UDDI 2 • napr. vylučuje používanie SOAP Encoding
Java API pre XML • Java API for XML Processing (JAXP) • prístup k XML dokumentom (SAX, DOM) • prístup k službám XSL procesora a k XPath • Java Architecture for XML Binding (JAXB) • generovanie javovských tried pre čítanie a zápis (unmarshalling / marshalling) konkrétnych tried XML dokumentov • Java API for XML-based Web Services (JAX-WS) • SOAP (implementácia klientov a serverov) • predtým JAX-RPC • SOAP with Attachments API for Java (SAAJ) • nízkoúrovňová práca so SOAP • Java API for XML Registries (JAXR) • prístup k adresárovým službám pre Web Services (napr. UDDI)
JAX-RPC / JAX-WS • princíp podobný ostatným RPC a CORBA • programátor definuje rozhranie / službu • nástroje JAX-WS vygenerujú podporný kód na strane klienta (stub) aj servera (ties) • programátor vytvorí „čistý“ kód na strane klienta aj servera • začať je možné z: • javovského rozhrania / služby (a z neho generovať WSDL) • WSDL (a z neho generovať javovské rozhranie)
package ws.server1; import javax.jws.WebService; @WebService() public class Calc { public double sum(double a, double b) { return a + b; } } ------------------------------------------------------------ package ws.server1; import javax.xml.ws.Endpoint; class CalcMain { public static void main(String[] args) { Endpoint.publish("http://localhost/calc", new Calc()); } }
Java → WSDL Server • (v adresári Communication) • \jdk\bin\wsgen -cp bin -s src -d bin ws.server1.Calc -keep • vytvára artefakty potrebné na spustenie webovej služby • spustenie ws.server1.CalcMain spustí webovú službu • o.i. sprístupní WSDL na adrese http://localhost:9000/calc?wsdl Klient • \jdk\bin\wsimport http://localhost:9000/calc?wsdl -keep -p ws.client1.jaxws -s src -d bin • získa WSDL, vytvára java stub(s)
WSDL→ Java Server • \jdk\bin\wsimportsrc\ws\server2\CalcService.wsdl -keep -p ws.server2.jaxws -s src -d bin [-b src/ws/server2/binding.xml] • vytvára pomocný kód na strane servera • binding.xml (nepovinné) v tomto prípade kvôli logginghandler • spusenie ws.server2.CalcMain spustí webovú službu Klient (bez zmeny) • \jdk\bin\wsimport http://localhost:9001/calc?wsdl -keep -p ws.client2.jaxws -s src -d bin • získa WSDL, vytvára javastub(s)
<types> <xsd:schema ...> <element name="sum"> <complexType> <sequence> <element name="A" type="xsd:double"/> <element name="B" type="xsd:double"/> </sequence> </complexType> </element> <element name="sumResponse"> <complexType> <sequence> <element name="C" type="xsd:double"/> </sequence> </complexType> </element> </xsd:schema> </types> <message name="sum"> <part name="data" element="tns:sum"/> </message> <message name="sumResponse"> <part name="data" element="tns:sumResponse"/> </message> <portType name="CalcPortType"> <operation name="sum"> <input message="tns:sum"/> <output message="tns:sumResponse"/> </operation> </portType>
Java Message Service (JMS) • štandardné API pre MOM (Messaging Oriented Middleware) • dnes je súčasťou Java Platform, Enterprise Edition • produkty – komerčné • IBM WebSphere MQ family (pôvodne MQSeries) • Progress SonicMQ • FioranoMQ • všetky implementácie Java EE (J2EE) • free / open source • Apache ActiveMQ • JBoss Messaging • JORAM, OpenJMS, MantaRay, ...
Základné pojmy • implementácia (JMS provider) • klienti (JMS clients) • správy (messages) • sprostredkovatelia (brokers)
Fronty • klient posiela správu do frontu (queue) • správa tam čaká, kým ju(iný) klient neprevezme • môže byť viac príjemcov, ale každá správa je doručená práve jednému (z nich) • tiež známe ako režim komunikácie bod-bod (point-to-point)
Topics • klient posiela správu natopic • správa je doručenávšetkýmklientom, ktorí • sa prihlásili (subscribe) na odber správ z tohto topic-u • sú v súčasnosti pripojeník brokeru (výnimka: durable subscriptions) • tiež známe ako režimpublish/subscribe