Tutorial über WSDL-Import
-
Hat da wer was zu?
habe mal ein bisschen probiert ob ich da was zu Stande bekomme.
Aber so wirklich weit bin ich da icht gekommen.
Hat da jemand Tutorials, Links oder ähnliches, die einem den umgang damit erklären?Oder kann mir den jemand von euch erklären?
Hätte auch ein wsdl-File im Internet zu Erklärung, das ich eh benutzen muss /will.
-
Ganz einfach: du suchst dir eine WSDL-Datei, erstellst ein neues Projekt, rufst den WSDL-Import-Wizard auf (Datei|Neu|Weitere...|C++Builder-Projekte|WebServices|WSDL-Import) und importierst damit deine Datei. Der Importer erstellt die benötigten Wrapperklassen und -interfaces. Für die Dokumentation der Parameter ist der Anbieter des SOAP-Interfaces verantwortlich, die Benutzung der Wrapperklassen sollte selbsterklärend sein. Dazu lies dir einfach mal den generierten Code durch.
-
ich habe das mal getestet, allerdings kommen da dutzende Fehlermeldungen hoch.
Hier mal der durch den WSDL-Import generierte Code:
Header-Datei:
// ************************************************************************ // // Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus // unten beschriebener WSDL-Datei stammen: // WSDL : http://www.oilimperium.eu/interface/oi_4players_01.wsdl // Codegen : [wfUseSerializerClassForAttrs-] // Version : 1.0// (13.12.2008 15:51:31 - - $Rev: 7300 $) // ************************************************************************ // #ifndef oi_4players_01H #define oi_4players_01H #include <System.hpp> #include <InvokeRegistry.hpp> #include <XSBuiltIns.hpp> #include <SOAPHTTPClient.hpp> #if !defined(SOAP_REMOTABLE_CLASS) #define SOAP_REMOTABLE_CLASS __declspec(delphiclass) #endif namespace NS_oi_4players_01 { // ************************************************************************ // // Die folgenden Typen, auf die im WSDL-Dokument Bezug genommen wird, sind in dieser Datei // nicht repräsentiert. Sie sind entweder Aliase(@) anderer repräsentierter Typen oder auf sie wurde Bezug genommen, // aber in diesem Dokument nicht deklariert (!). Die Typen aus letzterer Kategorie // sind normalerweise mit vordefinierten/bekannten XML- oder Borland-Typen verbunden; sie könnten aber auch ein Anzeichen // für ein falsches WSDL-Dokument sein, das einen Schema-Typ nicht deklariert oder importiert..// ************************************************************************ // // !:int - "http://www.w3.org/2001/XMLSchema"[] // !:oilArray - "urn:OilImperium"[] // !:string - "http://www.w3.org/2001/XMLSchema"[] // !:oilArray - "http://www.w3.org/2001/XMLSchema"[] // !:boolean - "http://www.w3.org/2001/XMLSchema"[] // ************************************************************************ // // Namespace : urn:OilImperium // soapAction: urn:OilImperiumAction // Transport : http://schemas.xmlsoap.org/soap/http // Stil : rpc // Bindung : OilImperiumBinding // Service : OilImperiumService // Port : OilImperiumPort // URL : http://www.oilimperium.eu/interface/soap_oi.php // ************************************************************************ // __interface INTERFACE_UUID("{532CF571-D61A-2560-F5DC-80AEAD0F06D2}") OilImperiumPort : public IInvokable { public: virtual oilArray getOilPrice(const int code) = 0; virtual oilArray getUserOnline() = 0; virtual int getCorporateGroupBalance(const int kid, const WideString code) = 0; virtual oilArray getCorporateGroupLevel(const int kid, const WideString code, const int typ) = 0; virtual oilArray getCorporateGroupStock(const int kid, const WideString code, const int typ) = 0; virtual oilArray getCorporateGroupContractsIn(const int kid, const WideString code, const int time) = 0; virtual oilArray getCorporateGroupMember(const int kid, const WideString code, const bool typ) = 0; virtual oilArray getCorporateGroupTransfer(const int kid, const WideString code, const int io, const int typ, const int time) = 0; }; typedef DelphiInterface<OilImperiumPort> _di_OilImperiumPort; _di_OilImperiumPort GetOilImperiumPort(bool useWSDL=false, AnsiString addr="", THTTPRIO* HTTPRIO=0); }; // NS_oi_4players_01 #if !defined(NO_IMPLICIT_NAMESPACE_USE) using namespace NS_oi_4players_01; #endif #endif // oi_4players_01H
und hier die cpp:
// ************************************************************************ // // Die in dieser Datei deklarierten Typen wurden aus Daten generiert, die aus // unten beschriebener WSDL-Datei stammen: // WSDL : http://www.oilimperium.eu/interface/oi_4players_01.wsdl // Codegen : [wfUseSerializerClassForAttrs-] // Version : 1.0// (13.12.2008 15:51:31 - - $Rev: 7300 $) // ************************************************************************ // #include <vcl.h> #pragma hdrstop #if !defined(oi_4players_01H) #include "oi_4players_01.h" #endif namespace NS_oi_4players_01 { _di_OilImperiumPort GetOilImperiumPort(bool useWSDL, AnsiString addr, THTTPRIO* HTTPRIO) { static const char* defWSDL= "http://www.oilimperium.eu/interface/oi_4players_01.wsdl"; static const char* defURL = "http://www.oilimperium.eu/interface/soap_oi.php"; static const char* defSvc = "OilImperiumService"; static const char* defPrt = "OilImperiumPort"; if (addr=="") addr = useWSDL ? defWSDL : defURL; THTTPRIO* rio = HTTPRIO ? HTTPRIO : new THTTPRIO(0); if (useWSDL) { rio->WSDLLocation = addr; rio->Service = defSvc; rio->Port = defPrt; } else { rio->URL = addr; } _di_OilImperiumPort service; rio->QueryInterface(service); if (!service && !HTTPRIO) delete rio; return service; } // ************************************************************************ // // Diese Routine registriert die Interfaces und Typen, die durch den Aufruf des SOAP-Service// verwendet werden. // ************************************************************************ // static void RegTypes() { /* OilImperiumPort */ InvRegistry()->RegisterInterface(__interfaceTypeinfo(OilImperiumPort), L"urn:OilImperium", L""); InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(OilImperiumPort), L"urn:OilImperiumAction"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getOilPrice", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getUserOnline", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getCorporateGroupBalance", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getCorporateGroupLevel", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getCorporateGroupStock", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getCorporateGroupContractsIn", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getCorporateGroupMember", "return_", L"return"); InvRegistry()->RegisterExternalParamName(__interfaceTypeinfo(OilImperiumPort), "getCorporateGroupTransfer", "return_", L"return"); } #pragma startup RegTypes 32 }; // NS_oi_4players_01
In meinem Projekt habe ich die header-Datei eingebunden und mit
NS_oi_4players_01 *OI; OI = new NS_oi_4players_01();
ins Programm aufgenommen.
Wenn ich nun compilieren will, kommt diese Fehlermeldung:
[BCC32 Fehler] oi_4players_01.h(50): E2462 'virtual' kann nur für Nicht-Template-Elementfunktionen verwendet werdenEbenso kennt C++ kein OilArray, also habe ich diese Arrays durch int[] oder String[] ersetzt.
Dann kommt folgender feundliche Hinweis ohne obigen Fehler:
[BCC32 Fehler] oi_4players_01.h(50): E2040 Deklaration nicht ordnungsgemäß abgeschlossenWas ist da nun noch zu tun?
-
Lies die WSDL-Datei. Darin steht:
<xsd:simpleType name="oilArray" base="string"> <xsd:element name="ArrayOfoilArrays"> <xsd:complexType base="SOAP-ENC:Array"> <xsd:element name="oilArray" type="string" minOccurs="0" maxOccurs="unbounded"/> </xsd:complexType> </xsd:element> </xsd:simpleType>
Offenbar ist mit oilArray ein String-Array gemeint.
Wenn du also vor der Interface-Deklaration
typedef DynamicArray <String> oilArray;
einfügst, wird der Wrapper anstandslos kompiliert.
Padde85 schrieb:
In meinem Projekt habe ich die header-Datei eingebunden und mit
NS_oi_4players_01 *OI; OI = new NS_oi_4players_01();
ins Programm aufgenommen.
Ein Zeiger auf einen Namespace?
_di_OilImperiumPort oip = GetOilImperiumPort ();
-
supi danke dir
Habe bisher nicht mit Namespaces gearbeitet, daher dachte ich, das würde wie mit Klassen gehandhabt
Daher danke für die kleine Info