Estoy usando ruby-1.8.7-p302 / Rails 2.3.11. Estoy tratando de usar FQL (Facebook API) para obtener estadísticas de un enlace. Aquí está mi código:
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
Y aquí está el error:
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
Esto parece estar sucediendo solo en el caso de la API de Facebook. Además, vi que sugería en alguna publicación que esto podría ser un error en Net :: HTTP.
ruby-on-rails
ruby
web-services
facebook-fql
Rahul Singh
fuente
fuente
Respuestas:
Si la URL usa https en lugar de http, debe agregar la siguiente línea:
Tenga en cuenta el adicional
http.use_ssl = true
.Y el código más apropiado que manejaría tanto http como https será similar al siguiente.
Vea más en mi blog: EOFError: se alcanzó el problema al final del archivo al publicar un formulario con Net :: HTTP .
fuente
http
yreq
.Tuve un problema similar con una solicitud a un servicio que no es SSL.
Este blog sugirió vagamente intentar URI que codifica la URL que se pasa a 'get': http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html
Lo intenté, basado en la desesperación, y en mis pruebas limitantes esto parece haberme solucionado. Mi nuevo código es:
Tenga en cuenta que uso @ http.start porque quiero mantener la sesión HTTP en varias solicitudes. Aparte de eso, es posible que desee probar la parte más relevante que es: URI.encode (url) dentro de la llamada get
fuente
Encuentro que me encuentro con Net :: HTTP y Net :: FTP problemas como este periódicamente, y cuando lo hago, rodear la llamada con un tiempo de espera () hace que todos esos problemas desaparezcan. Entonces, donde esto ocasionalmente se bloqueará durante 3 minutos más o menos y luego elevará un EOFError:
Esto siempre me lo arregla:
fuente
Tuve el mismo problema, ruby-1.8.7-p357, y probé muchas cosas en vano ...
¡Finalmente me di cuenta de que sucede solo en varias llamadas que usan la misma instancia XMLRPC :: Client!
Así que ahora vuelvo a crear instancias de mi cliente en cada llamada y simplemente funciona: |
fuente
Después de investigar un poco, esto sucedía en la
XMLRPC::Client
biblioteca de Ruby, que utilizaNET::HTTP
. El cliente utiliza elstart()
métodoNET::HTTP
que mantiene la conexión abierta para futuras solicitudes.Esto sucedió exactamente a los 30 segundos después de las últimas solicitudes, por lo que supongo que el servidor al que está llegando está cerrando solicitudes después de ese momento. No estoy seguro de cuál es el valor predeterminado para
NET::HTTP
mantener abierta la solicitud, pero estoy a punto de probar con 60 segundos para ver si eso resuelve el problema.fuente
Me encontré con esto recientemente y finalmente descubrí que esto fue causado por un tiempo de espera de la red desde el punto final que estábamos alcanzando. Afortunadamente para nosotros pudimos aumentar la duración del tiempo de espera.
Para verificar que este era nuestro problema (y en realidad no era un problema con net http), hice la misma solicitud con curl y confirmó que la solicitud estaba siendo cancelada.
fuente
En Ruby on Rails utilicé este código, y funciona perfectamente:
fuente