Inštalácia pysimplesoap
- Predpokladám, že máte nainštalovaný Python.
- Predpokladám, že máte nainštalované
setuptools
. Ak nie, urobte tak pomocou manuálu na stránke nástroja. - V inštalačnom adresári Pythonu, v podadresári
Scripts
sa ocitoleasy_install.exe
Nainštalujte
pip
, obal nadsetuptools
, ktorý vylepšuje zopár vecí:c:\Programs\Python>easy_install pip
Nainštalujte
pysimplesoap
, SOAPový klient. K novembru 2013 sa v repozitári nachádza verzia 1.10, ktorá je ale, voľne povedané, v rozbombardovanom stave. (Spoznáte ju podľa toho, že parameterTrace
v ukážkach nižšie neexistuje.) Radšej nainštalujme vývojovú verziu priamo z Gitu:pip install https://github.com/pysimplesoap/pysimplesoap/archive/6a98ccaf81e9951f42f8eb748f4a118b3e4e8394.zip
Ukážkový server [JAX-WS 2.0]
Ukážkový server v Jave:
@WebService
public class ChocolateService {
private List<Chocolate> chocolates = new CopyOnWriteArrayList<Chocolate>();
public ChocolateService() {
chocolates.add(new Chocolate(1L, "Lindt Excellence 70%", 70));
chocolates.add(new Chocolate(2L, "Milka Alpenmilch", 40));
chocolates.add(new Chocolate(3L, "Christmas Angel Figure", 15));
}
public List<Chocolate> list() {
return chocolates;
}
public void add(Chocolate chocolate) {
System.out.println(chocolate);
this.chocolates.add(chocolate);
}
}
Vypublikujeme ho cez:
Endpoint.publish("http://localhost:10000/ws/chocolate", new ChocolateService());
Ukážkový klient [Python]
Jednoduchý klient môže vyzerať nasledovne:
from pysimplesoap.client import SoapClient
client = SoapClient(wsdl="http://localhost:10000/ws/chocolates?wsdl", soap_server="oracle")
vysledok = client.list();
print vysledok
Vytvoríme inštanciu triedy SoapClient
, do ktorej uvedieme cestu k WSDL súboru. Zároveň nastavíme špecifický parameter soap_server, ktorým prispôsobíme klienta Java serveru.
Ak vynecháme parameter soap_server, použije sa štandardné správanie, ktoré povedie k hláškam
SoapFault: S:Client: Cannot find dispatch method for {}
Príčinou je telo odchádzajúcej správy
<soap:Body>
</soap:Body>
Áno, naozaj vo vnútri nič nie je a preto úbohý JAX-WS netuší, ktorú metódu spustiť.
Výsledkom je dict
dict
ov:
[
{'return': {'percentage': 70, 'id': 1L, 'title': u'Lindt Excellence 70%'}},
{'return': {'percentage': 40, 'id': 2L, 'title': u'Milka Alpenmilch'}},
{'return': {'percentage': 15, 'id': 3L, 'title': u'Christmas Angel Figure'}}
]
K prvému prvku sa vieme teda dostať cez
vysledok[0]["return"]
Dôležité sú tri zádrhele:
Zapnite traceovanie
Je viac než vhodné si zapnúť traceovanie, teda výpis odchádzajúcich a prichádzajúcich správ; aspoň bude vidieť, čo sa deje na drôte. Zaveďme ho pomocou parametra trace
s hodnotou True
.
client = SoapClient(wsdl="http://localhost:10000/ws/chocolates?wsdl", soap_server="oracle", trace=True)
Ak chceme vidieť trasovanie správ po drôte aj na serveri, môžeme pred publikovaním zaviesť do metódy main()
:
System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
Vysvetlenie možno nájsť na StackOverflow.com.
Ukážkový klient 2
Pythonovský klient podporuje aj komplexné typy, a to cez slovníky dict
:
chocolate = { "title": "Lindt", "percentage": 70 }
client.add(arg0 = chocolate)
Parameter arg0
vyzerá čudesne, ale zodpovedá WSDL vygenerovanému z našej triedy. Java generátor WSDL totiž zoberie metódu
public void add(Chocolate chocolate)
a do WSDL uvedie prvý parameter ako arg0
(ďalšie by sa volali arg1
, atď). Toto správanie môžeme zmeniť anotáciou:
public void add(@WebParam(name="chocolate") Chocolate chocolate)
Prirodzene, musíme upraviť aj klienta v Pythone:
client.add(chocolate = { "title": "Lindt", "percentage": 70 })