gpt4 book ai didi

c - gSOAP:如何省略响应中的可选元素?

转载 作者:行者123 更新时间:2023-11-30 15:31:19 27 4
gpt4 key购买 nike

我有一个 SOAP 函数,其在 gSOAP 语法中定义为

//gsoap ns service method-documentation: get foo and bar
int ns__getFooBar( xsd__string arg1, xsd__int arg2, struct ns__getFooBarResponse &response );

响应元素定义为

 //gsoap ns schema type-documentation: getFooBarResponse::foo Foo element, if available
//gsoap ns schema type-documentation: getFooBarResponse::bar Bar element
struct ns__getFooBarResponse { ns__FooType foo 0; ns__BarType bar; };

ns__getFooBarResponse 的结果类型定义是这样的:

#ifndef SOAP_TYPE_ns__getFooBarResponse
#define SOAP_TYPE_ns__getFooBarResponse (606)
/* ns:getcResponse */
struct ns__getFooBarResponse
{
public:
ns__FooType foo; /* SOAP 1.2 RPC return element (when namespace qualified) */ /* optional element of type ns:FooType */
ns__BarType bar; /* required element of type ns:BarType */
public:
int soap_type() const { return 606; } /* = unique id SOAP_TYPE_ns__getFooBarResponse */
};
#endif

虽然 foo 被声明为可选,但它是 ns__getFooBarResponse 的普通类成员(对于可选成员,我猜我会期望一个指针)。因此 foo 始终存在(即使只是默认初始化),因此答案始终包含 FooType 元素。

如何提供仅包含必需的 BarType 元素但省略可选的 FooType 元素的响应?

TL;DR

如何使用 gSOAP 提供省略可选元素的 SOAP 响应?

编辑

问题似乎部分不清楚:我不想为我的应用程序完全删除可选字段,但如果函数调用仅提供信息,我想可选忽略它BarType(取决于函数调用的参数)。这就是为什么它被定义为可选:

WSDL:

<element name="getFooBarResponse">
<complexType>
<sequence>
<element name="foo" type="ns:FooType" minOccurs="0" maxOccurs="1" />
<element name="bar" type="ns:BarType" minOccurs="1" maxOccurs="1" />
</sequence>
</complexType>
</element>

最佳答案

正确的解决方案是使 foo 成为指针:

struct ns__getFooBarResponse { ns__FooType* foo 0; ns__BarType bar; };

这会导致

struct hldc__getFooBarResponse 
{
public:
ns__FooType *foo;
ns__BarType bar;
public:
int soap_type() const { return 55; }
};

在我的代码中,如果需要,我需要手动实例化 FooType 元素:

if( /* is foo data available for this response ?*/ ) 
response.foo = soap_instantiate_ns__FooType( soap, -1, NULL, NULL, NULL );
// fill foo with data
}

响应 FooType:

<ns:getFooBarResponse>
<ns:FooType> <!--"foo" content --> </FooType>
<ns:BarType> <!--"bar" content --> </ns:BarType>
</ns:getFooBarResponse>

没有 FooType 的响应:

<ns:getFooBarResponse>
<ns:BarType> <!--"bar" content --> </ns:BarType>
</ns:getFooBarResponse>

关于c - gSOAP:如何省略响应中的可选元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890969/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com