Frage zu QtSoap

Verschiedenes zu Qt
Antworten
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Frage zu QtSoap

Beitrag von guenni81 »

Hallo zusammen,
ich bin neu in Sachen Webservices mit QtSoap weshalb ich hier fragen wollte ob jemand hier so ne Art Tutorial dafür kennt. Hintergrund hierfür ist das ich mir einen SMSClient für die Webseite smstrade.de erstellen möchte.
Für zum testen der Schnittstelle bzw. mich damit ein wenig vertraut zu machen möchte ich einfach mal das Verfügbare guthaben abfragen, aber irgendwie möchte das noch nicht so wie ich das gerne hätte.

Momentan baue ich meine QtSoapMessage wie folgt zusammen:

Code: Alles auswählen

    QtSoapMessage request;
    request.setMethod(QtSoapQName("getAccountBalance", "urn:SMSTRADE"));
    request.addMethodArgument("key", "", "1234567890");

    http.setAction("urn:SMSTRADEAction");
    http.setHost("gateway.smstrade.de");
    http.submitRequest(request, "/soap/index.php?WSDL");
Vielleicht hat ja auch hier jemand nen kleinen Tipp für mich wie der Aufruf korrekt heißen muß.
Link zur Soap Schnittstelle:
https://gateway.smstrade.de/soap/?WSDL
https://gateway.smstrade.de/soap/
mfg
Günni
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

Vielleicht kann ja eventuell jemand mir anhand der Url http://ws.ticino.ch/systemManager?wsdl zeigen wie man hier die Funktion getEuroExchangeRate mittels QtSoap korrekt aufruft?!
mfg
Günni
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Bekomme eine Antwort. Allerdings mit Versionmismatch siehe FaultCode

Code: Alles auswählen

Error: XML parse error
Recv msg is: "<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
<SOAP-ENV:Body xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Fault xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<Faultcode xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">SOAP-ENV:VersionMismatch</Faultcode>
<Faultstring xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">XML parse error</Faultstring>
<SOAP-ENV:Faultdetail xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ParseError xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance">unexpected character at line 1, column 50</ParseError>
</SOAP-ENV:Faultdetail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Sorry hatte am falschen Port angeklopft..... lt dem Link musst am Port 80 anklopfen.... dann bekomme ichj nen SSL handshake failed!
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

AuE hat geschrieben:Sorry hatte am falschen Port angeklopft..... lt dem Link musst am Port 80 anklopfen.... dann bekomme ichj nen SSL handshake failed!
Hallo AuE,
hast du meinen Code oben verwendet um den Aufruf zu machen? Da stimmt der Key natürlich nicht da ich diesen nicht weitergeben darf da es sich hier um einen kostenpflichtigen Dienst handelt.
mfg
Günni
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Mein Code:

Code: Alles auswählen

 mst_httpTransporter = new QtSoapHttpTransport(this);

    connect( mst_httpTransporter, SIGNAL(responseReady()), this, SLOT(on_readSoapResponse()));


    mst_httpTransporter->setHost("gateway.smstrade.de", true,80);

    QtSoapMessage request;
      request.setMethod(QtSoapQName("getAccountBalance", "urn:SMSTRADE"));
      request.addMethodArgument("key", "", "1234567890");


      mst_httpTransporter->setAction("urn:SMSTRADEAction");
//       http.setHost("gateway.smstrade.de");
         mst_httpTransporter->submitRequest(request, "/soap/index.php?WSDL");

void Widget::on_readSoapResponse()
{
        qDebug() << "Respcecv";
        const QtSoapMessage &message = mst_httpTransporter->getResponse();

        // Check if the response is a SOAP Fault message
        if (message.isFault())
        {               
                qDebug("Error: %s",message.faultString().value().toString().toLatin1().constData());
                qDebug() << "Recv msg is:"<< message.toXmlString();
        }
        else
        {
                QtSoapStruct &m = (QtSoapStruct &) message.method();

                Q_ASSERT(m.count() != 0);
                QMap <QString, QString> stats;
                for (QtSoapStructIterator it(m); it.current(); ++it)
                {
                        QtSoapType *item = it.data();
                        stats.insert(item->name().name() , item->value().toString());
            //      qDebug() << item->name().name() <<   item->value().toString();
                }
        }
}

guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

@AuE
Danke dir mal für dieses kleine Beispiel.
Ich sehe ich muß mich da erst mal richtig mit der Materie beschäftigen damit ich überhaupt verstehe das mir so ne WSDL bietet. Was ein Webservice selbst ist, ist mir klar. Sieht so aus als wäre das ne Spannende Sache mit Webservices (+ WSDL) zu arbeiten. Da wird wohl noch ein wenig arbeit / lernen auf mich zukommen. :D
mfg
Günni
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

@AuE
Normalerweise sollte die Schnittstelle auch über http anstatt https funktionieren. Hier bekommst du ja den Versionmismatch als Fehlermeldung zurück. Ich schätze mal das die SOAP Schnittstelle das 1.2er Protokoll nutzt. Wäre natürlich schlecht, da ja QtSoap so wie ich das gesehen habe bis jetzt nur das 1.1er Protokoll unterstützt, oder lieg ich da falsch?
mfg
Günni
Raven24
Beiträge: 1
Registriert: 21. Oktober 2009 01:01

Beitrag von Raven24 »

Ah, sehr gut! Danke für das Codebeispiel.
Hat mir bei einem ähnlichen Problem geholfen!

Nur eines ist mir aufgefallen: Wenn es sich um ein QtSoapStruct handelt, sollte das doch von QtSoapType::value() returnt werden, ohne, dass man sich das händisch besorgen muss, oder interpretiere ich das falsch?
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

So, ich habs bestätigt bekommen, der SOAP Service nutzt das 1.2er Protokoll. Somit fällt QtSoap wohl für mich aus. Schade...
mfg
Günni
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

@Raven: Das Http Objekt hat 2 Signale für eine Antwort.

@guenni: Ich musste für meinen Fall https verwenden., Daher auch bei mir https. Kann sein das es bei ihm ohne geht. Das war lediglich als Bsp und nicht als Lösung gedacht!
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

@AuE
Kein Problem, wie gesagt, das Problem ist halt eher das die das SOAP Protokoll 1.2 nutzen und QtSoap nur 1.1 Unterstützt. Ne Alternative wäre halt gSOAP oder die http Schnittstelle direkt ansteuern. Ich hoffe mal das QtSoap in nächster Zeit SOAP 1.2 fähig wird, wobei ich eher davon ausgehe das dies noch ne gute Zeit dauern wird.
mfg
Günni
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Wenn Du die Möglichkeit hast mit irgendwas anderem die Verbindung zu testen, dann vergleiche doch was QtSoap über die Leitung schickt und was geschickt werden müsste.

Ich hatte mal einen ähnlichen Fall und da musste ich nur einen Namespace in der Init-Methode von QtSoapMessage anpassen, damit es funktioniert.
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

macman hat geschrieben:Wenn Du die Möglichkeit hast mit irgendwas anderem die Verbindung zu testen, dann vergleiche doch was QtSoap über die Leitung schickt und was geschickt werden müsste.

Ich hatte mal einen ähnlichen Fall und da musste ich nur einen Namespace in der Init-Methode von QtSoapMessage anpassen, damit es funktioniert.
Ich werde das ganze mal am Wochenende bzw. im laufe der nächsten Woche versuchen.
mfg
Günni
Antworten