Qt+gsoap調用WebService

版權聲明

本文爲原創作品,請尊重作者的勞動成果。轉載必須保持文章完整性,並以超鏈接形式註明原始作者“tingsking18”和主站點地址,方便其他朋友提問和指正。

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.soapSOAP_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,charargv[])

{

     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纔可以顯示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章