本文经过自己实践总结,同时参考网上另外一哥们文档.
环境:win32,vs2008,Qt 4.7,gsoap2.7.17
一,安装vs2008+Qt 4.7+插件就不说了,直接用QtCreator也可以。
二,到官网下载gsoap2.7.17,下不到自己想办法,我上传群共享了。但群号不方便说。
三,源码解压,然后把gsoap-2.7/gsoap/bin/win32设置到系统的Path中去,这个目录下有两个可执行文件wsdl2h.exe和soapcpp2.exe,这两个文件可以根据wsdl接口文件生成你需要的客户端接口文件。
四,建立服务器webserivce测试,下面代码拿来注意:
打开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你好";
}
}
}
五,进行客户端gaosp操作:
1,建立文件夹client/gsoap。并把gsoap-2.7/gsoap/下的stdsoap2.cpp和stdsoap2.h拷贝至刚刚建立的gsoap文件夹下。另外还要考几个文件gsoap/soapC.cpp ,gsoap/soapClient.cpp ,有需要的自己继续拷贝,我测试就这几个够了。
2,wsdl2h –I "E:/gsoap/source/gsoap-2.7/gsoap/WS"-s -o test.h http://localhost:5925/Service1.asmx?WSDL(加-s是表示不使用stl库)
3, 执行soapcpp2 -I "E:/gsoap/source/gsoap-2.7/gsoap/import"test.h
4, 编写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 = newQHBoxLayout;
layout->addWidget(line);
layout->addWidget(btn);
setLayout(layout);
}
private:
QPushButton*btn;
QLineEdit*line;
public slots:
void OnClicked()
{
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"
int main(int argc,char* argv[])
{
QApplicationapp(argc,argv);
MyDialogmd;
md.show();
return app.exec();
}
根据需要自己修改。
六,soap_set_mode(soap.soap, SOAP_C_UTFSTRING);这句是为了显示中文的,让字符串采用utf8编码。当我们在使用命令行程序的时候,即使使用了该选项也显示不出中文,因为命令行显示的字符串必须经过decode成GBK才可以显示。
七,soapcpp2常用选项
- -C 仅生成客户端代码
- -S 仅生成服务器端代码
- -L 不要产生soapClientLib.c和soapServerLib.c文件
- -c 产生纯C代码,否则是C++代码(与头文件有关)
- -I 指定import路径(见上文)
- -x 不要产生XML示例文件
- -i 生成C++包装,客户端为xxxxProxy.h(.cpp),服务器端为xxxxService.h(.cpp)。
八,生成的客户端接口在test.h文件中,可以查看编码。