前言
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才可以显示
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才可以显示
SOURCES += main.cpp \
soapClient.cpp \
soapC.cpp \
stdsoap2.cpp
HEADERS += \
stdsoap2.h \
soapH.h \
soapH.h
2、如果需要建立Qt for Symbian工程,并用MinGw编译,需要在pro中添加 LIBS += -lws2_32
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。