gsoap - 避免将 < 和 > 转义为 &lt 和 &gt

gsoap - Avoid escaping < and > to &lt and &gt

我正在使用 gsoap 访问网络服务。我通过以下方式使用 wsdl2h 和 soapcpp2 生成代码:

wsdl2h -o BILBO.h http://www.bilbao.eus/WebServicesBilbao/services/ws_bilbaoSOAP?wsdl
soapcpp2 -j -r -CL -1 BILBO.h

并通过以下方式访问服务:

#include "soapws_USCOREbilbaoSOAPSoapBindingProxy.h"
#include "ws_USCOREbilbaoSOAPSoapBinding.nsmap"

int main()
{
    ws_USCOREbilbaoSOAPSoapBindingProxy service;
    char str_buf[128];

    const char *servicio = "BUSLISPARO";
    const char *usuario = "BILBOBUS";

    int cod_linea = 30;
    sprintf(str_buf, "<![CDATA[<PETICION><CODIGOLINEA>%d</CODIGOLINEA></PETICION>]]>", cod_linea);
    std::string parametros(str_buf);

    _ns1__wsBilbao param_req;
    param_req.servicio = (char *)servicio;
    param_req.usuario = (char *)usuario;
    param_req.parametros.push_back(parametros);

    if (service.send_wsBilbao(NULL, NULL, &param_req) != SOAP_OK)
    {
        service.soap_sprint_fault(str_buf, sizeof(str_buf));
        service.destroy(); // delete data and release memory
        printf("err: %s\n", str_buf);
        return -1;
    }

    _ns1__wsBilbaoResponse param_resp;
    if (service.recv_wsBilbao(param_resp) != SOAP_OK)
    {
        service.soap_sprint_fault(str_buf, sizeof(str_buf));
        service.destroy(); // delete data and release memory
        printf("err: %s\n", str_buf);
        return -1;
    }

    for (int i = 0; i < param_resp.valores.size(); i++)
    {
        printf("[%d] \"%s\"\n", i, param_resp.valores[i].c_str());
    }

    service.destroy(); // delete data and release memory
}

我的问题是,当我 运行 代码时,我得到以下输出:

[0] ""

我希望得到一些数据。当我使用 Soap UI 执行相同的请求时,我确实明白了。

比较 Soap UI 请求和 gsoap 请求之间的差异,我注意到 gsoap 正在转义 < 和 > 字符。通过以下方式:

&lt;![CDATA[&lt;PETICION&gt;&lt;CODIGOLINEA&gt;30&lt;/CODIGOLINEA&gt;&lt;/PETICION&gt;]]&gt;

有没有办法告诉 gsoap no 将 < 转义为 < 和 > 转义为 >?

要发送和接收纯文本 XML,您可以使用 _XML built-in 类型,它是 char* 字符串序列化“as-is”,即没有翻译。然后在 soapcpp2 的头文件中使用 char* 的地方使用 _XML 类型。

在 C++ 中,您可以在 soapcpp2 的头文件中定义 typedef std::string XML; 来定义序列化为“as-is”的 XML 类型。

我不完全明白你为什么要用 <![CDATA[... 创建一个字符串。序列化字符串时不必使用 CDATA,因为 gsoap 以有效 XML.

序列化字符串