Transcript SOAP

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á
– objektum bean-ként
Átvitel megoldása
Adó rendszer (mint web-kliens)
bean->XML
válaszXML ->
bean
XML-ben
a kérés
(HTTP request-ként)
XML-ben
a válasz
(HTTP response-ként)
XML->bean
Vevő rendszer (mint web-szerver)
válaszbean ->
XML
Működés
• Kérés egy Javabean-ben képződik
– 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 {
bean
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);
előállítása
ez jön létre!
FileOutputStream fileOut = new FileOutputStream(”output.xml");
JOXBeanOutputStream joxOut = new JOXBeanOutputStream(fileOut);
joxOut.writeObject("MarkTest", b);
}
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
URL dataURL = new URL(protocol, host, port, uri);
URLConnection connection = dataURL.openConnection();
• Request-készítés
ByteArrayOutputStream byteStream = ...;
byteStream.writeTo(connection.getOutputStream());
• Response-várás
BufferedReader in = new BufferedReader(
new InputStreamReader (connection.getInputStream()));
SOAP
Előzmények: WDDX
• Web Distribution Data Exchange
<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>
<field name=“source”>
<string>CNN</string>
</field>
</recordset>
</data>
</wddxPacket>
Előzmények: XML-RPC
<methodCall>
<methodName>NumberToText</methodname>
<params>
<param>
<value><i4>28</i4></value>
</param>
</params>
</methodCall>
<methodResponse>
<params>
<param>
<value><string>huszonnyolc</string></value>
</param>
</params>
</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
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: “”
HTTP header
HTTP body
<?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>
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: “”
HTTP header
HTTP body
<?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>
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
<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=”.../...” ...>
mindenképpen végrehajtandó!
...
</p:Priority>
...
</SOAP-ENV:Header>
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
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
igénylő
WS
ügynök
k é r é s
v á l a s z
webservice
megvalósító
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)
Általános szerkezet
• Szolgáltatás modell
kliens
Szolgáltatás
nyilvántartó
közzététel
Szolgáltató
Milyen szolgáltatást?
• Fő jellemzők
– 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ó
– 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
e_sum
o_age
1
2
54
o_age
o_annual
o_monthly
o_monthlyCheck
34
34560
2880
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
...
<types>
<xsd:element name=“price” type=“xsd:double” />
...
1
</types>
<message name=“PriceCheckRequest”>
<part name=“sku” type=“xsd:string” />
2
</message>
...
<portType name=“PriceCheckPortType”>
<operation name=“checkPrice” parameterOrder=“...”>
3
<documentation>Szöveges dokumentáció</documentation>
<input message=“pc:PriceCheckRequest” />
...
<binding name=“PriceCheckSOAPBinding” type=“pc:PriceCheckPortType”>
<http:binding verb=”GET" />
<soap:binding ...
4
<operation name =“checkPrice” ...
...
<service name=“PriceCheckService”>
<port name=“PriceCheck” binding=“pc:PriceCheckSOAPBinding”>
<soap:address location=“http://host:port/axis/srv/PriceCheck”/>
...
5
Valós példa
• Irányítószám-helységnév
– szolgáltatások (néhány)
• Vector findHelysegByIrszam (String irszam)
• Vector findIrszamByHelyseg (String helyseg)
• Vector getAllHelyseg ()
• findIrszamByHelyseg
– ha értelmes a helységnév
Vácduka
2167
Budapest
1011,. . . 1239
– ha nem: hibajelzés (NO_SUCH_RECORD, …)
Definició
Valós példa
• Kimenet kódolás
– definició elvileg
• Vector findIrszamByHelyseg (String helyseg)
– definició a valóságban
• HashMap findIrszamByHelyseg (String helyseg)
• Kimeneti példák
o_result
o_1
o_2
o_29
OK
1011
1012
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
– 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)