【问题标题】:Get image using imgur API in Ruby (on Rails)在 Ruby 中使用 imgur API 获取图像(在 Rails 上)
【发布时间】:2026-01-24 14:40:02
【问题描述】:

我正在尝试使用提供的 API 与 Ruby 2.0.0 和 Rails 4.0.0 从 imgur 中提取图像。我尝试以 Ruby 2.0.0 文档中列出的各种方式构建 http 请求,但均无济于事。

代码如下:

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_idmy_client_id 只是用适当的值硬编码。 (imgur 方法在与我网站的根 url 对应的控制器操作中调用)

这是我在运行 rails s(所以我使用 localhost:3000)然后访问根 URL localhost:3000(它确实调用了调用 imgur 的操作)时得到的响应:

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

更新:

另外,这有效:

curl --header "Authorization: Client-ID my_client_id" @987654321@

(同样,my_client_id 是用我的实际客户端 ID 硬编码的)。现在让它在 Ruby 上工作......

有人知道正确的做法吗?

【问题讨论】:

  • 如果你使用 curl 或 wget 和这些参数,它是否有效?
  • 这有效:$ curl --header "Authorization: Client-ID XXXXXXXXX" api.imgur.com/3/gallery/7x98w9T.json 其中 X 是我的客户 ID...imgur 图像 ID 是我随机挑选的图像的 ID
  • 在上面的评论中我的意思是输入 api.imgur.com/3/gallery/image/7x98w9T.json (尽管我测试了我在上面的评论中实际写的内容,它也可以工作...... )
  • 可能是因为它是https*.com/questions/5786779/…
  • @VladtheImpala,这是 https!我认为给 uri 一个以 https 开头的字符串可以解决问题,但它实际上并没有使用 SSL。让它工作!

标签: ruby-on-rails ruby imgur


【解决方案1】:

您需要启用 https 才能进行 https 调用。

http.use_ssl = true

我知道这已经解决了,但我想我会添加一个明确的答案。

【讨论】:

    【解决方案2】:

    正如@VladtheImpala 所指出的,问题在于 SSL。尽管我在 URI 字符串中包含了https,但 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
    

    像魅力一样工作;)

    【讨论】: