美文网首页Qt填坑记录
Qt调用WebService,访问SOAP

Qt调用WebService,访问SOAP

作者: NoraNana | 来源:发表于2018-04-27 14:57 被阅读0次
    • 今天搞定了Qt访问SOAP。
    • 我用了最简单的方法:QNetworkAccessManager。代码如下:
    #include <QGuiApplication>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    int main(int argc, char *argv[])
    {
        QNetworkAccessManager *manager = new QNetworkAccessManager();
        QNetworkRequest req;
        req.setUrl(QUrl("http://192.168.4.133:8080/services/TestDemo"));
        req.setHeader(QNetworkRequest::ContentTypeHeader,("text/xml;charst=utf-8"));
        QString soapXML = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:exam='http://example/'><soapenv:Header/><soapenv:Body><exam:test/></soapenv:Body></soapenv:Envelope>" ;
        QNetworkReply *reply = manager->post(req,soapXML.toUtf8());
        QAbstractSocket::connect(reply,&QNetworkReply::finished,[=](){
            QString bytes =reply->readAll();
            qDebug()<< bytes;
        });
        QGuiApplication app(argc, argv);
        return app.exec();
    }
    

    返回结果:


    返回结果

    总结:

    • 刚开始,我没有加setHeader和XML值,返回的是测试地址的网页内容。
      (可能懂C++的都不会犯下边这两个错误吧?抱歉我是个外行。)
    • 之后加上setHeader()和XML值之后报错,原因是我把soap的值分好几行写了,字符串之间用"+"连接。就报了这样的错误:

    “invalid operands to binary expression ('const char * 'and 'const char *')”

    • 另一个是单双引号的问题:
    //正确的代码
    "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:exam='http://example/'>"
    
    //错误的代码
    '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:exam="http://example/">'
    

    新增读取值版本

    参考链接:https://stackoverflow.com/questions/17346237/qt5-c-qbytearray-xml-parser
    这个问答中包括了读取"标签值"和"属性值"两种方式。我需要用到的是读取标签值。

    1. 输入报文
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:malu="http://malu-robot.org">
       <soapenv:Header/>
       <soapenv:Body>
          <malu:test/>
       </soapenv:Body>
    </soapenv:Envelope>
    
    1. 输出报文
    <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
       <S:Body>
          <ns2:testResponse xmlns:ns2="http://malu-robot.org">
             <return>
                <resultCode>200</resultCode>
                <resultMessage>MaLu Soap-WebServices</resultMessage>
             </return>
          </ns2:testResponse>
       </S:Body>
    </S:Envelope>
    

    我获取了<result></result>中的"resultCode"和"resultMessage"标签的值。

    3.全部代码

    #include <QGuiApplication>
    #include <QNetworkAccessManager>
    #include <QNetworkRequest>
    #include <QNetworkReply>
    #include <QXmlStreamReader>
    #include <QJsonParseError>
    #include <QtXml/QDomDocument>
    #include <QtXml/qdom.h>
    #include <QDebug>
    int main(int argc, char *argv[])
    {
        QNetworkAccessManager *manager = new QNetworkAccessManager();
        QNetworkRequest req;
        req.setUrl(QUrl("http://192.168.4.133:8080/services/TestDemo"));
        req.setHeader(QNetworkRequest::ContentTypeHeader,("text/xml;charst=utf-8"));
        QString soapXML = "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:malu='http://malu-robot.org'><soapenv:Header/><soapenv:Body><malu:test/></soapenv:Body></soapenv:Envelope>" ;
        QNetworkReply *reply = manager->post(req,soapXML.toUtf8());
        QAbstractSocket::connect(reply,&QNetworkReply::finished,[=](){
            QByteArray bytes = reply->readAll();
            qDebug()<<bytes;
            QXmlStreamReader reader(bytes);
            while (!reader.atEnd())
            {
                if(reader.isStartElement())
                {
                    if(reader.name() == "resultCode")
                    {
                        reader.readNext();
                        if(reader.atEnd())
                        {
                            break;
                        }
                        if(reader.isCharacters())
                        {
                            QString resultCode = reader.text().toString();
                            qDebug()<<resultCode;
                        }
                    }
                    if(reader.name() == "resultMessage")
                    {
                        reader.readNext();
                        if(reader.atEnd())
                        {
                            break;
                        }
                        if(reader.isCharacters())
                        {
                            QString resultMessage = reader.text().toString();
                            qDebug()<<resultMessage;
                        }
                    }
                }
                reader.readNext();
            }
        });
        QGuiApplication app(argc, argv);
        return app.exec();
    }
    

    题外话:

    前几天,我在网上搜索到的方法看似有用的有几种,qtSoap非官方插件、gSoap等等,国内国外的经验几乎被我翻遍了,都没有找到行的通的例子。所以今天决定自己写,还真搞出来了。接下来该处理返回值了。
    不建议小白去尝试qtSoap和gSoap,像我一样浪费几天时间一个都没搞定。如果有能力可以搞qtSoap。

    相关文章

      网友评论

        本文标题:Qt调用WebService,访问SOAP

        本文链接:https://www.haomeiwen.com/subject/negblftx.html