2013-07-24 12 views
5

Ich versuche, ein Bild von Imgur mit der bereitgestellten API mit Ruby 2.0.0 und Rails 4.0.0 zu ziehen. Ich habe versucht, eine HTTP-Anfrage auf verschiedene Arten zu erstellen, wie in den Ruby 2.0.0-Dokumenten aufgeführt, ohne Erfolg.Get Bild mit Imgur API in Ruby (on Rails)

Hier ist der Code:

require 'net/http' 
require 'net/https' 
def imgur 
    headers = { 
    "Authorization" => "Client-ID " + my_client_id 
    } 
    path  = "/3/gallery/image/#{img_id}.json" 
    uri = URI("https://api.imgur.com"+path) 
    request, data = Net::HTTP::Get.new(path, headers) 

    response = Net::HTTP.new(uri.host, uri.port).start {|http| http.request(request) } 
    puts "response:" 
    p response 
    puts response 
end 

wo img_id und my_client_id sind nur mit den entsprechenden Werten fest einprogrammiert. (imgur Methode wird innerhalb einer Controller-Aktion aufgerufen, die der Root-URL meiner Site entspricht)

Dies ist die Antwort, die ich bekomme, wenn ich rails s ausführen (so verwende ich localhost: 3000) und dann besuchen Sie die Root-URL, localhost: 3000 (die die Aktion tut aufrufen, die imgur ruft):

#<Net::HTTPBadRequest 400 Bad Request readbody=true> 
#<Net::HTTPBadRequest:0x007f8a6ce0da78> 

UPDATE:

auch dies funktioniert:

curl --header "Authorization: Client-ID my_client_id" https://api.imgur.com/3/gallery/image/7x98w9T.json

(wiederum ist my_client_id mit meiner tatsächlichen Client-ID hardcoded). Jetzt um es auf Ruby zu arbeiten ...

Wer weiß den richtigen Weg, dies zu tun?

+0

wenn Sie curl verwenden oder wget mit diesen Parametern funktioniert es? – rogerdpack

+0

das funktioniert: $ curl --header "Autorisierung: Client-ID XXXXXXXXX" https://api.imgur.com/3/gallery/7x98w9T.json wo die X sind meine Client-ID ... die Imgur Image-ID ist eine für ein Bild wählte ich zufällig –

+0

in den Kommentar oben wollte ich api.imgur.com/3/gallery/image/7x98w9T.json schreiben (obwohl ich getestet, was ich tatsächlich in den obigen Kommentar geschrieben und es funktioniert auch ...) –

Antwort

6

Sie müssen HTTPS aktivieren, um einen HTTPS-Anruf zu tätigen.

http.use_ssl = true 

Ich weiß, das wurde herausgefunden, aber ich dachte, ich würde eine explizite Antwort hinzufügen.

3

Wie @VladtheImpala darauf hingewiesen, ist das Problem mit SSL. Obwohl ich https in die URI-Zeichenfolge eingefügt habe, verwendete die HTTP-Anfrage tatsächlich nicht SSL. Hier ist der Code, wo ich ausdrücklich die HTTP-Anforderung setzen die Verwendung von SSL:

require 'net/http' 
require 'net/https' 

def imgur  
    puts "Let's get some pics" 

    headers = { 
    "Authorization" => "Client-ID my_client_id" 
    } 

    #http  = Net::HTTP.new("https://api.imgur.com") 
    path  = "/3/gallery/image/7x98w9T.json" 
    uri = URI.parse("https://api.imgur.com"+path) 
    request, data = Net::HTTP::Get.new(path, headers) 
    http = Net::HTTP.new(uri.host, uri.port) 
    http.use_ssl = true 
    response = http.request(request) 
    puts response.body 
end 

funktioniert wie ein Charme;)