Ruby - 使用标头发送GET请求

18

我正在尝试使用Ruby与一个网站的API进行交互。网站给出的指示是发送一个带有header的GET请求,并提供了以下PHP代码示例。我需要计算一个HMAC哈希并将其包含在apisign头中。

$apikey='xxx';
$apisecret='xxx';
$nonce=time();
$uri='https://bittrex.com/api/v1.1/market/getopenorders?apikey='.$apikey.'&nonce='.$nonce;
$sign=hash_hmac('sha512',$uri,$apisecret);
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('apisign:'.$sign));
$execResult = curl_exec($ch);
$obj = json_decode($execResult);

我只是在Windows的命令提示符中使用带有Ruby安装的.rb文件。 我在Ruby文件中使用net/http。 如何发送带有标头的GET请求并打印响应?

3个回答

30

使用net/http,如问题所建议。

参考资料:

例如:

require 'net/http'    

uri = URI("http://www.ruby-lang.org")
req = Net::HTTP::Get.new(uri)
req['some_header'] = "some_val"

res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') { |http|
  http.request(req)
}

puts res.body # <!DOCTYPE html> ... </html> => nil

注意:如果你的 response 的 HTTP 状态码为 301(永久重定向),请参见Ruby Net::HTTP - following 301 redirects


如果我使用 URI("https://www.google.com/search?q=what+is+my+user+agent"),那么程序就无法工作,并显示错误信息 end of file reached (EOFError)。我认为这是由于 URL 中的 https 导致的。这个程序能否适用于任何 URL? - nonopolarity
6
我认为我找到了答案:将Net::HTTP.start改为Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') - nonopolarity
@nonopoloarity 你怎么将响应体从中取出? - not2qubit

18
安装 httparty gem,它可以使请求更加便捷,在您的脚本中使用。
require 'httparty'

url = 'http://someexample.com'
headers = {
  key1: 'value1',
  key2: 'value2'
}

response = HTTParty.get(url, headers: headers)
puts response.body

然后运行您的.rb文件。


1
我个人更喜欢RestClient,但这也是一个受欢迎的。 :) - Sergio Tulentsev
@SergioTulentsev 有具体原因还是个人喜好? - Md. Farhan Memon
在我看来,httparty 是为那些奇怪的嵌入式场景而设计的。你可以在你的模型或服务中包含 httparty 模块,然后它就可以进行远程调用。但是,它也可以独立工作。我更喜欢 restclient,因为它不给我选择的余地。 :) - Sergio Tulentsev
谢谢推荐! - user4584963

7
截至Ruby 3.0,Net::HTTP.get_response 支持一个可选的头部哈希。
Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' })

很遗憾,这对于 Ruby 2(高达 2.7 版本)无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接