我使用WSDL导入器创建了一个类( Delphi 10.3)。但是在调用一个Web服务方法时遇到了一个错误。在使用Fiddler检查了调用之后,我注意到一个属性丢失了。
在WSDL中,我们有:
<s:complexType name="ArrayOfAnyType">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="anyType" nillable="true" type="s:string" />
</s:sequence>
</s:complexType>
工作SOAP信封如下所示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FidelioSPMSWSXML xmlns="http://fideliocruise.de/">
<psFunction>Login</psFunction>
<poParam>
<anyType xsi:type="xsd:string">sasa</anyType>
<anyType xsi:type="xsd:string">F45731E3D39A1B2330BBF93E9B3DE59E</anyType>
</poParam>
</FidelioSPMSWSXML>
</s:Body>
</s:Envelope>
Delphi 创建如下信封:
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<FidelioSPMSWSXML xmlns="http://fideliocruise.de/">
<psFunction>Login</psFunction>
<psSessionID/>
<poParam>
<anyType>username</anyType>
<anyType>password</anyType>
</poParam>
</FidelioSPMSWSXML>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Delphi 调用不起作用的唯一原因是anyType元素中缺少了xsi:type=“xsd:string”。如何强制Delphi添加该属性?
2条答案
按热度按时间qco9c6ql1#
我发现对我来说最简单的方法是在表单上添加THTTPRIO组件,并使用它的onBeforeExecute事件来更改SOAPRequest,如下所示:
velaa5lx2#
调用获取端口类型函数时,将“UseWSDL”传递为false,将“Addr”传递为不带“?WSDL”的URL。然后将HTTPWebNode(HTTPReqResp组件)分配给HTTPRIO。