1

Rails POST リクエストを外部サービスに対して実行しようとしていますが、これは大まかに次のようになります。

def self.send_post_request(domain, data)
 uri = URI.parse(domain)
 http = Net::HTTP.new(uri.host, uri.port)
 request = Net::HTTP::Post.new(uri.request_uri)
 request.set_form_data(data)
 http.use_ssl = true if domain =~ /^https/
 response = http.request(request)
end

ローカルでは問題なく動作しますが、heroku にデプロイすると、次のエラーが発生します。

SocketError: getaddrinfo: Temporary failure in name resolution

これを修正する方法について何か考えはありますか?

あなたの助けは大歓迎です!!

編集:これらは、それぞれのモデルに含めているライブラリです:

require "net/http"
require "net/https"
require "uri"

これは、実際のエラーの後にコンソールがスローするものです。

from /usr/local/lib/ruby/1.9.1/net/http.rb:644:in `initialize'
from /usr/local/lib/ruby/1.9.1/net/http.rb:644:in `open'
from /usr/local/lib/ruby/1.9.1/net/http.rb:644:in `block in connect'
from /usr/local/lib/ruby/1.9.1/timeout.rb:44:in `timeout'
from /usr/local/lib/ruby/1.9.1/timeout.rb:89:in `timeout'
from /usr/local/lib/ruby/1.9.1/net/http.rb:644:in `connect'
from /usr/local/lib/ruby/1.9.1/net/http.rb:637:in `do_start'
from /usr/local/lib/ruby/1.9.1/net/http.rb:626:in `start'
from /usr/local/lib/ruby/1.9.1/net/http.rb:1168:in `request'
from /app/app/models/message.rb:224:in `send_post_request'
from /app/app/models/message.rb:46:in `opt_in_text'
from (irb):2
from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/console.rb:47:in `start'
from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/console.rb:8:in `start'
from /app/vendor/bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands.rb:41:in `<top (required)>'
4

1 に答える 1

7

接続の一時的な失敗のようです。関数で再試行してください。

def self.send_post_request(domain, data, retry_attempts=0)
  uri = URI.parse(domain)
  http = Net::HTTP.new(uri.host, uri.port)
  request = Net::HTTP::Post.new(uri.request_uri)
  request.set_form_data(data)
  http.use_ssl = true if domain =~ /^https/
  response = http.request(request)
rescue SocketError => error
  if retry_attempts > 0
    retry_attempts -= 1
    sleep 5 
    retry
  end
  raise
end
于 2013-01-09T22:19:25.087 に答える