2013-07-24 12 views
5

Sto cercando di estrarre un'immagine da imgur utilizzando l'API fornita con Ruby 2.0.0 e Rails 4.0.0. Ho provato a costruire una richiesta http in vari modi, come elencato nei documenti Ruby 2.0.0 senza alcun risultato.Ottieni immagini usando l'API imgur in Ruby (su Rails)

Ecco il codice:

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 

dove img_id e my_client_id sono solo hard-coded con i valori appropriati. (Il metodo imgur viene chiamato all'interno di un'azione del controller corrispondente all'URL di root del mio sito)

Questa è la risposta che ottengo quando corro rails s (quindi sto usando localhost: 3000) e poi visita l'url di root, localhost: 3000 (che chiamerà l'azione che chiama imgur):

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

UPDATE:

Inoltre, questo ha funzionato:

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

(di nuovo, my_client_id è hardcoded con il mio ID cliente effettivo). Ora per farlo funzionare su Ruby ...

Qualcuno conosce il modo giusto per farlo?

+0

se si utilizza curl o wget con quei parametri funziona? – rogerdpack

+0

ha funzionato: $ curl --header "Autorizzazione: ID cliente XXXXXXXXX" https://api.imgur.com/3/gallery/7x98w9T.json dove le X sono il mio ID cliente ... l'ID immagine imgur è uno per un'immagine ho scelto a caso –

+0

nel commento sopra intendevo digitare api.imgur.com/3/gallery/image/7x98w9T.json (anche se ho provato quello che ho effettivamente scritto nel commento sopra e funziona anche ...) –

risposta

6

È necessario abilitare https per effettuare una chiamata https.

http.use_ssl = true 

So che questo è stato capito, ma ho pensato di aggiungere una risposta esplicita.

3

Come sottolineato da @VladtheImpala, il problema è con SSL. Anche se ho incluso https nella stringa URI, la richiesta HTTP non stava infatti utilizzando SSL. Ecco il codice in cui ho impostato in modo esplicito la richiesta HTTP per utilizzare 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 

funziona come un fascino;)