2012-09-10 3 views
0

"소켓 오류 : 이름 확인에 임시 실패 : getaddrinfo를"레일 POST : Heroku가에하지만이 같은 약 보이는 외부 서비스에 레일 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)>' 
+1

GoDaddy DNS 서버를 사용하는 서비스가 있습니까? DNS를 포함하여 현재 다운 된 상태이며, 해결 된 DNS가 로컬에 캐시되어있을 수도 있지만 Heroku는 그렇지 않을 수도 있습니다. –

+0

감사합니다. – tomburger

답변

5

그것을 연결에 일시적인 오류가 발생한 것 같습니다. 아마도 함수에서 다시 시도 할 것입니까?

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