gsoap complexTtype containing a complexType

gsoap complexTtype containing a complexType

本文关键字:complexType containing complexTtype gsoap      更新时间:2023-10-16

对于一个项目,我必须在Windows平台上编写一个gsoap客户端。我正在使用MinGw g++。我已经使用-j选项生成了代码,以便接收soap。。。代理.h和.cpp文件

我想向我们的web服务发送一个请求,其中输入(ns2_getSMSByTimeSpan)和响应(ns2_getSMS ByTimeSpanResult)参数都是复杂类型。输入参数包含另一个complexType(ns2_TimeSpan),它由2个time_t变量组成。在wsdl中,它被定义为xsd:dateTime。我尝试设置这两个time_t变量,但都失败了。我只是不知道如何访问它。生成的文件中的评论对我没有真正的帮助,我也无法通过谷歌搜索找到答案。

这就是soapStub.h 中ns2_getSMSByTimeSpan和ns2_TimeSpan类的样子

class SOAP_CMAC _ns2__getSMSByTimeSpan
{
public:
std::string AccountKey; /* required element of type xsd:string */
ns2__TimeSpan *TimeSpan;    /* required element of type ns2:TimeSpan */
struct soap *soap;  /* transient */
public:
virtual int soap_type() const { return 17; } /* = unique id SOAP_TYPE__ns2__getSMSByTimeSpan */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
         _ns2__getSMSByTimeSpan() { _ns2__getSMSByTimeSpan::soap_default(NULL); }
virtual ~_ns2__getSMSByTimeSpan() { }
};
class SOAP_CMAC ns2__TimeSpan
{
public:
time_t *StartDate;  /* optional element of type xsd:dateTime */
time_t *EndDate;    /* optional element of type xsd:dateTime */
struct soap *soap;  /* transient */
public:
virtual int soap_type() const { return 11; } /* = unique id SOAP_TYPE_ns2__TimeSpan */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
         ns2__TimeSpan() { ns2__TimeSpan::soap_default(NULL); }
virtual ~ns2__TimeSpan() { }
};

到目前为止我在做什么:我正在创建gsoap类的一个实例,并创建和实例化我想要使用的complexTypes。

#include "soapSMSGateBindingProxy.h"
#include "SMSGateBinding.nsmap"
#include <iostream>
SMSGateBindingProxy instance;

ns2__TimeSpan *timeSpan;
size_t *timeSpanSize = new size_t;
*timeSpanSize = sizeof(ns2__TimeSpan);
timeSpan = (ns2__TimeSpan*)
        soap_instantiate(instance.soap,
                SOAP_TYPE_ns2__TimeSpan,"","",
                timeSpanSize);

_ns2__getSMSByTimeSpan *smsByTimeSpan;
size_t *smsByTimeSpanSize = new size_t;
*smsByTimeSpanSize = sizeof(_ns2__getSMSByTimeSpan);
_ns2__getSMSByTimeSpanResult *smsResult;
size_t *smsResultSize = new size_t;
*smsResultSize = sizeof (_ns2__getSMSByTimeSpanResult);

smsByTimeSpan = (_ns2__getSMSByTimeSpan*)
            soap_instantiate(instance.soap,
                    SOAP_TYPE__ns2__getSMSByTimeSpan,"","",
                    smsByTimeSpanSize);
smsResult     = (_ns2__getSMSByTimeSpanResult*)
            soap_instantiate(instance.soap,
                    SOAP_TYPE__ns2__getSMSByTimeSpanResult,"","",
                    smsResultSize);
delete smsByTimeSpanSize;
delete smsResultSize;

然后我尝试设置smsByTimeSpan->TimeSpan->StartDate值,但无论我尝试什么方法,客户端都会崩溃:

struct tm test;
test.tm_hour = 0; test.tm_min = 0; test.tm_sec = 0;
test.tm_year = 2013 - 1900; test.tm_mon = 8; test.tm_mday = 28;
//  cout << mktime(&test) << timeSpan->StartDate << endl;  //trying to access the StartDate value crashes it
//  *smsByTimeSpan->TimeSpan->StartDate = mktime(&test);
//  smsByTimeSpan->TimeSpan->soap_put(instance.soap, "2013-06-28 08:00:00", "2013-12-02 15:05:00");
//  timeSpan.soap_put(instance.soap, "2013-12-02T14:10:03+02:00", "2013-12-02T14:50:03+02:00");
smsByTimeSpan->TimeSpan = timeSpan;     //this works
*smsByTimeSpan->TimeSpan = mktime(&test);           //this crashes

有人能告诉我,我做错了什么吗?或者,告诉我如何正确地将数据输入到timeSpan->StartDate值中?

提前感谢

好吧,我想我发现了,我做错了什么。当我提出这个问题的时候,我完全想错了方向。。。我的问题是指针。我通过将代码更改为来修复它

time_t helper = mktime(&test);
smsByTimeSpan->TimeSpan = timeSpan;
timeSpan->StartDate = &helper;

就是这样。也许有人在寻找如何在gsoap中设置time_t类型时,仍然会觉得这很有用。