2

I am doing a simple example to send a SOAP request in Qt. The attempt is to use QNetwork resources and send a SOAP request to fetch cities in a country.

http://www.webservicex.net/globalweather.asmx?op=GetCitiesByCountry .

Please help; what is missing out. Thanks for any pointers/inputs.

Build machine - Linux Debian

Qt version - 5.7

SSL - 1.0.2 available.

qDebug() << "Support SSL:  " << QSslSocket::supportsSsl()
         << "\nLib Version Number: " << QSslSocket::sslLibraryVersionNumber()
         << "\nLib Version String: " << QSslSocket::sslLibraryVersionString()
         << "\nLib Build Version Number: " << QSslSocket::sslLibraryBuildVersionNumber()
         << "\nLib Build Version String: " << QSslSocket::sslLibraryBuildVersionString();

OUTPUT

Support SSL:   true 
Lib Version Number:  268443855 
Lib Version String:  "OpenSSL 1.0.2l  25 May 2017" 
Lib Build Version Number:  268439647 
Lib Build Version String:  "OpenSSL 1.0.1e-fips 11 Feb 2013"

Error upon running the code

Network error:  QNetworkReply::NetworkError(ProtocolUnknownError)

CODE

#include <QObject>
#include <QtNetwork>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QNetworkAccessManager manager;

    QNetworkRequest request;

    //Set SOAP headers

    request.setRawHeader("POST", "/globalweather.asmx HTTP/1.1");
    request.setRawHeader("Content-Type", "text/xml;charset=UTF-8");
    request.setRawHeader("Content-Length", "1024");
    request.setRawHeader("SOAPAction", "http://www.webserviceX.NET/GetCitiesByCountry");
    //request.setRawHeader("Host", "www.webservicex.net");
    request.setUrl(QUrl("www.webservicex.net"));


    // Prepare SOAP request XML

    QString query =
    "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
    "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
    "<soap:Body>"
    "<GetCitiesByCountry xmlns=\"http://www.webserviceX.NET\">"
    "<CountryName>Australia</CountryName>"
    "</GetCitiesByCountry>"
    "</soap:Body>"
    "</soap:Envelope>";

    QNetworkReply* reply = manager.post(request, query.toUtf8());

    QEventLoop eventLoop;

    QObject::connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
    eventLoop.exec();

    if (reply->error() != QNetworkReply::NoError)    
        qDebug() << "Network error: " << reply->error();
    else    
        qDebug() << reply->readAll();    

    return app.exec();
 }

Resources referred

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
PaperMoon
  • 105
  • 8
  • Couldn't hurt to use Wireshark here to find out exactly what Qt is sending to the server. That said, SOAP is nearly two decades old. Modern code should be using RESTful web APIs. – MrEricSir Nov 06 '17 at 07:23

1 Answers1

1

Calling manager.post(request, query.toUtf8()); will overwrite your request.setRawHeader("POST", "/globalweather.asmx HTTP/1.1");

If you would like to use your custom headers and so on, use sendCustomRequest

Or set the correct Uri in QNetworkRequest and use this request in QNetworkAccessManager::post method.

    //request.setRawHeader("POST", "/globalweather.asmx HTTP/1.1");
    request.setRawHeader("Content-Type", "text/xml;charset=UTF-8");
    request.setRawHeader("Content-Length", "1024");
    request.setRawHeader("SOAPAction", "http://www.webserviceX.NET/GetCitiesByCountry");
    //request.setRawHeader("Host", "www.webservicex.net");
    request.setUrl(QUrl("http://www.webservicex.net/globalweather.asmx"));
Xplatforms
  • 2,102
  • 17
  • 26