EOFError: конец файла достиг проблемы с Net:: HTTP
Я использую ruby-1.8.7-p302/Rails 2.3.11. Я пытаюсь использовать FQL (Facebook api), чтобы получить статистику для ссылки. Вот мой код:
def stats(fb_post_url)
url = BASE_URI + "?query=#{URI.encode("select like_count from link_stat where url="#{fb_post_url}"")}"
parsed_url = URI.parse(url)
http = Net::HTTP.new(parsed_url.host, parsed_url.port)
request = Net::HTTP::Get.new(parsed_url.request_uri)
response = http.request(request)
response.inspect
end
и вот ошибка:
EOFError: end of file reached
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `sysread'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:67:in `timeout'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:101:in `timeout'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/protocol.rb:126:in `readline'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2028:in `read_status_line'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:2017:in `read_new'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1051:in `request'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1037:in `request'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:543:in `start'
from /home/rahul/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/net/http.rb:1035:in `request'
from /home/rahul/Work/Radr/lib/fb_stats.rb:13:in `stats'
from (irb):10
это, кажется, происходит только в случае api facebook. Кроме того, я видел, что в некоторых сообщениях это может быть ошибка в Net::HTTP.
6 ответов:
Если URL использует https вместо http, вам нужно добавить следующую строку:
parsed_url = URI.parse(url) http = Net::HTTP.new(parsed_url.host, parsed_url.port) http.use_ssl = true
обратите внимание на дополнительные
http.use_ssl = true
.и более подходящий код, который будет обрабатывать как http, так и https, будет похож на следующий.
url = URI.parse(domain) req = Net::HTTP::Post.new(url.request_uri) req.set_form_data({'name'=>'Sur Max', 'email'=>'some@email.com'}) http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") response = http.request(req)
Смотрите больше в моем блоге:EOFError: конец файла достиг проблемы при публикации формы с Net:: HTTP.
У меня была аналогичная проблема с запросом на службу без SSL.
этот блог предложил неопределенно попробовать кодирование URI URL, который передается в "get":http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
Я выстрелил в него, основываясь на отчаянии, и в моем ограничительном тестировании это, похоже, исправило его для меня. Мой новый код:
@http = Net::HTTP.new('domain.com') @http = @http.start url = 'http://domain.com/requested_url?blah=blah&etc=1' req = Net::HTTP::Get.new(URI.encode(url)) req.basic_auth USERNAME, API_KEY res = @http.request(req)
обратите внимание, что я использую @http.начните, как я хочу, чтобы поддерживать сеанс HTTP более несколько запросов. Кроме того, вы можете попробовать наиболее актуальную часть, которая является: URI.кодирование(адрес) внутри get call
У меня была та же проблема, ruby-1.8.7-p357 ,пробовал кучу вещей напрасно...
Я наконец понял, что это происходит только при нескольких вызовах, используя один и тот же экземпляр XMLRPC::Client !
Итак, теперь я повторно создаю экземпляр моего клиента при каждом вызове, и он просто работает :/
я обнаружил, что я периодически сталкиваюсь с проблемами Net::HTTP и Net::FTP, и когда я это делаю, окружая вызов с таймаутом (), все эти проблемы исчезают. Так где это будет иногда висеть в течение 3 минут или около того, а затем поднять EOFError:
res = Net::HTTP.post_form(uri, args)
это всегда помогало мне:
res = timeout(120) { Net::HTTP.post_form(uri, args) }
после проведения некоторых исследований, это происходило в Руби
XMLRPC::Client
библиотека - которая используетNET::HTTP
. Клиент используетstart()
методNET::HTTP
который сохраняет соединение открытым для будущих запросов.Это произошло ровно через 30 секунд после последних запросов - поэтому я предполагаю, что сервер, на который он попадает, закрывает запросы после этого времени. Я не уверен, что по умолчанию для
NET::HTTP
оставить заявку открытой, но я собираюсь проверить с 60 секунд, чтобы увидеть если это решит проблему.