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

gSoap with multiple WSDLs with same operations

本文关键字:wsdl gSoap 操作      更新时间:2023-10-16

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

如何成功生成一个同时支持两个版本的代理?

A)您可以在soapccp2中使用-qname,以便两个服务生成不同的soap文件和名称空间。

例如

soapcpp2 -j -n -C -w -qs2013 -I$(INC) service2013.wsdl
soapcpp2 -j -n -C -w -qs2015 -I$(INC) service2015.wsdl

您可以参考gSoap文档了解更多细节gSoap代码命名空间

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。