如何在 Delphi 中设置SOAP元素的属性?

hc2pp10m  于 2022-11-04  发布在  其他
关注(0)|答案(2)|浏览(168)

我使用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添加该属性?

qco9c6ql

qco9c6ql1#

我发现对我来说最简单的方法是在表单上添加THTTPRIO组件,并使用它的onBeforeExecute事件来更改SOAPRequest,如下所示:

procedure TForm2.htpr1BeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
  sl: TStringList;
begin
  sl:=TStringList.Create;
  try
    SOAPRequest.Position := 0;
    sl.LoadFromStream(SOAPRequest);
    sl.Text := StringReplace(sl.Text,'<anyType>','<anyType xsi:type="xsd:string">',[RfReplaceAll]);
    sl.SaveToFile('SOAPRequest.txt'); //for debug
    SOAPRequest.Position := 0;
    sl.SaveToStream(SOAPRequest);
  finally
    sl.Free;
  end;
end;
velaa5lx

velaa5lx2#

调用获取端口类型函数时,将“UseWSDL”传递为false,将“Addr”传递为不带“?WSDL”的URL。然后将HTTPWebNode(HTTPReqResp组件)分配给HTTPRIO。

相关问题