之前的简单原理见上篇文章。
C++ Linux使用gSoap进行WebService通信(客户端)_努力努力学习中的博客-CSDN博客
多个客户端调用WebService
先用wsdl2.exe生成.h文件。然后用soap2.exe生成带namespace的C++文件。这样的话,不同WebService服务生成的客户端调用文件就不会造成函数冲突。
soapcpp2 -i Trans.h -q trans -d trans -I../../../gsoap;../../../gsoap/import;../../../gsoap/custom:.
soapcpp2.exe中参数:主要注意以下几个。
-C 仅生成客户端源代码
-d path 用于path保存文件,经过尝试,path路径需要存在,不然无法生成
-q name 生成命名空间是name的源文件,包括C++序列化文件
-Q name 生成命名空间是name的源文件,不包括C++序列化文件#######我所用的项目-Q-q好像没有什么区别,用的gsoap2.8版本
-I path 使用path(s) for #import(用 ??分隔的路径:)
-i 生成从soap结构继承的C++服务代理和对象
-j 生成共享soap结构的C++服务代理和对象 #######-i和-j都能使用,生成的SoapBindingProxy类和SoapBindingService类不同,其余都相同
参考官网用户使用指南Genivia - gSOAP user guide
关于XXXSoapBinding.nsmap文件,这个文件定义了一个namespaces的全局变量,在编译stdsoap2时会用到。
如果有多个客户端,会造成编译异常。此时如果几个文件里的namespaces值不同,可以在soapinit(&soap)之后,再重新手动调一下soap_set_namespaces,此段代码参照生成的XXXSoapBindingProxy类中的XXXSoapBindingProxy_init函数
static const struct Namespace mynamespaces[] = {
{ "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL },
{ "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL },
{ "xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL },
{ "xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL },
{ "ns1", "http://endpoint.axis.rm.tmri.com", NULL, NULL },
{ NULL, NULL, NULL, NULL}
};
soap_set_namespaces(proxy, mynamespaces);
//soapcpp2.exe自动生成的XXXSoapBindingProxy客户端代理类中的代码
void XXXSoapBindingProxy::XXXSoapBindingProxy_init(soap_mode imode, soap_mode omode)
{ soap_imode(this, imode);
soap_omode(this, omode);
soap_endpoint = NULL;
static const struct Namespace namespaces[] = {
{ "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/", "http://www.w3.org/*/soap-envelope", NULL },
{ "SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/", "http://www.w3.org/*/soap-encoding", NULL },
{ "xsi", "http://www.w3.org/2001/XMLSchema-instance", "http://www.w3.org/*/XMLSchema-instance", NULL },
{ "xsd", "http://www.w3.org/2001/XMLSchema", "http://www.w3.org/*/XMLSchema", NULL },
{ "ns1", "http://endpoint.axis.rm.tmri.com", NULL, NULL },
{ NULL, NULL, NULL, NULL}
};
soap_set_namespaces(this, namespaces);
}
|