操作步骤:
1、 编译wsdl文件生成.h头文件
wsdl2h -c -o *.h *.wsdl
如:wsdl2h -c -o ARMService.h ARMService.asmx
注意:wsdl2h 需要放在系统path路径下,或者/usr/bin/目录下
2、 编译.h头文件生成调用代码函数
soapcpp2 -C -c *.h
如:soapcpp2 -C -c ARMService.h
编译出错需修正 ARMService.h中的重复定义,修改重复定义的变量名即可。执行成功会显示:Compilation successful
注:可删除生成的 *.xml 和 soapClientLib.c 文件
3、 将stdsoap2.h 和 stdsoap2.c 放在源码同一目录
4、 在调用的.c文件中增加:
#include "soapH.h"
#include "ARMServiceSoap.nsmap"
5、 调用函数名参照: soapClient.c 文件中的函数调用
6、 调用顺序
struct soap soap2;
soap_init(&soap2);
soap_set_mode(&soap2, SOAP_C_UTFSTRING);
//TODO 发送数据赋值
soap_call_ns3__ossRequest(&soap2, "http:", "", &Request, pRecv);
if(soap2.error)
{
soap_print_fault(&soap2, stderr);
}
else
{
u2g(… …);
}
endSoap(&soap2);
// endSoap()实现如下
void endSoap(struct soap* soap)
{
soap_destroy(soap);
soap_end(soap);
soap_done(soap);
}
// UTF-8编码转换
#include <iconv.h>
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
char **pin = &inbuf;
char **pout = &outbuf;
cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,(size_t*)&inlen,pout,(size_t*)&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gbk",inbuf,inlen,outbuf,outlen);
}
注意:收到数据的内存会在endSoap的时候释放,需要处理好避免出现数据错误或程序崩溃