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 werden

    Ebenso 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äß abgeschlossen

    Was 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 😉


Anmelden zum Antworten