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工程。全部采用默认设置就可以了。
最后修改一下代码,加上点中文。如下:
namespaceWebService1
{
///<summary>
///Service1的摘要说明
///</summary>
[WebService(Namespace="http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
//若要允许使用ASP.NETAJAX从脚本中调用此Web服务,请取消对下行的注释。
//[System.Web.Script.Services.ScriptService]
publicclassService1:System.Web.Services.WebService
{
[WebMethod]
publicstringHelloWorld()
{
return"HelloWorld你好";
}
}
}
5.客户端
l建立文件夹client/gsoap。并把gsoap-2.7/gsoap/下的stdsoap2.cpp和stdsoap2.h拷贝至刚刚建立的gsoap文件夹下。
l打开命令行,cdC:/WSTest/client/gsoap,然后执行:
wsdl2h-I"E:/gsoap/source/gsoap-2.7/gsoap/WS"-otest.hhttp://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"
classMyDialog:publicQDialog
{
Q_OBJECT
public:
MyDialog(QWidget*parent=0):QDialog(parent)
{
btn=newQPushButton("invoke");
line=newQLineEdit;
connect(btn,SIGNAL(clicked()),this,SLOT(OnClicked()));
QHBoxLayout*layout=newQHBoxLayout;
layout->addWidget(line);
layout->addWidget(btn);
setLayout(layout);
}
private:
QPushButton*btn;
QLineEdit*line;
publicslots:
voidOnClicked()
{
Service1Soapsoap;
soap_set_mode(soap.soap,SOAP_C_UTFSTRING);
_ns1__HelloWorldreq;
_ns1__HelloWorldResponseres;
soap.__ns2__HelloWorld(&req,&res);
QStringstr=QString::fromUtf8(res.HelloWorldResult->c_str());
line->setText(str);
}
};
#include"test.moc"
intmain(intargc,char*argv[])
{
QApplicationapp(argc,argv);
MyDialogmd;
md.show();
returnapp.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才可以显示。
本文出自 “忄吾の” 博客,转载请与作者联系!