在使用 HTTPI 的 Savon 客户端中,代理属于客户端选项的一部分。它在获取远程 WSDL 和发送 SOAP 请求时都会生效。

client = Savon.client(
  wsdl: 'https://service.example/soap?wsdl',
  proxy: ENV.fetch('SOAP_PROXY_URL'),
  open_timeout: 5,
  read_timeout: 15
)

示例假定使用 HTTPI 传输。请通过环境变量提供经批准的代理 URL。对于允许未认证 HTTP 中间人的公开 SOAP 测试,HTTP 代理列表中的候选地址可以提供该 URL;请把服务认证与代理认证的决策分开。如果所支持的认证方式使用 URL 内的凭据,请对这些凭据中的保留字符进行编码,并让生成的 URL 远离日志。

Savon 称这些为“全局选项”,但它们只对单个客户端实例有效。在别处创建的另一个客户端不会自动继承该代理。

在复用该片段前,请确认已安装的传输层。Savon 当前文档把这些选项归属于 HTTPI;其 Faraday 传输层通过 client.faraday 有自己的一套设置接口,并拒绝这些 HTTPI 专有选项。请配置所选的传输层,而不要混用两种接口。

请把代理账户与 SOAP 服务凭据及 WS-Security 值分开。代理的 407、服务的 HTTP 登录质询以及 SOAP fault 标识的是不同的交互。WSDL 获取可能在客户端尚未执行任何应用操作之前就失败。

相关文章