5

我正在尝试使用提供的带有 Ruby 2.0.0 和 Rails 4.0.0 的 API 从 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

whereimg_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" https://api.imgur.com/3/gallery/image/7x98w9T.json

(再次,my_client_id使用我的实际客户端 ID 进行硬编码)。现在让它在 Ruby 上工作......

有人知道这样做的正确方法吗?

4

2 回答 2

6

您需要启用 https 才能进行 https 呼叫。

http.use_ssl = true

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

于 2013-07-24T22:20:23.707 回答
4

正如@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

奇迹般有效 ;)

于 2013-07-24T22:21:18.790 回答