版權聲明
本文爲原創作品,請尊重作者的勞動成果。轉載必須保持文章完整性,並以超鏈接形式註明原始作者“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.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纔可以顯示。