SOAP és webservice
XML-API
XML használata Program-program kapcsolat egyik módja adóprogram előállítja az átvinni kívánt objektumot objektum bean-ként objektumból XML XML átvitele vevő kapott egy XML-t XML-ből átalakítás objektummá
Átvitel megoldása Adó rendszer (mint web-kliens) XML-ben a kérés válaszXML -> bean bean->XML XML-ben a kérés (HTTP request-ként) XML-ben a válasz (HTTP response-ként) Vevő rendszer (mint web-szerver) válaszbean -> XML XML->bean
Működés Kérés egy Javabean-ben képződik Szimulált böngésző bean-ből XML-t kell generálni szimulálni kell programmal a web-böngészőt HTTP-request készítés Szimulált böngésző visszaveszi a HTTP-response-ot az adattartalom egy XML-szerkezet XML-ből Javabean struktúrát kell készíteni
XML és Javabean kapcsolata public class TestBean implements java.io.Serializable { protected int foo; protected String bar; protected java.util.Date baz; protected Vector thingies; protected TestSubbean sub; … } <MarkTest> <foo>5</foo> <bar>This is the bar value</bar> <baz> <year>2003</year> <month>03</month> . . . </baz> <thingies> <item index=”0”>Moe</thing> <item index=”1”>LX</thing> </thingies> <sub> <name>Mark</name> <age>56</age> </sub> </MarkTest>
XML és Javabean kapcsolata public class TestBean implements java.io.Serializable { protected int foo; protected String bar; protected java.util.Date baz; protected Vector thingies; protected TestSubbean sub; … } <MarkTest> <foo>5</foo> <bar>This is the bar value</bar> <baz> <year>2003</year> <month>03</month> . . . </baz> <thingies> <item index=”0”>Moe</thing> <item index=”1”>LX</thing> </thingies> <sub> <name>Mark</name> <age>56</age> </sub> </MarkTest>
Bean-ből XML készítése try { TestBean b = new TestBean(); b.setFoo(5); b.setBar("This is the bar value"); ... b.setThingies(new String[] { "Moe", "LX"} ); TestSubbean sub = new TestSubbean(); sub.setName("Mark"); sub.setAge(56); b.setSub(sub); FileOutputStream fileOut = new FileOutputStream(”output.xml"); JOXBeanOutputStream joxOut = new JOXBeanOutputStream(fileOut); joxOut.writeObject("MarkTest", b); } bean előállítása ez jön létre! első szint neve kell! bean, mint bemenet
XML-ből bean készítése bemeneti xml try { FileInputStream in = new FileInputStream(”input.xml"); JOXBeanInputStream joxIn = new JOXBeanInputStream(in); TestBean testBean = (TestBean) joxIn.readObject( TestBean.class); } int foo = testbean.getFoo(); String bar = testbean.getBar(); ... „minta” osztályként megadva felhasználás
Átvitel HTTP-vel Külön Java-osztály a kezeléshez Request-készítés Response-várás URL dataURL = new URL(protocol, host, port, uri); URLConnection connection = dataURL.openConnection(); ByteArrayOutputStream byteStream = ...; byteStream.writeTo(connection.getOutputStream()); BufferedReader in = new BufferedReader( new InputStreamReader (connection.getInputStream()));
SOAP
Előzmények: WDDX Web Distribution Data Exchange </wddxPacket> <wddxPacket version=“1.0”> <header /> <data> <recordset rowCount=”1” fieldNames=“url,headLine,source”> <field name=“url”> <string>http://c.xxx.com/here.pl?x228879</string> </field> <field name=“headLine”> <string>Firefighters in Wyoming</string> <field name=“source”> <string>CNN</string> </recordset> </data> </wddxPacket>
Előzmények: XML-RPC <methodCall> <methodName>NumberToText</methodname> <params> <param> <value><i4>28</i4></value> </param> </params> </methodCall> <methodResponse> <params> <value><string>huszonnyolc</string></value> </methodResponse>
SOAP Simple Object Application Protocol MicroSoft találja ki, W3C is elfogadja 2000-től távoli programok együttműködésére „alrendszer”, azaz alsó szintű építőelem intranetben, Interneten működik: lehet SMTP, FTP, vagy közvetlen IP-alapú de általában HTTP-vel használják XML 2.0-t használ (névtér kell!) RPC jelleggel működik
Remote Procedure Call Összevetés a lokális eljárás hívással hívó és hívott eljárás más “végrehajtási kontextusban” Eljárás jellemzői utasítás szekvencia van egy belépés és egy visszatérési pontja hívó addig nem lép tovább, amíg nincs visszatérés
RPC specialitásai Kliens/szerver - összekapcsolódás (binding) hívó: kliens, hívott: szerver binding-ot a kliens kezdeményezi Paraméter átadás nincs cím szerinti hívás! Újabb végrehajtási hibák távoli gép hibái függetlenek a lokálistól Biztonsági problémák - 2 értelemben is hálózati kommunikáció megbízható legyen hálózati kommunikáció veszélyhelyzetei
Réteges szerkezet alkalmazás alkalmazás SOAP SOAP HTTP HTTP komm.verem
SOAP átvitel Boríték rendszerben Adás-vétel hasonló szerkezetben 3 névtér kell SOAP, XML-séma, XML-típusok törzs (body) mindenképpen kell itt a hívás ill. a válasz fejléc (header) nem szükséges fejlécben különleges lehetőségek
SOAP-kérés boríték POST /xxx/InventoryChck.jws HTTP/1.0 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: 426 SOAPAction: “” <?xml version “1.0” encoding=“UTF-8” ?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=“http://schemas.../encoding/” xmlns:xsd=“http://www.w3.org./.../XMLSchema” xmlns:SOAP-ENV=“http://sschemas.../envelope/” xmlns:xsi=“http://www.w3.org/.../XMLSchema-instance” > <SOAP-ENV:Body> <doCheck> <arg0 xsi:type=“xsd:string”>947-TI</arg0> <arg1 xsi:type=“xsd:int”>1</arg1> </doCheck> </SOAP-ENV:Body> </SOAP-ENV:Envelope> HTTP header HTTP body
SOAP-kérés boríték POST /xxx/InventoryChck.jws HTTP/1.0 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: 426 SOAPAction: “” <?xml version “1.0” encoding=“UTF-8” ?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=“http://schemas.../encoding/” xmlns:xsd=“http://www.w3.org./.../XMLSchema” xmlns:SOAP-ENV=“http://sschemas.../envelope/” xmlns:xsi=“http://www.w3.org/.../XMLSchema-instance” > <SOAP-ENV:Body> <doCheck> <arg0 xsi:type=“xsd:string”>947-TI</arg0> <arg1 xsi:type=“xsd:int”>1</arg1> </doCheck> </SOAP-ENV:Body> </SOAP-ENV:Envelope> HTTP header HTTP body
SOAP-válasz boríték HTTP/1.0 200 OK Content-Type: text//xml; charset=utf-8 Content-Length: 426 <?xml version “1.0” encoding=“UTF-8” ?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=“http://schemas.../encoding/” xmlns:xsd=“http://www.w3.org./.../XMLSchema” xmlns:SOAP-ENV=“http://sschemas.../envelope/” xmlns:xsi=“http://www.w3.org/.../XMLSchema-instance” > <SOAP-ENV:Body> <doCheckResponse> <doCheckResult xsi:type=“xsd:boolean”>true</doCheckResult> </doCheckResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Fejlécek és szerepük mindenképpen végrehajtandó! <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=“http://schemas.../encoding/” xmlns:xsd=“http://www.w3.org./.../ XMLSchema” xmlns:SOAP-ENV=“http://sschemas.../envelope/” xmlns:xsi=“http://www.w3.org/.../XMLSchema-instance” > <SOAP-ENV:Header> <t:Transaction xmlns:t=”.../...” SOAP-ENV:mustUnderStand=“1”> 123456 </t:Transaction> <p:Priority xmlns:p=”.../...” ...> ... </p:Priority> </SOAP-ENV:Header> <SOAP-ENV:Body> ... </SOAP-ENV:Body> </SOAP-ENV:Envelope> mindenképpen végrehajtandó!
Autentikáció <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=“http://schemas.../encoding/” xmlns:xsd=“http://www.w3.org./.../ XMLSchema” xmlns:SOAP-ENV=“http://sschemas.../envelope/” xmlns:xsi=“http://www.w3.org/.../XMLSchema-instance” > <SOAP-ENV:Header> <ai:AuthenticationInfo xmlns:ai=”.../...” SOAP-ENV:mustUnderStand=“1” SOAP-ENV:actor=“urn:X-Skala:PartnerGateway”> <username>PartnerA</username> <password>xxabsoap</password> </ai:AuthenticationInfo> ... <SOAP-ENV:Header> </SOAP-ENV:Envelope>
Actor szerepe: lánc SOAP-üzenet módosítható! pl. naplózás webservice megvalósító WS ügynök k é r é s igénylő v á l a s z
Hibajelzések HTTP/1.0 500 OK Content-Type: text/xml; charset=utf-8 Content-Length: 426 <?xml version “1.0” encoding=“UTF-8” ?> <SOAP-ENV:Envelope SOAP-ENV:encodingStyle=“http://schemas.../encoding/” xmlns:xsd=“http://www.w3.org./.../ XMLSchema” xmlns:SOAP-ENV=“http://sschemas.../envelope/” xmlns:xsi=“http://www.w3.org/.../XMLSchema-instance” > <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>AuthenticationFalure</faultcode> <faultstring>Failed to authenticate client</faultstring> <faultactor> urn:X-Skala:PartnerGateway</faultactor> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Webservice (webszolgáltatás)
Szolgáltatás nyilvántartó Általános szerkezet Szolgáltatás modell kliens keresés használat Szolgáltatás nyilvántartó Szolgáltató közzététel
Milyen szolgáltatást? Fő jellemzők Alsó átvitel mint egy metódus paraméterezés 2 módon hagyományos paraméterek (int, Hashtable, Vector, stb.) XML be/ki általában állapotmentes megoldás Alsó átvitel SOAP-pal
Webservice példák Autentikáció Irányítószám-helységnév Díjszámítás int check (String username, String password) int changePassword (String username, String oldpass, String newpass, String newpass2) Irányítószám-helységnév Vector findHelysegByIrszam (String irszam) Vector findIrszamByHelyseg (String helyseg) Vector getAllHelyseg () Díjszámítás HashMap getFee (int male, Date birthdate , int sum, int year)
Díjszámítás-webservice kimenete HashMap getFee (int male, Date birthdate , int sum, int year) e_date 1 e_sum 2 o_age 54 o_age 34 o_annual 34560 o_monthly 2880 o_monthlyCheck 3168
Webservice jelentősége Intranetben szolgáltatások az intranet tetszőleges helyén igénybevehetők tetszőleges nyelven központi karbantartás Ez B2B kommunikáció extranet kapcsolatokon a lényeges info megy át
Webservice, mint B2B kapcsolat intranet tűzfal www.xxx.hu Internet “webservice” szerver ügyfél gépe vagy intranetje
Műveletek típusa Kérés-válasz (pl. díjszámítás) legáltalánosabb Csak válasz (pl. időpont lekérdezés) nincs bemenő paraméter Jelzés (pl. időtúllépés a keresésben) a szolgálató kezdeményezi milyen címre jöjjön: előtte címbeadás Jelzés-válasz (pl. időtúllépés hatására leállító akció) jelzésre a kliens visszaszól hasonló problémák, mint a jelzésnél
Szolgáltatás leírása Külön nyelv WSDL: WebService Definition Language XML forma sok komponensből Elemei mit csinál adat és protokollformátumok protokollra jellemző címek
WSDL elemei 0. definition: a leírás neve, így kereshető 1. types: milyen típusok szerepelnek egyáltalán 2. message: be/ki egységek 3. portType: műveletek csoportja, átvitel-független operation: konkrét név, általában több is 4. binding: hogyan kapcsolódik a SOAP-hoz 5. service: kapuk csoportjának neve port: hol érhető el a szolgáltatás
WSDL fejléce <?xml version=“1.0” ?> <definitions name=“PriceCheck” targetNamespace= “http://host:port/axis/srv/PriceCheck” xmlns:pc= “http://host:port/axis/srv/PriceCheck/” xmlns:xsd=“http://www.w3c.org/2001/XMLSchema/” xmlns:soap= “http://schemas.xmlsoap.org/wsdl/soap/” xmlns= “http://schemas.xmlsoap.org/wsdl/” > alapértelmezett névtér
WSDL elemzése 1 2 3 4 5 ... <types> <xsd:element name=“price” type=“xsd:double” /> ... </types> <message name=“PriceCheckRequest”> <part name=“sku” type=“xsd:string” /> </message> <portType name=“PriceCheckPortType”> <operation name=“checkPrice” parameterOrder=“...”> <documentation>Szöveges dokumentáció</documentation> <input message=“pc:PriceCheckRequest” /> <binding name=“PriceCheckSOAPBinding” type=“pc:PriceCheckPortType”> <http:binding verb=”GET" /> <soap:binding ... <operation name =“checkPrice” ... <service name=“PriceCheckService”> <port name=“PriceCheck” binding=“pc:PriceCheckSOAPBinding”> <soap:address location=“http://host:port/axis/srv/PriceCheck”/> 1 2 3 4 5
Valós példa Irányítószám-helységnév findIrszamByHelyseg szolgáltatások (néhány) Vector findHelysegByIrszam (String irszam) Vector findIrszamByHelyseg (String helyseg) Vector getAllHelyseg () findIrszamByHelyseg ha értelmes a helységnév ha nem: hibajelzés (NO_SUCH_RECORD, …) Vácduka 2167 Budapest 1011,. . . 1239
Definició
Valós példa Kimenet kódolás Kimeneti példák definició elvileg Vector findIrszamByHelyseg (String helyseg) definició a valóságban HashMap findIrszamByHelyseg (String helyseg) Kimeneti példák o_result OK o_1 1011 o_2 1012 o_29 1239 o_result NO_SUCH_RECORD
Típusok
Üzenetek
Kapu és művelet
Összekötés az alsóbb szinttel
Szolgáltatás
WSDL bővítése Egyéb kapcsolási módok GET/POST használata SOAP (eddig) közvetlen web használata (GET v. POST) GET/POST használata elönyös a webes akcióknál http://www.xxx.hu/findIrszamByHelyseg?helyseg=“Budapest”
Webservice készítés Ingyenes rendszerek Apache-Axis http://ws.apache.org/axis/ TheMindElectric/GLUE http://www.themindelectric.com/glue/index.html
Webservice használata Használati formák Java programból természetes Windows-XP-ben már az Excel-ből is PERL interface van PHP interface van Központi karbantartás interface kidolgozása (pl. GUI formában)