gSOAP 空答案

Posted

技术标签:

【中文标题】gSOAP 空答案【英文标题】:gSOAP empty answer 【发布时间】:2013-01-23 16:17:45 【问题描述】:

我正在编写一个 SOAP 客户端。我正在使用 gSOAP 版本 2.7.17,我必须坚持使用该版本,因为服务器正在使用这个版本,我无法修改它,因为它已经在现场运行。

当我进行 SOAP 调用时,我总是收到空答案!但是,当我嗅探网络时,XML 答案似乎是正确的:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:Supervisor="urn:Supervisor"
    xmlns:ActiveLogin="urn:ActiveLogin" xmlns:TechLogin="urn:TechLogin"
    xmlns:UMSLogin="urn:UMSLogin">
    <SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <unitCallResponse>
            <szServerName>UMS_DEV_LANCC2 (2)</szServerName>
            <dResponse>cUNITRETURNCODE_RESTARTIMMEDIATE</dResponse>
            <dDetail>cBla</dDetail>
        </unitCallResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是一个简化的代码 sn-p,关于我如何使用 soapcpp2 生成的代理执行 SOAP 调用:

UMSLogin::unitCallResponse response;    // Response from SOAP
UMSLogin::UMSLoginProxy* m_soapProxy =  // The SOAP proxy
    new UMSLogin::UMSLoginProxy(SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);

callRes = m_soapProxy->unitCall(m_eUnitType, serial, m_dInterfaceVersion,
    xl2CallTypeToUmsLoginCallType(m_pSoapEndPoint->getCallType()),
    xl2CommTypeToUmsLoginCommType(m_pSoapEndPoint->getComType()),
    response);

logDebug(LOG_COM_DEVICE, "SOAP call done to %s, SOAP code %i, central code %i",
    response.szServerName.c_str(), callRes, response.dResponse);

m_soapProxy->soap_close_socket();
m_soapProxy->destroy();
delete m_soapProxy;

实际输出:

SOAP call done to , SOAP code 0, central code 0

当我期待时

SOAP call done to UMS_DEV_LANCC2 (2), SOAP code 0, central code 5
/* 5 ->  cUNITRETURNCODE_RESTARTIMMEDIATE */

以前有一个旧的实现,这一定是有效的!我哪里错了?有没有人已经遇到过这种问题?任何指针都非常感谢!

编辑:

问题已通过使用早期版本的 SOAP (2.7.14) “解决”,而无需从我的程序的原始版本更改一行代码。但是,我感觉我又错过了一些重要的事情!我可能应该稍微调整一下我的头文件,给 SOAP“定义”以使事情正常工作......

【问题讨论】:

【参考方案1】:

查看您声明response 的代码,然后将其元素引用为response.dResponse。这似乎意味着响应是一个结构而不是指向结构的指针,因此在您调用m_soapProxy-&gt;unitCall 之后,您随后报告的response 的版本没有改变,只有m_soapProxy-&gt;unitCall 中的副本会改变。

我会尝试在调试器中跟踪这个调用,看看m_soapProxy-&gt;unitCall 中实际发生了什么。顺便说一句,是你编码还是由 GSOAP 生成的?

【讨论】:

感谢您的建议,但我考虑过这一点,但“unitCall”需要引用,因此变量已更新,请参见签名 -> UMSLoginProxy::unitCall(... , unitCallResponse &response)。当我使用调试器时,在 SOAP 生成的 unitCall 方法的末尾,它会将其临时变量复制到我的引用中,而此时答案已经是空的!

以上是关于gSOAP 空答案的主要内容,如果未能解决你的问题,请参考以下文章

网页旨在返回基于答案的数字,但只返回空值?

javascript数组问题:想编写一个填空题考试系统,用数组把答案存起来,但是有一个空的答案是有两个的。

求数据结构答案

gSOAP - 到 C 结构的 XML 数据(也由 gSOAP 生成)

解析多个xml文件时如何检查空xml文件[重复]

python选择题