Gsoap 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,
从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。
用gsoap开发web service的大致思路
我们开发webservice应用,大致有两个方向:
1. API接口固定,不关心底层的通讯,将SOAP作为应用层协议
此时,我们先定义接口,编写好.h文件,运行soapcpp2生成出相应的代码,对服务器端,修改XXXService文件,实现业务逻辑,对客户端,修改XXXProxy文件,实现业务逻辑。
2. 通讯协议固定(当然需要基于XML的)或只有wsdl,将SOAP作为“传输层”协议
此时,我们必须根据通讯协议或wsdl生成相应的C/C++类型的.h文件,如果需要我们自己编写wsdl,则需要一点其相关知识,不过我们可以用C#等生成一个简单的wsdl,照猫画虎即可。运用wsdl2h,我们可以生成.h文件,有了.h后,按上面的步骤继续。
(注意:有时通过wsdl2 *.wsdl 命令生成的*.h头文件会默认包含stlvector.h,所以编译包里必须包含这个文件才能用soap2 *.h 命令编译生成文件)
一、根据WSDL文件开发WebService客户端,访问Java的WebService服务端
1. Java 定义好WebService接口,生成WSDL标准接口文件。
2. 使用GSoap的WSDL2h.exe工具把WSDL文件生成C++的头文件。
wsdl2h XXX.wsdl 命令会生成 XXX.h
3. 使用GSoap的 soapcpp2.exe工具把XXX.h头文件生成Soap封装的类。
soapcpp2 -C -p XXX -j XXX.h
-C为生成客户端代码,会生成以Proxy结尾的类,
-S为生成服务端代码,会生成以Service结尾的类。
WSDL标准接口文件的解析说明可参考WSDL相关资料。
注意:根据WSDL文件生成的客户端的接口返回值也是是int类型,返回结果被GSoap封装为接口的引用参数了。
一、根据.h头文件开发C++的WebService服务端,Java用客户端访问
1.定义APi接口函数
如:calc.h文件接口编写
//calculater
//gsoap api service name: calc
//gsoap api service style: rpc
//gsoap api service encoding: encoded
//gsoap api service location: http://localhost:10086/
//gsoap api service namespace: http://basecode.soapapp
//gsoap api schema namespace: http://basecode.soapapp/message
typedef char* xsd__string;
typedef int xsd__int;
//加法接口
int api__add
(
xsd__int num1,
xsd__int num2,
xsd__string desc,
xsd__int & result
);
2.直接用build.bat脚本编译成功后便会生成WS请求的WSDL接口文件。
使用soapcpp2命令编译:
soapcpp2 -S -p calc -j calc.h 生产服务端代码
3.编写类继承生成的接口类就可以实现其功能,
或者把用全局函数ns__add(int num1,int num2,string desc, int result)实现接口功能。
4.包含文件:头文件,命名空间文件,soap组件文件
#include "soap/calcH.h"
#include "soap/calc.nsmap"
#include "soap/stdsoap2.h"
5.问题:其自定义生成接口在生成类中没有添加实现,编译报链接错误?
生成类源文件中实现自定义的接口函数,放空,编译通过。
6.测试:使用SoapUi工具建立工程,加载到WSDl文件,其端口号要与监听的端口一致。
注意:服务端的接口返回值必须是int类型,如果需要返回结果其它信息需要使用引用参数,
引用参数可以是基础类型,或者自己封装的结构体类型。