pysimplesoap: pythonovský klient k webovej službe JAX-WS 2.0 [2013]

Inštalácia pysimplesoap

  1. Predpokladám, že máte nainštalovaný Python.
  2. Predpokladám, že máte nainštalované setuptools. Ak nie, urobte tak pomocou manuálu na stránke nástroja.
  3. V inštalačnom adresári Pythonu, v podadresári Scripts sa ocitol easy_install.exe
  4. Nainštalujte pip, obal nad setuptools, ktorý vylepšuje zopár vecí:

    c:\Programs\Python>easy_install pip
    
  5. 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 parameter Trace 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 dictov:

[
    {'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 })

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *