You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Delphi中正确调用指定的TerytWs1 WebService?

Delphi调用TERYT测试WebService完整指南

看起来你已经完成了WSDL导入和THTTPRIO组件的基础配置,接下来咱们一步步搞定这个带基本认证的HTTPS WebService调用,重点处理认证、接口调用和常见问题:

1. 配置HTTP基本认证

这个TERYT测试服务需要基本HTTP认证,你有两种可靠的配置方式:

方式一:直接设置HTTPWebNode属性

找到你的htprqrsp1(THTTPReqResp组件),在代码里设置用户名和密码:

procedure TForm1.FormCreate(Sender: TObject);
begin
  // 直接设置认证信息
  htprqrsp1.Username := 'TestPubliczny';
  htprqrsp1.Password := '1234abcd';
end;

方式二:手动添加Authorization请求头(如果方式一不生效)

如果直接设置属性没效果,可以通过OnBeforePost事件手动注入认证头:

uses
  System.NetEncoding;

procedure TForm1.htprqrsp1BeforePost(const HTTPReqResp: THTTPReqResp;
  Data: Pointer);
var
  AuthCredentials: string;
  EncodedAuth: string;
begin
  AuthCredentials := 'TestPubliczny:1234abcd';
  // 用Delphi自带的Base64编码生成认证头
  EncodedAuth := TNetEncoding.Base64.Encode(AuthCredentials);
  HTTPReqResp.CustomHeaders.Add('Authorization: Basic ' + EncodedAuth);
end;

记得给htprqrsp1OnBeforePost事件绑定这个处理函数。

2. 确认组件配置的正确性

检查你的THTTPRIO组件参数是否和WSDL完全匹配:

  • WSDLLocation:确保是https://uslugaterytws1test.stat.gov.pl/wsdl/terytws1.wsdl
  • Service:对应WSDL里的<service name="TerytWs1",你的设置是对的
  • Port:对应WSDL里的<port name="custom",这个也没问题

如果之前导入WSDL时生成了接口类(比如TTerytWs1Soap),建议直接通过接口调用,比直接操作组件更直观。

3. 调用WebService方法

假设导入WSDL后生成了TTerytWs1Soap接口,你可以这样调用具体方法(比如获取省份列表的PobierzListeWojewodztw):

procedure TForm1.btnCallServiceClick(Sender: TObject);
var
  TerytService: TTerytWs1Soap;
  ProvinceList: ArrayOfWojewodztwo; // 以WSDL生成的返回类型为准
begin
  // 从THTTPRIO获取接口实例
  TerytService := TTerytWs1Soap(htpr1 as TTerytWs1Soap);
  try
    // 调用具体方法,这里以获取省份列表为例
    ProvinceList := TerytService.PobierzListeWojewodztwo;
    // 处理返回结果,比如遍历显示
    ShowMessage('成功获取到 ' + IntToStr(Length(ProvinceList)) + ' 个省份');
  except
    on E: ESOAPException do
      ShowMessage('SOAP服务错误: ' + E.Message);
    on E: Exception do
      ShowMessage('调用失败: ' + E.Message);
  end;
end;

注意:具体方法名和返回类型要以你导入WSDL后生成的代码为准,不同版本的Delphi导入工具生成的命名可能略有差异。

4. 处理HTTPS/SSL问题

因为服务是HTTPS协议,需要确保Delphi的SOAP组件能正确处理SSL证书:

  • 如果你用的是Delphi 10.3及以上版本,默认的HTTPWebNode使用WinHTTP,一般能自动信任正规CA颁发的证书(这个测试服务的证书是正规的,所以没问题)
  • 如果遇到SSL证书错误(比如测试环境自签名证书),可以临时开启忽略错误(生产环境不建议):
htprqrsp1.Properties.Values['IgnoreSSLErrors'] := 'True';

5. 调试技巧

如果调用失败,推荐以下调试方法:

  • 开启SOAP调试日志:给htpr1.Converter.Options添加soDebug,然后查看生成的请求/响应XML
  • 用抓包工具捕获HTTP请求,检查认证头是否存在、请求格式是否正确
  • 查看Delphi生成的WSDL导入代码,确认方法参数和返回类型是否正确

内容的提问来源于stack exchange,提问作者user1762186

火山引擎 最新活动