gsoap - 避免将 < 和 > 转义为 < 和 >
gsoap - Avoid escaping < and > to < and >
我正在使用 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, ¶m_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 正在转义 < 和 > 字符。通过以下方式:
<![CDATA[<PETICION><CODIGOLINEA>30</CODIGOLINEA></PETICION>]]>
有没有办法告诉 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.
序列化字符串
我正在使用 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, ¶m_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 正在转义 < 和 > 字符。通过以下方式:
<![CDATA[<PETICION><CODIGOLINEA>30</CODIGOLINEA></PETICION>]]>
有没有办法告诉 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.