gSoap具有多个具有相同操作的WSDL

时间:2015-10-13 07:53:26

标签: c++ soap wsdl gsoap

我的客户端需要能够与旧的和新的服务器协议(相同的端点)进行通信,因此,我需要加载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来解决,但不同的错误不断涌入。

如何成功生成支持这两个版本的代理?

1 个答案:

答案 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。*添加到您的项目并编译