SOAP in C++ (openligadb)



  • Hallo,

    bin neu in der C++ Welt und würde gerne wissen, wie man z.B. gSOAP nutzt.
    Da ich am besten aus Beispielen lerne, wäre ich für ein Beispiel mit openligadb sehr dankbar.

    Eventuell zur 1. Bundesliga, den aktuellen Spieltag zu bekommen (GetCurrentGroupOrderID).

    Was mir ziemlich wichtig ist, dass das Ganze unter Windows UND Linux funktioniert, da ich unter Linux programmiere und der Endnutzer Windows besitzt.

    Ich bin nun wie folgt vorgegangen:
    wsdl2h -o sportsdata.h http://www.openligadb.de/Webservices/Sportsdata.asmx?WSDL
    soapcpp2 -i -I/usr/share/gsoap/import sportsdata.h ausgeführt

    Nun erstellt der zweite Befehl unmengen von Dateien (geht das nicht auch anders?).
    Das ist nun so unübersichtlich, dass ich nicht weiß, wie ich jetzt diese Dateien nutze, um den aktuellen Spieltag der 1. Bundesliga bekomme.

    Ist zur Zeit zwar überflüssig, da die BuLi noch nicht wieder losging, aber es geht mir nun erstmal rein um die Nutzung.

    Das hier funktioniert jedenfalls nicht:

    #include "soapSportsdataSoap12Proxy.h"
    #include "SportsdataSoap12.nsmap"
    
    int main()
    {
      int matchday;
      SportsdataSoap12Proxy sportsdata();
      sportsdata.GetCurrentGroupOrderID( "bl1", matchday );
      std::cout << "Spieltag: " << matchday << std::endl;
      return 0;
    }
    

    Dann bekomme ich vom Compiler (g++ -o test *.cpp):

    main.cpp: In Funktion »int main()«:
    main.cpp:8:14: Fehler: Abfrage des Elementes »GetCurrentGroupOrderID« in »sportsdata«, das vom Nicht-Klassentyp »SportsdataSoap12Proxy()« ist

    Mit freundlichen Grüßen
    Danny.



  • Du bist da auf einen klassischen C++ Fehler hereingefallen - sportsdate ist kein default-konstruiertes Objekt, sondern eine Funktionsdeklaration. Wenn du dort die Klammern weglässt, sollte eigentlich etwas brauchbares herauskommen.



  • Ah, danke.
    Nun bekomme ich andere Fehlermeldungen:

    main.cpp: In Funktion »int main()«:
    main.cpp:8:54: Fehler: keine passende Funktion für Aufruf von »SportsdataSoap12Proxy::GetCurrentGroupOrderID(const char [4], int&)«
    main.cpp:8:54: Anmerkung: Kandidat ist:
    soapSportsdataSoap12Proxy.h:59:14: Anmerkung: virtual int SportsdataSoap12Proxy::GetCurrentGroupOrderID(_ns1__GetCurrentGroupOrderID*, _ns1__GetCurrentGroupOrderIDResponse*)
    soapSportsdataSoap12Proxy.h:59:14: Anmerkung: no known conversion for argument 1 from »const char [4]« to »_ns1__GetCurrentGroupOrderID*«

    Ich verstehe zwar den Grund dieser Meldungen, weiß aber nun nicht, wie ich aus "bl1" ein _ns1__GetCurrentGroupOrderID* mache...

    Und wie ist das mit den vielen Dateien?



  • Dann solltes du dir die Parameter der Funktion mal auf der Website der Hersteller ansehen.



  • Hier wird in C# auch ein String verwendet:
    http://www.openligadb.de/Samples

    Und als Parameter wird nur die Liga (bl1) erwartet:
    http://www.openligadb.de/Webservices/Sportsdata.asmx?op=GetCurrentGroupOrderID

    EDIT: Ich habe mir nun das Ganze nochmal genauer angeschaut und bin nun bei folgendem Code:

    #include "stdio.h"
    #include "soapH.h"
    #include "SportsdataSoap12.nsmap"
    
    int main()
    {
      struct soap soap;
      soap_init(&soap);
    
      struct _ns1__GetCurrentGroupOrderID req = { "bl1" };
      struct _ns1__GetCurrentGroupOrderIDResponse resp;
    
      if ( soap_call___ns3__GetCurrentGroupOrderID( &soap, NULL, NULL, &req, &resp ) == SOAP_OK )
      {
        printf( "matchday: %d\n", resp.GetCurrentGroupOrderIDResult );
      }
      else
      {
        soap_print_fault( &soap, stderr );
      }
    
      soap_destroy( &soap );
      soap_end( &soap );
      soap_done( &soap );
    
      return 0;
    }
    

    Nun bekomme ich folgende Fehlermeldungen: http://pastebin.com/nePkS0MV
    Kompiliert habe ich mittels: g++ -I/usr/share/gsoap/import -o test main.cpp soapC.c soapClient.c



  • Da hast Du vergessen, die stdsoap2.cpp mit zu übersetzen.



  • Hm, ich habe keine stdsoap2.cpp.
    Finde zumindest keine, weder mit "locate stdsoap2.cpp" noch mit "yum whatprovides */stdsoap2.cpp"

    EDIT: stdsoap2.h habe ich aber gefunden (in /usr/include)



  • Die wird normalerweise vom Generator ausgespruckt, wenn Du die Quellen generierst. Aber vielleicht liegt GSOAP bei Dir auch als Bibliothek vor? Dann musst Du diese noch dazulinken.

    Oder hast Du die Quellen als C-Source generiert? Dann müsste eine stdsoap2.c vorliegen, die mit übersetzt werden muss. Dann solltest Du Deinen Quelltext aber auch als .c übersetzen, da es in GSOAP einige Schwierigkeiten bei der Mischung von C und C++ Code gibt.



  • Das sind die Dateien, die von wsdl2h und soapcpp2 generiert wurden:

    soapC.cpp
    soapH.h
    soapSportsdataSoap12Proxy.cpp
    soapSportsdataSoap12Proxy.h
    soapSportsdataSoap12Service.cpp
    soapSportsdataSoap12Service.h
    soapSportsdataSoapProxy.cpp
    soapSportsdataSoapProxy.h
    soapSportsdataSoapService.cpp
    soapSportsdataSoapService.h
    soapStub.h
    sportsdata.h
    SportsdataSoap12.GetAvailGroups.req.xml
    SportsdataSoap12.GetAvailGroups.res.xml
    SportsdataSoap12.GetAvailLeaguesBySports.req.xml
    SportsdataSoap12.GetAvailLeaguesBySports.res.xml
    SportsdataSoap12.GetAvailLeagues.req.xml
    SportsdataSoap12.GetAvailLeagues.res.xml
    SportsdataSoap12.GetAvailSports.req.xml
    SportsdataSoap12.GetAvailSports.res.xml
    SportsdataSoap12.GetCurrentGroupOrderID.req.xml
    SportsdataSoap12.GetCurrentGroupOrderID.res.xml
    SportsdataSoap12.GetCurrentGroup.req.xml
    SportsdataSoap12.GetCurrentGroup.res.xml
    SportsdataSoap12.GetFusballdaten.req.xml
    SportsdataSoap12.GetFusballdaten.res.xml
    SportsdataSoap12.GetGoalGettersByLeagueSaison.req.xml
    SportsdataSoap12.GetGoalGettersByLeagueSaison.res.xml
    SportsdataSoap12.GetGoalsByLeagueSaison.req.xml
    SportsdataSoap12.GetGoalsByLeagueSaison.res.xml
    SportsdataSoap12.GetGoalsByMatch.req.xml
    SportsdataSoap12.GetGoalsByMatch.res.xml
    SportsdataSoap12.GetLastChangeDateByGroupLeagueSaison.req.xml
    SportsdataSoap12.GetLastChangeDateByGroupLeagueSaison.res.xml
    SportsdataSoap12.GetLastChangeDateByLeagueSaison.req.xml
    SportsdataSoap12.GetLastChangeDateByLeagueSaison.res.xml
    SportsdataSoap12.GetLastMatch.req.xml
    SportsdataSoap12.GetLastMatch.res.xml
    SportsdataSoap12.GetMatchByMatchID.req.xml
    SportsdataSoap12.GetMatchByMatchID.res.xml
    SportsdataSoap12.GetMatchdataByGroupLeagueSaisonJSON.req.xml
    SportsdataSoap12.GetMatchdataByGroupLeagueSaisonJSON.res.xml
    SportsdataSoap12.GetMatchdataByGroupLeagueSaison.req.xml
    SportsdataSoap12.GetMatchdataByGroupLeagueSaison.res.xml
    SportsdataSoap12.GetMatchdataByLeagueDateTime.req.xml
    SportsdataSoap12.GetMatchdataByLeagueDateTime.res.xml
    SportsdataSoap12.GetMatchdataByLeagueSaison.req.xml
    SportsdataSoap12.GetMatchdataByLeagueSaison.res.xml
    SportsdataSoap12.GetMatchdataByTeams.req.xml
    SportsdataSoap12.GetMatchdataByTeams.res.xml
    SportsdataSoap12.GetNextMatch.req.xml
    SportsdataSoap12.GetNextMatch.res.xml
    SportsdataSoap12.GetTeamsByLeagueSaison.req.xml
    SportsdataSoap12.GetTeamsByLeagueSaison.res.xml
    SportsdataSoap12.nsmap
    SportsdataSoap.GetAvailGroups.req.xml
    SportsdataSoap.GetAvailGroups.res.xml
    SportsdataSoap.GetAvailLeaguesBySports.req.xml
    SportsdataSoap.GetAvailLeaguesBySports.res.xml
    SportsdataSoap.GetAvailLeagues.req.xml
    SportsdataSoap.GetAvailLeagues.res.xml
    SportsdataSoap.GetAvailSports.req.xml
    SportsdataSoap.GetAvailSports.res.xml
    SportsdataSoap.GetCurrentGroupOrderID.req.xml
    SportsdataSoap.GetCurrentGroupOrderID.res.xml
    SportsdataSoap.GetCurrentGroup.req.xml
    SportsdataSoap.GetCurrentGroup.res.xml
    SportsdataSoap.GetFusballdaten.req.xml
    SportsdataSoap.GetFusballdaten.res.xml
    SportsdataSoap.GetGoalGettersByLeagueSaison.req.xml
    SportsdataSoap.GetGoalGettersByLeagueSaison.res.xml
    SportsdataSoap.GetGoalsByLeagueSaison.req.xml
    SportsdataSoap.GetGoalsByLeagueSaison.res.xml
    SportsdataSoap.GetGoalsByMatch.req.xml
    SportsdataSoap.GetGoalsByMatch.res.xml
    SportsdataSoap.GetLastChangeDateByGroupLeagueSaison.req.xml
    SportsdataSoap.GetLastChangeDateByGroupLeagueSaison.res.xml
    SportsdataSoap.GetLastChangeDateByLeagueSaison.req.xml
    SportsdataSoap.GetLastChangeDateByLeagueSaison.res.xml
    SportsdataSoap.GetLastMatch.req.xml
    SportsdataSoap.GetLastMatch.res.xml
    SportsdataSoap.GetMatchByMatchID.req.xml
    SportsdataSoap.GetMatchByMatchID.res.xml
    SportsdataSoap.GetMatchdataByGroupLeagueSaisonJSON.req.xml
    SportsdataSoap.GetMatchdataByGroupLeagueSaisonJSON.res.xml
    SportsdataSoap.GetMatchdataByGroupLeagueSaison.req.xml
    SportsdataSoap.GetMatchdataByGroupLeagueSaison.res.xml
    SportsdataSoap.GetMatchdataByLeagueDateTime.req.xml
    SportsdataSoap.GetMatchdataByLeagueDateTime.res.xml
    SportsdataSoap.GetMatchdataByLeagueSaison.req.xml
    SportsdataSoap.GetMatchdataByLeagueSaison.res.xml
    SportsdataSoap.GetMatchdataByTeams.req.xml
    SportsdataSoap.GetMatchdataByTeams.res.xml
    SportsdataSoap.GetNextMatch.req.xml
    SportsdataSoap.GetNextMatch.res.xml
    SportsdataSoap.GetTeamsByLeagueSaison.req.xml
    SportsdataSoap.GetTeamsByLeagueSaison.res.xml
    SportsdataSoap.nsmap
    

    Da ist weder eine stdsoap2.c noch eine stdsoap2.cpp dabei 😞
    Aber den Code habe ich ohne -c also als C++ Code generieren lassen...



  • Hm, ich habe mich vertan, die stdsoap2.c[pp] wird nicht vom Generator ausgespruckt, sie ist Bestandteil von GSOAP. Jedenfalls unter Windows. Bei Dir wird, da GSOAP unter /usr installiert ist, wohl eher eine Bibliothek dazugehören.



  • Korrekt 🙂
    locate libgsoap
    /usr/lib64/libgsoap++.so

    Danke, ein g++ -lgsoap++ -o test main.cpp soapSportsdataSoap12Proxy.cpp soapC.cpp
    Hat nun endlich funktioniert 🙂


Anmelden zum Antworten