gSoap是一个工具集,便得用C/C++语言能非常非常容易的来开发基于SOAP协议的webservices和客户端程序。
这几天需要在我的嵌入式板子上用soap连接服务器,研究了一下gSoap,在此记录一下过程和心得吧。
1.编译
编译PC本地库比较容易,直接configure就行了。
交叉编译: 在configure时指定 --host为对就的平台就行了, 我的x86的cpu配置为:
configure --host=i386-linux
交叉编译应该是不能完整通过的,只要能正确编译出libgsoap.a 这个库就行了。
他的两个工具 wsdl2h,soapcpp2 就使用本地编译的,但要和交叉编译的是同一个版本。
使用交叉编译的库在连接时可能会出现找不到rpc_malloc的情况。只需要修改交叉编译的config.h中的
- 将#define malloc rpl_malloc 注掉;
- 将#define HAVE_MALLOC 0 改为:#define HAVE_MALLOC 1
可能还需要连接到libm.a 这个库.
2.转换wsdl
wsdl2h -c webservice.wsdl
soapcpp2 -c -C webservice.h
执行以上两条命令后就会生成一堆c的文件,把这些文件连同交叉编译的库 和自己的程序一起编译连接就行
了,具体的怎么调用接口在这我就不说了。
3.类型转换
每种语言的数据类型定义是不一样的,如我的服务器用的是PHP它生成的wsdl中的整型为integer ,但在c中没
有integer ,只有int , long long 这样的类型,gsoap提供了一个类型映射文件,在文件中可以指定本地类型与
wsdl中的类型的映射关系,如,在当前目录创造一个typemap.dat 的文件,增加一行:
xsd__integer = | long long
这样就行wsdl中的integer 类型映射为本地c的long long , gSoap现在不支持将xsd__integer映射为int 类型。
4.使用自定义类型(类,结构 )
在PHP中创建一个自定义类并加上对应的注释。如:
class result{
/*@var integer code
*/
public code;
/*@var string code
*/
publid msg;
}
在接口函数中就能直接返回这个类的对象.
生成wsdl,在经gsoap转换后就行得到以c的struct 对应的ns1__result :
struct ns1__result{
LONG64 code;
char *msg;
};
在PHP中返回一个类对象后,在c中就会得到一个struct ns1__result的实例指针。