在 Delphi7 中使用 Indy 组件库发送 SOAP 请求调用服务器的一个方法,可以按照以下步骤进行:
在 Delphi 中添加 Indy 组件库。打开 Component Palette(组件面板),选择“Internet”选项卡,在该选项卡中可以看到多个 Indy 组件。
添加 TIdHTTP 和 TIdSSLIOHandlerSocketOpenSSL 组件到窗体上,并设置相关属性。其中 TIdHTTP 用于发送 HTTP 请求,TIdSSLIOHandlerSocketOpenSSL 用于支持 HTTPS 协议。
创建一个 XML 文档并将请求参数添加到文档中。SOAP 请求需要按照特定格式发送,因此需要按照规范编写 XML 文档。
例如,假设要调用名为 “MyMethod” 的服务器方法,并传递两个参数 “Param1” 和 “Param2”,则可以创建如下的 XML 请求文档:
<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<MyMethod xmlns="http://tempuri.org/">
<Param1>value1</Param1>
<Param2>value2</Param2>
</MyMethod>
</soap:Body>
</soap:Envelope>
其中,”http://tempuri.org/” 是服务器端命名空间的 URL。
- 使用 TIdHTTP.Post 方法向服务器发送请求,并获取服务器响应。由于返回数据也是 XML 格式,因此需要解析响应内容以获取所需信息。
例如,以下代码可以发送 SOAP 请求并获取服务器的响应:
uses IdHTTP, IdSSLOpenSSL, IdURI;
function CallMyMethod(const AParam1, AParam2: string): string;
var
HTTP: TIdHTTP;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
RequestDoc, ResponseDoc: TStringStream;
begin
// 创建 HTTP 和 SSL 组件实例
HTTP := TIdHTTP.Create(nil);
try
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
HTTP.IOHandler := SSLHandler;
// 设置 SSL 参数(如果使用 HTTPS 协议)
SSLHandler.SSLOptions.Method := sslvTLSv1_2;
SSLHandler.SSLOptions.Mode := sslmClient;
// 创建请求文档,并添加参数
RequestDoc := TStringStream.Create('');
try
RequestDoc.WriteString('<?xml version="1.0"?>');
RequestDoc.WriteString('<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ');
RequestDoc.WriteString('xmlns:xsd="http://www.w3.org/2001/XMLSchema" ');
RequestDoc.WriteString('xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">');
RequestDoc.WriteString('<soap:Body>');
RequestDoc.WriteString('<MyMethod xmlns="http://tempuri.org/">');
RequestDoc.WriteString('<Param1>' + AParam1 + '</Param1>');
RequestDoc.WriteString('<Param2>' + AParam2 + '</Param2>');
RequestDoc.WriteString('</MyMethod>');
RequestDoc.WriteString('</soap:Body>');
RequestDoc.WriteString('</soap:Envelope>');
// 发送请求
ResponseDoc := TStringStream.Create('');
try
HTTP.Post('http://localhost/MyService.asmx', RequestDoc, ResponseDoc);
// 解析响应文档,获取返回值
Result := ParseResponse(ResponseDoc.DataString);
finally
ResponseDoc.Free;
end;
finally
RequestDoc.Free;
end;
finally
SSLHandler.Free;
end;
finally
HTTP.Free;
end;
end;
function ParseResponse(const AResponse: string): string;
var
XML: TXMLDocument;
Node: IXMLNode;
begin
// 解析响应文档,获取返回值节点的值
XML := TXMLDocument.Create(nil);
try
XML.LoadFromXML(AResponse);
Node := XML.DocumentElement.ChildNodes.FindNode('Body').ChildNodes[0].ChildNodes[0];
Result := Node.Text;
finally
XML.Free;
end;
end;
其中,”http://localhost/MyService.asmx” 是服务器端 Web Service 的 URL。
以上代码中使用了 ParseResponse 函数来解析服务器的响应,并从中获取 MyMethod 方法的返回值。可以根据实际情况修改该函数以获取其他需要的信息。