我的客户端需要能够与旧的和新的服务器协议(相同的端点)进行通信,因此,我需要加载2个具有相同操作的WSDL,但不同的命名空间(XML明智)
例如:
<operation name="getServerTime">
<input message="uc:GetServerTimeRequest"/>
<output message="uc:GetServerTimeResponse"/>
</operation>
wsdl2h似乎处理这个问题。我运行命令:
wsdl2h -p -o gSoap.h service2013.wsdl service2015.wsdl
并且在gSoap.h中我看到它成功地解析了两个操作;
int __ns2__getServerTime(
_common_2012_msgs__GetServerTimeRequest* common_2012_msgs__GetServerTimeRequest, ///< Input parameter
_common_2012_msgs__GetServerTimeResponse* common_2012_msgs__GetServerTimeResponse ///< Output parameter
);
int __ns7__getServerTime(
_common_2015_msgs__GetServerTimeRequest* common_2015_msgs__GetServerTimeRequest, ///< Input parameter
_common_2015_msgs__GetServerTimeResponse* common_2015_msgs__GetServerTimeResponse ///< Output parameter
);
但问题是之后,当我使用soapcpp2生成代理时:
soapcpp2 -jLCx -I$(gsoap_pkg)/share/import/ gSoap.h
我生成的代理(soapCommonServiceSoapBindingProxy.h)中的结果只有1个操作:
/// Web service operation 'getServerTime' (returns error code or SOAP_OK)
virtual int getServerTime(_common_2015_msgs__GetServerTimeRequest *common_2015_msgs__GetServerTimeRequest, _common_2015_msgs__GetServerTimeResponse *common_2015_msgs__GetServerTimeResponse) { return this->getServerTime(NULL, NULL, common_2015_msgs__GetServerTimeRequest, common_2015_msgs__GetServerTimeResponse); }
virtual int getServerTime(const char *endpoint, const char *soap_action, _common_2015_msgs__GetServerTimeRequest *common_2015_msgs__GetServerTimeRequest, _common_2015_msgs__GetServerTimeResponse *common_2015_msgs__GetServerTimeResponse);
我还应该提一下,在此之前,我尝试生成2个单独的代理,但由于不同结构的模糊定义(SOAP_ENV__FAULT等)而遇到无休止的链接问题。我尝试通过手动命名空间stdsoap2.cpp和stdsoap2.h来解决,但不同的错误不断涌入。
如何成功生成支持这两个版本的代理?
答案 0 :(得分:0)
A) 您可以将-qname与soapccp2一起使用,以便两个服务生成不同的soap文件和名称空间。
例如。
soapcpp2 -j -n -C -w -qs2013 -I$(INC) service2013.wsdl
soapcpp2 -j -n -C -w -qs2015 -I$(INC) service2015.wsdl
您可以参考gSoap文档了解更多详情gSOAP Code Namespace
B) 要解决与命名空间相关的链接器问题,请将以下代码添加到文件中(例如namespaces.cpp),添加到项目中并进行编译。
#include <stdsoap2.h>
extern "C" {
SOAP_NMAC struct Namespace namespaces[] = { { NULL, NULL} };
}
C)要解决与序列化和反序列化函数相关的链接问题,请创建一个空的env.h文件并使用以下命令对其进行编译:
soapcpp2 -n -CS -penv env.h
将envC。*添加到您的项目并编译