【问题标题】:Ruby - Send GET request with headersRuby - 发送带有标头的 GET 请求
【发布时间】:2017-06-30 05:56:43
【问题描述】:

我正在尝试将 ruby​​ 与网站的 api 一起使用。说明是发送带有标头的 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);

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

【问题讨论】:

    标签: ruby http http-headers


    【解决方案1】:

    按照问题的建议使用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 吗?
    • 我想我找到了答案:就是把Net::HTTP.start这一行改成Net::HTTP.start(uri.host, uri.port, :use_ssl =&gt; uri.scheme == 'https')
    • @nonopoloarity 您如何从中获得响应正文?
    【解决方案2】:

    安装httparty gem,它使请求更容易,然后在你的脚本中

    require 'httparty'
    
    url = 'http://someexample.com'
    headers = {
      key1: 'value1',
      key2: 'value2'
    }
    
    response = HTTParty.get(url, headers: headers)
    puts response.body
    

    然后运行您的.rb 文件..

    【讨论】:

    • 我自己更喜欢RestClient,但这也是一个流行的。 :)
    • @SergioTulentsev 有什么具体原因还是只是个人喜好?
    • 在我看来,httparty 是针对那些奇怪的嵌入场景的。在模型或服务中包含 httparty 模块的地方,它突然可以进行远程调用。但是,是的,它也可以清楚地独立工作。我更喜欢restclient,因为它没有为我提供选择。 :)
    • 感谢推荐!
    【解决方案3】:

    从 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)。

    【讨论】:

      猜你喜欢
      • 2011-09-20
      • 2015-02-22
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      相关资源
      最近更新 更多