Topic: generare classi a partire da un WSDL  (Letto 3222 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
generare classi a partire da un WSDL
« il: Maggio 05, 2009, 22:50 »
Ciao,
c'è un WSDL che devo utilizzare, e volevo capire come fare con python.
Mi aspettavo di trovare facilemente un tool per la generazione automatica del codice python necessario per l'utilizzo del WSDL...
Ho trovato ZSI, ma vedo che ha bisogno di pyXML, che è un progetto fermo dal 2004 (!!!)
A quanto pare per utilizzare wsdl2py devo installare pyXML, per il quale è necessario python 2.4... che è un tantino vecchio.
Possibile che debba installare python 2.4 apposta?
Sempre che poi riesca a capire come installare ZSI, visto che la guida utente non spiega come installarlo...

Grazie :)

Offline masci

  • python sapiens
  • *
  • moderatore
  • Post: 684
  • Punti reputazione: 0
    • Mostra profilo
    • MasciBlog
Re: generare classi a partire da un WSDL
« Risposta #1 il: Maggio 05, 2009, 23:40 »
Possibile che debba installare python 2.4 apposta?
No  ;)

Sempre che poi riesca a capire come installare ZSI, visto che la guida utente non spiega come installarlo...

easy_install ZSI
...e sei a posto!
http://pypi.python.org/pypi/ZSI/

Testato con Python 2.5

Ciao

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
Re: generare classi a partire da un WSDL
« Risposta #2 il: Maggio 06, 2009, 16:07 »
Grazie, molto interessante questo easy_install! Praticamente un atp-get per python. Bello.
Però non riesco a installare ZSI...

Le ultime righe dell'output:
Processing PyXML-0.8.4.tar.gz
Running PyXML-0.8.4\setup.py -q bdist_egg --dist-dir c:\users\****\appdata\local
\temp\easy_install-av2kxo\PyXML-0.8.4\egg-dist-tmp-0fml_l
warning: no files found matching '*.html' under directory 'extensions\expat'
warning: no files found matching '*Makefile' under directory 'extensions\expat'
warning: no files found matching 'expat.*' under directory 'extensions\expat'
warning: no files found matching '*.dsp' under directory 'extensions\expat'
warning: no files found matching 'test_*' under directory 'test\output'
warning: no files found matching 'README' under directory 'demo'
warning: no previously-included files matching '*\CVS\*' found anywhere in distr
ibution
error: Setup script exited with error: Python was built with Visual Studio 2003;

extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

Ovviamente non ho Visual Studio 2003...
Sto installando su Python 2.5.1
« Ultima modifica: Maggio 06, 2009, 16:10 da guldo »

Offline masci

  • python sapiens
  • *
  • moderatore
  • Post: 684
  • Punti reputazione: 0
    • Mostra profilo
    • MasciBlog
Re: generare classi a partire da un WSDL
« Risposta #3 il: Maggio 06, 2009, 17:17 »
Ok, scusa non ti avevo chiesto la piattaforma...
Hai bisogno di una toolchain per fare le build di alcune estensioni, procedi così:

Installa mingw, lo trovi qui:
http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=240780&release_id=595197
Se non lo hai mai usato lascia tutti i passaggi dell'installer con i valori di default

Edita questo file (o crealo se non esiste)
C:\Python25\Lib\distutils\distutils.cfg
e aggiungi questo:
[build]
compiler = mingw32

A questo punto ritenta con easy_install ZSI

Facci sapere  ;)

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
Re: generare classi a partire da un WSDL
« Risposta #4 il: Maggio 06, 2009, 18:56 »
Ah, capisco, questo easy-install scarica i sorgenti e li compila. Pensavo scaricasse dei binari. Chiaro che ha bisogno di un compilatore.
Ho installato mingw, poi l'ho dovuto mettere nel PATH altrimenti non trovava gcc; ma poi in un attimo ho concluso e ho generato le classi dal WSDL. Ora devo solo provare a utilizzarle :)

Grazie davvero, sei stato gentilissimo :)

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
Re: generare classi a partire da un WSDL
« Risposta #5 il: Maggio 06, 2009, 22:18 »
Ops... è più complicato del previsto...
Non riesco nemmeno a importare il modulo creato... un import restituisce un trace di errori di migliaia di righe che termina con un bel:
RuntimeError: maximum recursion depth exceeded in cmp

Oppure, se cerco nel codice generato una certa classe, mi rendo conto che non ha il nome che mi aspettavo in base alla documentazione del web service; e soprattutto, un istanza di quella classe non ha due attributi che dovrebbe avere... Sono un po' perplesso...  :question:

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
Re: generare classi a partire da un WSDL
« Risposta #6 il: Maggio 08, 2009, 10:44 »
Ciao,
ho speso un po' di tempo per capire come funziona un WSDL. Comincio a orientarmici.
Vedo però che per utilizzare le classi generate da ZSI c'è un po' di lavoro da fare.
Ad esempio, diciamo che voglio fare un login; devo fare:
[hlpycode]loginPars = logonIn()
loginPars._name = "guldo"
loginPars._password = "123"
session = service.login(loginPars)[/hlpycode]

mentre in .NET sarebbe bastato un:
session = service.login("guldo", "123")

in python speravo almeno di poter fare:
[hlpycode]loginPars = logonIn("guldo", "123")
session = service.login(loginPars)[/hlpycode]
ma quel costruttore non accetta parametri.

E' giusto così, ed è così in generale, o c'è qualcosa che mi sfugge?
« Ultima modifica: Maggio 08, 2009, 10:51 da guldo »

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
Re: generare classi a partire da un WSDL
« Risposta #7 il: Maggio 10, 2009, 23:22 »
Mi sembra ci sia la possibilità che ZSI faccia fatica a gestire i tipi complessi, nel senso dei complexType definiti nel wsdl.
Lo dico perché nel momento in cui faccio:
GTD("uri", "complexTypeName", lazy=False)
questa chiamata, pur non andando in errore, restituisce None.

È un problema di ZSI, direi, dato che il medesimo WSDL funziona correttamente in .NET.

Che ne dite?

Offline guldo

  • python erectus
  • ***
  • Post: 111
  • Punti reputazione: 0
    • Mostra profilo
Risolto (Re: generare classi a partire da un WSDL)
« Risposta #8 il: Maggio 14, 2009, 21:46 »
Non ho capito esattamente come mai le classi generate da ZSI danno problemi.
Cmq ho fatto così: ho preso i due file generati, quello dei services e quello dei tipi, e ho commentato tutto; dopodiché ho de-commentato, uno per volta, tutti i metodi e i relativi tipi che mi servivano. Così riesco a fare quello che mi serve.

Per quanto riguarda l'esecuzione dei metodi, sì, ho visto che in generale le classi generate da ZSI funzionano così: ogni metodo ha come argomento un unico oggetto, il quale a sua volta avrà diversi attributi specifici. Capito come funziona, è molto semplice.