2013-07-24 1 views
5

Я пытаюсь извлечь изображение из imgur, используя предоставленный API с Ruby 2.0.0 и Rails 4.0.0. Я попытался создать HTTP-запрос различными способами, как указано в документах Ruby 2.0.0, безрезультатно.Получите изображение, используя imgur API в Ruby (on Rails)

Вот код:

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 

где img_id и my_client_id просто жёстко с соответствующими значениями. (imgur метод вызывается внутри действия контроллера, соответствующего корневому URL-адресу моего сайта)

Это ответ, который я возвращаю, когда я запускаю rails s (так что я использую localhost: 3000), а затем зайдите в корень url, localhost: 3000 (что делает вызвать действие, которое вызывает imgur):

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

UPDATE:

Кроме того, это сработало:

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

(опять же, my_client_id имеет жесткий код с моим фактическим идентификатором клиента). Теперь, чтобы заставить его работать на Ruby ...

Кто-нибудь знает правильный способ сделать это?

+0

, если вы используете завиток или Wget с этими параметрами он работает? – rogerdpack

+0

это сработало: $ curl --header «Авторизация: идентификатор клиента XXXXXXXXX» https://api.imgur.com/3/gallery/7x98w9T.json, где X - это мой идентификатор клиента ... идентификатор изображения imgur является одним для изображения, которое я выбрал случайно –

+0

в комментарии выше, я намеревался напечатать api.imgur.com/3/gallery/image/7x98w9T.json (хотя я протестировал то, что я на самом деле написал в вышеупомянутом комментарии, и он также работает ...) –

ответ

6

Вам необходимо включить https для вызова https.

http.use_ssl = true 

Я знаю, что это было выяснено, но я решил, что добавлю явный ответ.

3

Как указано в @VladtheImpala, проблема связана с SSL. Хотя я включил https в строку URI, HTTP-запрос не был фактически использован SSL. Вот код, где я явно задать запрос HTTP для использования 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 

работает как шарм;)

Смежные вопросы