首先,让我道歉,因为我对SOAP不太了解,我所说的大部分内容都是胡说八道。
我将使用gSoap 2.8.4生成的一些客户端代码升级到gSoap 2.8.93
据我所知,该程序仅向服务器发送一个请求。以前,此请求被包装在
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="bmf.gv.at:pkt/PKTSoap" xmlns:ns1="bmf.gv.at:pkt" xmlns:ns3="bmf.gv.at:pkt/PKTSoap12">
<SOAP-ENV:Body>
...
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
但是,使用新版本生成的代码,此信封丢失了。我了解这是因为该请求是作为REST请求而不是SOAP请求生成的。我发现有一些讨论// gsoap服务指令的线程,将方法协议设置为SOAP而不是POST,但是我只能找到这些指令用于对子服务/ PKTSoap和/ PKTSoap12的请求,而不是对将请求发送到的根服务bmf.gv.at:pkt。实际上,在代码中甚至没有将其称为服务,而是将其称为架构。对它的请求称为架构的顶级根元素。它们都是作为REST请求自动生成的。
我的问题是如何指示gSoap将所有请求生成为SOAP1.1请求?任何帮助都将不胜感激。
WSDL:https://pastebin.com/bmC8Hx6M
typemap.dat是默认值,并附加以下内容:
ns1 = "bmf.gv.at:pkt"
ns2 = "bmf.gv.at:pkt/PKTSoap"
ns3 = "bmf.gv.at:pkt/PKTSoap12"
并且我使用以下命令生成:
wsdl2h.exe -c -g -N ns %1.wsdl
soapcpp2.exe -c -C -I./import -1 %1.h
从您的问题尚不清楚,哪些请求消息不包含信封。
这里是测试生成的源代码,验证是否包含SOAP1.1信封和正文的快速方法(我在这里使用C ++:]]
wsdl2h -L -g -N ns service.wsdl soapcpp2 -1 -C -I import service.h
一个小型演示客户端,用于测试请求消息:
#include "soapH.h" #include "PKTSoap.nsmap" int main() { struct soap *soap = soap_new1(SOAP_XML_INDENT); _ns1__DatenpoolkontoErzeugen req; _ns1__Verarbeitung res; req.soap_default(soap); soap_call___ns2__PKTDatenpoolkontoErzeugen(soap, "http://", NULL, &req, res); }
编译:
c++ -o service service.cpp soapC.cpp soapClient.cpp stdsoap2.cpp
然后运行:
$ ./service POST / HTTP/1.1 Host: User-Agent: gSOAP/2.8 Content-Type: text/xml; charset=utf-8 Content-Length: 526 Connection: close SOAPAction: "bmf.gv.at:pkt/PKTDatenpoolkontoErzeugen" <?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:ns2="bmf.gv.at:pkt/PKTSoap" xmlns:ns1="bmf.gv.at:pkt" xmlns:ns3="bmf.gv.at:pkt/PKTSoap12"> <SOAP-ENV:Body> <ns1:DatenpoolkontoErzeugen> <ns1:Absender xsi:nil="true"/> </ns1:DatenpoolkontoErzeugen> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
这表明
bmf.gv.at:pkt
请求的发送与WSDL中指定的完全相同。