2013-07-24 18 views
5

Próbuję pobrać obraz z imguru za pomocą dostarczonego API z Ruby 2.0.0 i Rails 4.0.0. Próbowałem zbudować żądanie http na różne sposoby, jak wymienione w dokumentach Ruby 2.0.0, bezskutecznie.Pobierz obraz za pomocą interfejsu API imgur w Ruby (na szynach)

Oto kod:

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 

gdzie img_id i my_client_id dopiero ustalony z odpowiednimi wartościami. (Metoda imgur wywoływana jest w ramach działania kontrolera odpowiadającego adresowi URL mojej witryny)

To jest odpowiedź, którą otrzymuję, gdy uruchamiam rails s (używam localhost: 3000), a następnie odwiedzam adres root, localhost: 3000 (który ma wywołać działania, które nazywa imgur):

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

UPDATE:

również ten pracował:

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

(ponownie, my_client_id jest zakodowana na stałe przy pomocy mojego rzeczywistego identyfikatora klienta). Teraz, aby działało na Ruby ...

Ktoś wie, jak to zrobić?

+0

jeśli używasz curl lub wget z tych parametrów to działa? – rogerdpack

+0

to działało: $ curl - nagłówek "Autoryzacja: Client-ID XXXXXXXXX" https://api.imgur.com/3/gallery/7x98w9T.json gdzie X to mój identyfikator klienta ... identyfikator obrazu imgura to jeden dla obrazu zaznaczonego losowo –

+0

w powyższym komentarzu chciałem wpisać api.imgur.com/3/gallery/image/7x98w9T.json (chociaż testowałem to, co faktycznie napisałem w powyższym komentarzu i działa również ...) –

Odpowiedz

6

Musisz włączyć https, aby wykonać połączenie https.

http.use_ssl = true 

Wiem, że to zostało wymyślone, ale pomyślałem, że dodam wyraźną odpowiedź.

3

Jak podkreślił @VladtheImpala, problem dotyczy protokołu SSL. Chociaż w łańcuchu URI zawarłem https, żądanie HTTP w rzeczywistości nie korzystało z protokołu SSL. Oto kod, gdzie wyraźnie określone żądanie HTTP do korzystania z 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 

działa jak marzenie;)