with simple rails how create crear ruby-on-rails ruby web-services facebook-fql

ruby on rails - simple - EOFError: el final del archivo alcanzó el problema con Net:: HTTP



how to create an api in rails (6)

Estoy usando ruby-1.8.7-p302 / Rails 2.3.11. Estoy tratando de usar fql (facebook api) para obtener estadísticas para 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 algunas publicaciones que esto podría ser un error en Net :: HTTP.


Después de investigar un poco, esto estaba sucediendo en la biblioteca XMLRPC::Client Ruby, que usa NET::HTTP . El cliente usa el método start() en NET::HTTP que mantiene la conexión abierta para futuras solicitudes.

Esto sucedió exactamente 30 segundos después de las últimas solicitudes. Por lo tanto, mi suposición es que el servidor al que está accediendo cierra las solicitudes después de ese momento. No estoy seguro de cuál es el valor predeterminado para NET::HTTP para mantener la solicitud abierta, pero estoy a punto de probar con 60 segundos para ver si eso resuelve el problema.


En los rieles utilicé este código y funciona perfectamente

req_profilepic = ActiveSupport::JSON.decode(open(URI.encode("https://graph.facebook.com/me/?fields=picture&type=large&access_token=#{fb_access_token}"))) profilepic_url = req_profilepic[''picture'']

Espero que te ayude :)


Me parece que me encuentro periódicamente con los problemas Net :: HTTP y Net :: FTP, y cuando lo hago, rodear la llamada con un timeout () hace que todos estos problemas desaparezcan. Entonces, cuando esto se cuelgue de vez en cuando durante 3 minutos más o menos y luego levante un EOFError:

res = Net::HTTP.post_form(uri, args)

Esto siempre me lo arregla:

res = timeout(120) { Net::HTTP.post_form(uri, args) }


Si la URL usa https en lugar de http, debe agregar la siguiente línea:

parsed_url = URI.parse(url) http = Net::HTTP.new(parsed_url.host, parsed_url.port) http.use_ssl = true

Tenga en cuenta el http.use_ssl = true adicional http.use_ssl = true .

Y el código más apropiado que manejaría tanto http como https será similar al siguiente.

url = URI.parse(domain) req = Net::HTTP::Post.new(url.request_uri) req.set_form_data({''name''=>''Sur Max'', ''email''=>''[email protected]''}) http = Net::HTTP.new(url.host, url.port) http.use_ssl = (url.scheme == "https") response = http.request(req)

Ver más en mi blog: EOFError: el final del archivo llegó al problema al publicar un formulario con Net :: HTTP .


Tuve el mismo problema, ruby-1.8.7-p357, probé muchas cosas en vano ...

¡Finalmente me di cuenta de que solo ocurre en llamadas múltiples usando la misma instancia de XMLRPC :: Client!

Así que ahora estoy volviendo a crear instancias de mi cliente en cada llamada y simplemente funciona: |


Tuve un problema similar con una solicitud a un servicio no SSL.

Este blog sugirió vagamente probar el URI que codifica la URL que se pasa a ''get'': http://www.loudthinking.org/2010/02/ruby-eoferror-end-of-file-reached.html

Discutí, basado en la desesperación, y en mis pruebas limitativas, esto parece haberlo solucionado. Mi nuevo código es:

@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)

Tenga en cuenta que utilizo @ http.start porque quiero mantener la sesión HTTP en varias solicitudes. Aparte de eso, le gustaría probar la parte más relevante que es: URI.encode (url) dentro de la llamada get