Blog

Consumare i Webservices di Delphi Prism (Oxygene) con Delphi7 Win32

In questo articolo illustrerò brevemente gli strumenti utilizzati, un pò di storia
e la soluzione al problema nato utilizzando Delphi7 in combinazione con Prism.

Il client del webservice è sviluppato in Delphi:

Delphi è un ambiente di sviluppo software per applicazioni Microsoft Windows (Win32),
sviluppato originariamente da Borland e ora di proprietà  della Embarcadero Technologies.
Delphi 7, pubblicato nell’oramai lontano 2002, divenne la versione standard
perchè utilizzato dal maggior numero di sviluppatori rispetto a qualsiasi altra versione.

E’ noto a causa della sua ottima stabilità , velocità  e bassi requisiti hardware
e rimane largamente utilizzato ancora oggi (da me, per esempio).
Il linguaggio di programmazione Delphi è semplicemente un dialetto di Object Pascal.

Mentre il Webservice è stato creato con Prism:

Delphi Prism è un RAD per Microsoft .NET Framework e Mono, integrato all’interno di Microsoft Visual Studio e MonoDevelop;
sviluppato da RemObjects Software e distribuito dalla Embarcadero Technologies, si basa sul linguaggio Oxygene ed il relativo compilatore.

Oxygene è un linguaggio di programmazione per il Common Language Infrastructure;
Object Pascal-based e fortemente ispirato da C#, è progettato per sfruttare tutte le funzionalità  e le tecnologie fornite dal .NET runtime.

Anche se si seguono alla lettera gli esempi per la creazione del servizio Web in Prism
e per la creazione del client in Delphi Win32, indipendentemente da quel che si prova,
per tutte le chiamate sia i parametri che il result del metodo saranno sempre valorizzati a 0, stringa vuota, oppure nil.

Ciò è dovuto al fatto che il servizio Web è implementato su .NET 2.0, che ha cambiato il modo in cui il WSDL è pubblicato rispetto a .NET 1.1 ;
il perchè di questo cambiamento si può comprendere solo con un po’ di storia:

E’ risaputo che le specifiche dello standard dei Web Services (WSDL) lasciano un alto grado di libertà ; ciò ha portato le varie case produttrici di software ad interpretarle diversamente creando in alcuni casi prodotti non interoperabili.

WS-I (Web Services Integration Organization): è un’organizzazione formata da diversi produttori del calibro di HP, IBM, Microsoft, Oracle, Sun Microsystem etc.. che si sono uniti per assicurare l’interoperabilità  dei servizi Web tra tutte le piattaforme.

Per fare ciò, hanno creato una raccomandazione denominata Basic Profile 1.0, che definisce un insieme di regole per l’utilizzo di XML, SOAP, e WSDL al fine di creare servizi Web interoperabili; restringendo le sovrabbondanti capacità  espressive di SOAP e individuando un set minimo di caratteristiche comunemente supportate.

Di base i Web Service .Net usano il binding document/literal, mentre con .NET 1.x questo stile viene specificato utilizzando l’elemento <binding/> e viene riconosciuto correttamente dal WSDL Importer, con .NET 2.0 che è WS-I Basic Profile compliant lo stile è definito solo all’interno dei nodi operation/input e operation/output;

La raccomandazione del WS-I è però stata pubblicata solo nel 2004, ben due anni dopo il rilascio di Delphi 7,
per questo il WSDL Importer non è in grado di riconoscere questa seconda modalità ;
di conseguenza la unit viene generata utilizzando il binding di tipo RPC (il default per Delphi) al posto del binding document/literal.

Ecco spiegato il perchè della variazione nello stile di pubblicazione del webservice,
ed anche perchè Delphi 7 non genera correttamente la unit.

L’unica soluzione disponibile attualmente è quella di specificare manualmente il tipo di binding SOAP come segue:

Dove “MySoapInterface” è il nome del tipo di interfaccia SOAP generata.

Questa riga di codice deve essere aggiunta in coda alla unit generata dall’WSDL Importer,
questo farà  in modo che i parametri ed il result siano valorizzati correttamente.

NB: inseritela nella sezione “initialization” come nell’esempio:

CodeGear/Embarcadero sembra essere a conoscenza della situazione; si dice stia lavorando ad un fix,
anche se per il momento non se ne hanno notizie…

Fonte del fix
Approfondimento sugli stili dei Binding
Definizioni di WS-I e WS-I Basic Profile da Wikipedia.

One comment on “Consumare i Webservices di Delphi Prism (Oxygene) con Delphi7 Win32

Comments are closed.

Scoprite cosa possiamo fare per il vostro business
Tecnologie e Partner