Я использую 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.
ruby-on-rails
ruby
web-services
facebook-fql
Рахул Сингх
источник
источник
Ответы:
Если URL использует https вместо http, вам нужно добавить следующую строку:
Обратите внимание на дополнительное
http.use_ssl = true
.И более подходящий код, который будет обрабатывать как http, так и https, будет похож на следующий.
Смотрите больше в моем блоге: EOFError : достигнут конец файла при публикации формы с Net :: HTTP .
источник
http
иreq
.У меня была похожая проблема с запросом к службе без SSL.
В этом блоге смутно предлагалось попробовать URI, кодирующий URL, который передается в «get»: http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
Я сделал снимок, основываясь на отчаянии, и в моем ограниченном тестировании это, кажется, исправило это для меня. Мой новый код:
Обратите внимание, что я использую @ http.start, поскольку хочу поддерживать HTTP-сессию по нескольким запросам. Кроме этого, вы можете попробовать наиболее релевантную часть: URI.encode (url) внутри вызова get
источник
Я обнаруживаю, что периодически сталкиваюсь с такими проблемами, как Net :: HTTP и Net :: FTP, и когда я это делаю, окружение вызова timeout () делает все эти проблемы исчезающими. Так, где это будет иногда зависать в течение 3 минут или около того, а затем вызвать EOFError:
Это всегда исправляет это для меня:
источник
У меня была такая же проблема, ruby-1.8.7-p357, и я много чего перепробовал ...
Я наконец понял, что это происходит только при нескольких вызовах, использующих один и тот же экземпляр XMLRPC :: Client!
Так что теперь я заново создаю экземпляр моего клиента при каждом вызове, и он просто работает: |
источник
После некоторого исследования это происходило в
XMLRPC::Client
библиотеке Руби - которая используетNET::HTTP
. Клиент используетstart()
метод, вNET::HTTP
котором соединение остается открытым для будущих запросов.Это произошло точно через 30 секунд после последних запросов - поэтому я предполагаю, что сервер, к которому он подключается, закрывает запросы по истечении этого времени. Я не уверен, что по умолчанию используется для того,
NET::HTTP
чтобы оставить запрос открытым, но я собираюсь протестировать с 60 секундами, чтобы увидеть, решит ли это проблему.источник
Я столкнулся с этим недавно и в конце концов обнаружил, что это было вызвано таймаутом сети от конечной точки, к которой мы подключались. К счастью для нас, мы смогли увеличить продолжительность тайм-аута.
Чтобы убедиться, что это наша проблема (а на самом деле не проблема с net http), я сделал тот же запрос с помощью curl и подтвердил, что запрос был прерван.
источник
В Ruby on Rails я использовал этот код, и он отлично работает:
источник