HTTParty 把正向代理解析为请求选项。让服务 URL 保持为第一个参数:

response = HTTParty.get(
  'https://api.example/items',
  http_proxyaddr: 'proxy.example',
  http_proxyport: 8080,
  http_proxyuser: ENV.fetch('PROXY_USER'),
  http_proxypass: ENV.fetch('PROXY_PASSWORD'),
  headers: { 'Authorization' => "Bearer #{ENV.fetch('API_TOKEN')}" },
  open_timeout: 5,
  read_timeout: 15
)
puts response.code

代理主机和端口指向中间人,代理用户名和密码在那里认证。Authorization 请求头属于 API,其账号可以完全不同。

如果代理不需要认证,就省略 http_proxyuser 和 http_proxypass。在允许的公共线路上发起公共 API 请求时,从HTTP 代理列表里取一个 HTTP 地址,且请求和类的默认值里都不要保留代理凭据。host 字段是作为代理地址传给 Net::HTTP 的;主机名要和端口分开给,而不是目标 URL 或 PAC URL。

包含 HTTParty 的包装类也可以改用它的 http_proxy 类方法设置默认值。对提供这些选项的那次调用来说,请求选项会覆盖这些默认值。

这里说的是 HTTParty 的默认连接适配器。自定义 connection_adapter 负责解释自己的选项,所以当某个有效设置看起来被忽略时,要去检查那个适配器。HTTP 状态要和解析后的 API 数据分开读;JSON 解析成功并不是认证结果。

相关文章