gSOAP - 未设置 SOAP 操作标头

gSOAP - SOAP-Action Header not set

本文关键字:操作 SOAP 设置 gSOAP      更新时间:2023-10-16

我有几个WSDL文件,并使用gSOAP来创建C++代码。

为了生成代码,使用了以下命令:

pathtowsdl2h -I pathtoimportdir -j -N Service1Prefix -n Namespace1Prefix -o pathtooutputheaderdirheader1.h -q CPPNamespace1 -t pathtotypemap.dat .pathtowsdl1.wsdl

其余的 WSDL 文件以此类推。 在 gsoap 文档中,我读到需要一个空的 env.h 文件来处理序列化和错误处理。所以我为此创建了一个空文件。

在此之后,我使用 soap2cpp 工具为每个 WSDL 文件生成了C++代码:

pathtosoap2cpp -1 -C -L -a -A -b -d pathtooutputdir -i -j -I pathtoimportdir -n -r -w -x pathtoheaderdirheader1.h

和环境

pathtosoap2cpp -1 -C -L -b -d pathtooutputdir -j -I pathtoimportdir -penv  -r -w -x pathtoenv.h

一切正常,我得到了C++代码。

我把它放到我的代码中并尝试了一个方法,但提示错误。

错误: WSWS3147E: 错误: 没有 SOAPAction 标头!

我尝试了一些摆弄wsdl2h和soap2cpp的参数,但没有得到令人满意的结果。 当我删除前缀的参数时,设置了 SOAPAction 标头,但是当响应包含一些名称相同但内容不同的对象时,我会遇到问题。

一些搜索并没有为我带来可行的解决方案。 你们中的某个人以前可能遇到过这个问题并且可以提供一些帮助吗?

WSDL 可能没有在 wsdl:binding/wsdl:operation/soap:operation/@soapAction 属性中定义 SOAP Action 标头,尽管这不太可能。但是,如果是这种情况,或者 soapAction 未在 WSDL 中正确指定,并且您知道 SOAP Action 标头应该是什么,那么您只需在调用服务时手动设置 SOAP Action 标头,如下所示:

// create a service proxy object
SomeProxy proxy;
// invoke the service at an endpoint URL and SOAP Action, pass parameters:
if (proxy.someMethod("endpoint URL", "soap action", ...) == SOAP_OK)
... // got the results!

这会将 SOAP 操作 HTTP 标头设置为作为第二个参数提供的字符串。 您可以对端点和/或操作字符串使用 NULL,让调用改用 WSDL 定义的端点和操作。

PS #1. 仅使用 soapCPP2 选项-j(首选(或-i,但不要同时使用两者。

PS #2. 为什么不在所有 WSDL 组合上运行 wsdl2h?这最终节省了大量生成的代码。当服务组合在一个大的 .h 文件中时,无论如何,使用 soapcpp2 为 WSDL 中的服务单独生成服务代理类。这样,您还可以确保 SOAP 标头和 SOAP 错误是开箱即用的。说明:env.h 应定义从单独生成的 .h 文件中提取的所有 SOAP 标头和 SOAP 错误详细信息结构,手动操作可能很繁琐。