zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    uvm_pkg——老板,打包带走
    uvm.sv——UVM之道
    uvm_comps.svh
    uvm_subscriber——告诉她我们来过
    uvm_monitor——借我一双慧眼
    编程面试过程中常见的10大算法(转)
    MySQL 分区表
    Nginx + Tomcat 动静分离实现负载均衡(转)
    浅析JVM内存结构和6大区域(转)
    Linux Shell编程变量赋值和引用
  • 原文地址:https://www.cnblogs.com/findumars/p/5373294.html
Copyright © 2011-2022 走看看