• Qt+gsoap调用WebService


    1.       前言

    Qt本身给我们提供了调用WebService的解决方案qsoap,看了一下他的介绍,感觉实在是太弱了,而且又是个新出的东西,所以还是决定不用他。既然使用Qt,那当然是跨平台的解决方案才合适,显示MS的SoapToolKit也不在选择的范围。于是改用老牌的gsoap。

    2.       环境

    Qt版本:

    Qt4.6(其他版本也适合)

    GSOAP版本:

    gsoap2.7.12(其他版本也适用)

    服务端开发环境:

    VS2008、C#、.net2.0以上

    3.       准备

    http://sourceforge.net/projects/gsoap2下载gsoap,然后解压,并把

    gsoap-2.7/gsoap/bin/win32设置到系统的Path中去。

    4.       服务端

    打开VS2008,建立WebService工程。全部采用默认设置就可以了。

    最后修改一下代码,加上点中文。如下:

    namespace WebService1

    {

        /// <summary>

        /// Service1 的摘要说明

        /// </summary>

        [WebService(Namespace = "http://tempuri.org/")]

        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

        [ToolboxItem(false)]

        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。

        // [System.Web.Script.Services.ScriptService]

        public class Service1 : System.Web.Services.WebService

        {

     

            [WebMethod]

            public string HelloWorld()

            {

                return "Hello World你好";

            }

        }

    }

    5.       客户端

    l         建立文件夹client/gsoap。并把gsoap-2.7/gsoap/下的stdsoap2.cpp和stdsoap2.h拷贝至刚刚建立的gsoap文件夹下。

    l         打开命令行,cd C:/WSTest/client/gsoap,然后执行:

    wsdl2h -I"E:/gsoap/source/gsoap-2.7/gsoap/WS" -o test.h http://localhost:5925/Service1.asmx?WSDL

    该操作将生成C:/WSTest/client/gsoap/test.h

    l         执行soapcpp2 -I"E:/gsoap/source/gsoap-2.7/gsoap/import" test.h

    l         然后我们编写test.cpp

    #include <QApplication>

    #include <QPushButton>

    #include <QLineEdit>

    #include <QHBoxLayout>

    #include <QDialog>

    #include "gsoap/Service1Soap.nsmap"

    #include "gsoap/soapService1SoapProxy.h"

    class MyDialog:public QDialog

    {

         Q_OBJECT

    public: 

         MyDialog(QWidget *parent=0):QDialog(parent)

         {

             btn =new QPushButton("invoke");

             line = new QLineEdit;

             connect(btn,SIGNAL(clicked()),this,SLOT(OnClicked()));

             QHBoxLayout *layout = new QHBoxLayout;

             layout->addWidget(line);

             layout->addWidget(btn);

             setLayout(layout);

         }

    private:

         QPushButton *btn;

         QLineEdit *line;

         public slots:

             void OnClicked()

             {

                  Service1Soap soap;

                  soap_set_mode(soap.soap, SOAP_C_UTFSTRING);

                  _ns1__HelloWorld req;

                  _ns1__HelloWorldResponse res;

                  soap.__ns2__HelloWorld(&req,&res);

                  QString str = QString::fromUtf8(res.HelloWorldResult->c_str());

                  line->setText(str);

             }

    };

     

    #include "test.moc"

     

    int main(int argc,char* argv[])

    {

         QApplication app(argc,argv);

         MyDialog md;

         md.show();

         return app.exec();

     

    }

    l         然后就是编写pro文件。

           SOURCES += test.cpp /

                                        gsoap/soapC.cpp /

                                        gsoap/soapClient.cpp /

                                        gsoap/stdsoap2.cpp

    l         最后就是qmake、nmake

    注意:

    soap_set_mode(soap.soap, SOAP_C_UTFSTRING);这句是为了显示中文的,让字符串采用utf8编码。当我们在使用命令行程序的时候,即使使用了该选项也显示不出中文,因为命令行显示的字符串必须经过decode成GBK才可以显示。

    http://blog.csdn.net/tingsking18/article/details/5456831

  • 相关阅读:
    C
    A
    hdu 三部曲1 Popular Cows tarjan算法&&缩点&&拓扑排序
    hdu 三部曲 Going Home 最小费用最大流 EK算法
    hdu 三部曲 1Minimum Cost 最小费用最大流EK算法
    hdu 三部曲1 Is the Information Reliable? 差分约束 bellman_ford算法
    hdu 三部曲1 Intervals 差分约束问题 spfa算法
    hdu 三部曲 Crashing Robots
    hdu 三部曲2 Rebuilding Roads
    Codeforces 1277C As Simple as One and Two
  • 原文地址:https://www.cnblogs.com/findumars/p/5373294.html
Copyright © 2020-2023  润新知