Ruby on rails 将HTTP代理与Savon一起使用

Ruby on rails 将HTTP代理与Savon一起使用,ruby-on-rails,ruby,savon,proximo,Ruby On Rails,Ruby,Savon,Proximo,我需要从Heroku访问带有IP白名单的服务,这就需要HTTP代理 我配置了Proximo插件,并且有一个近似于http://proxy:secret-key@proxy-0-0-0-0.proximo.io 在Savon中,我尝试过如下配置代理: client = Savon.client(wsdl: my_wsdl, proxy: "http://proxy:secret-key@proxy-0-0-0-0.proximo.io") 但当我提出请求时: 客户端操作 我得到一个代理错误: W

我需要从Heroku访问带有IP白名单的服务,这就需要HTTP代理

我配置了Proximo插件,并且有一个近似于
http://proxy:secret-key@proxy-0-0-0-0.proximo.io

在Savon中,我尝试过如下配置代理:

client = Savon.client(wsdl: my_wsdl, proxy: "http://proxy:secret-key@proxy-0-0-0-0.proximo.io")
但当我提出请求时:

客户端操作

我得到一个代理错误:

Wasabi::Resolver::HTTPError: Error: 407 for url http://mywsdl
        from /Users/ahamon/.gem/ruby/2.3.0/gems/wasabi3.5.0/lib/wasabi/resolver.rb:45:in `load_from_remote'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/wasabi3.5.0/lib/wasabi/resolver.rb:33:in `resolve'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/wasabi3.5.0/lib/wasabi/document.rb:142:in `xml'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/wasabi-3.5.0/lib/wasabi/document.rb:160:in `parse'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/wasabi-3.5.0/lib/wasabi/document.rb:147:in `parser'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/wasabi-3.5.0/lib/wasabi/document.rb:64:in `soap_actions'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/savon-2.11.1/lib/savon/client.rb:28:in `operations'
        from (irb):7
        from /Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/console.rb:110:in `start'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/console.rb:9:in `start'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:68:in `console'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'
Wasabi::Resolver::HTTPError:url错误:407http://mywsdl
from/Users/ahamon/.gem/ruby/2.3.0/gems/wasabi3.5.0/lib/wasabi/resolver.rb:45:in'load_from_remote'
from/Users/ahamon/.gem/ruby/2.3.0/gems/wasabi3.5.0/lib/wasabi/resolver.rb:33:in'resolve'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/wasabi3.5.0/lib/wasabi/document.rb:142:in`xml'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/wasabi-3.5.0/lib/wasabi/document.rb:160:in'parse'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/wasabi-3.5.0/lib/wasabi/document.rb:147:in'parser'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/wasabi-3.5.0/lib/wasabi/document.rb:64:in'soap_actions'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/savon-2.11.1/lib/savon/client.rb:28:in“operations”
来自(irb):7
来自/Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/console.rb:110:in'start'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/console.rb:9:in'start'
来自/Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/commands\u tasks.rb:68:在“控制台”中
来自/Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands/commands\u tasks.rb:39:in“run\u command!”
来自/Users/ahamon/.gem/ruby/2.3.0/gems/railties-4.2.4/lib/rails/commands.rb:17:in`'
从箱子/轨道:4:in“require”
从箱子/轨道:4:in`'

但是,没有代理选项,一切都正常。

我认为这应该可以

client = Savon.client(wsdl: my_wsdl, proxy: "http://proxy-0-0-0-0.proximo.io", basic_auth: ["proxy-user", "proxy-secret"])

我想我找到了解决办法。 不便之处在于手动获取WSDL并将其保存到本地文件中。 例如

您必须将以下内容添加到客户端定义中

...
secret = Base64.strict_encode64("#{user}:#{password}")
client = Savon.client(
    wsdl: 'globalweather.wsdl',
    proxy: "http://my-proxy.example.com:8080",
    headers: { "Proxy-Authorization" => "Basic #{secret}" },
    ...
)
基本上就是这样。 通过直接指定
名称空间
端点
,也可以完全不使用WSDL

Savon使用芥末处理WSDL。它还从服务器获取文档。Wasabi不使用Savon客户机定义中的参数。要改变这一点,就必须扩大芥末宝石


可以在此处找到运行脚本:。

我认为用户:password@url语法只能在浏览器中使用。您可以尝试基本身份验证。据我所知,Savon文档没有指定如何进一步配置代理(在版本2中)@SteffenRollerI认为,因为代理连接是底层http模块的一个功能,可能有所不同。使用来源,卢克!正如我们所说的源代码:)httpclient知道代理授权:。您可能需要在代码中签入应用它的位置。basic_auth。不管怎样,我都试过了。嘿,史蒂芬,我来看看!我以前尝试过在头中设置代理授权,但没有单独下载WSDL。哈-我赢得了我的第一个赏金-呼-呼:-)
...
secret = Base64.strict_encode64("#{user}:#{password}")
client = Savon.client(
    wsdl: 'globalweather.wsdl',
    proxy: "http://my-proxy.example.com:8080",
    headers: { "Proxy-Authorization" => "Basic #{secret}" },
    ...
)