Ruby httpclient:&x27;创建请求';:未定义的方法';每个';

Ruby httpclient:&x27;创建请求';:未定义的方法';每个';,ruby,httpclient,Ruby,Httpclient,说到红宝石,我是新手。现在我正在忙着写一个连接到。我正在尝试使用httpclient gem,但对于如何构建我的客户机,我有点困惑 #!/usr/bin/ruby require "httpclient" require 'base64' require 'hmac-sha1' require 'openssl' # Method definitions def get_date # Get the time and date in the necessary format resu

说到红宝石,我是新手。现在我正在忙着写一个连接到。我正在尝试使用httpclient gem,但对于如何构建我的客户机,我有点困惑

#!/usr/bin/ruby

require "httpclient"
require 'base64'
require 'hmac-sha1'
require 'openssl'

# Method definitions
def get_date
  # Get the time and date in the necessary format
  result = Time.now.strftime('%a, %d %b %Y %H:%M:%S GMT')
end

def get_signature(action,date,headers,resource,user,pass)

  string_to_sign = "#{action}

  #{date}
  #{headers}
  #{resource}\n"

  return Base64.encode64(OpenSSL::HMAC.digest('sha1', "#{user}:#{pass}", "#{string_to_sign}"))
end

# Initial variables
date = get_date
domain = "https://services.enterprisecloud.terremark.com"
password = 'password'
query = {}
tmrk_headers = Hash.new
tmrk_headers['x-tmrk-date: '] = date
tmrk_headers['x-tmrk-version: '] = '2013-06-01'

uri = '/cloudapi/spec/networks/environments/1'
url = "#{domain}#{uri}"
username = 'user@terremark.com'
verb = 'GET'

signature = get_signature(verb,date,tmrk_headers,uri,username,password)

tmrk_headers['Authorization: '] = "Basic \"#{signature}\""

puts signature

client = HTTPClient.new
client.get_content(url,query,tmrk_headers)

编辑:这不再有效,因为我已通过一些帮助超越此错误:

现在我不关心从连接返回什么。我只是想创建一个无错误的运行。例如,如果我在没有
client.get_content
行的情况下运行脚本,它将返回到一个没有问题的提示(给我的印象是,一切都运行得很干净,如果不是无用的话)

我该如何构造这个?
httpclient
文档使用带有外部标题的示例:

extheader = [['Accept', 'image/jpeg'], ['Accept', 'image/png']]
clnt.get_content(uri, query, extheader)
我假设查询是我定义的URI

在所有的现实中,它并不是一开始就正确设置的。我需要能够将
auth_header
变量中的字符串包含在要签名的字符串中,但签名实际上是变量的一部分。我显然在这方面制造了一个漏洞


对此,我们将不胜感激

EDIT2:已删除strace pastebin。添加Ruby回溯:

/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:1023:in `create_request': undefined method `each' for #<String:0x0000000207d1e8> (NoMethodError)
    from /home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:884:in `do_request'
    from /home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:959:in `follow_redirect'
    from /home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:594:in `get_content'
    from ./test.rb:42:in `<main>'
/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:1023:in'create_request':未定义的方法'each'for#(NoMethodError)
from/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:884:in'do_request'
from/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:959:in“follow_redirect”
from/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:594:in'get_content'
from./test.rb:42:in`'
编辑3:更新脚本;在进行必要的脚本修改后添加进一步的回溯:

/

home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:975:在“成功内容”中:意外响应:#(httpclient::BadResponseError)
from/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:594:in'get_content'
from./test.rb:52:in`'

您的回溯记录中所述的问题

/home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:1023:in `create_request': undefined method `each' for #<String:0x0000000207d1e8> (NoMethodError)
    from /home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:884:in `do_request'
    from /home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:959:in `follow_redirect'
    from /home/msnyder/.rvm/gems/ruby-2.1.1/gems/httpclient-2.3.4.1/lib/httpclient.rb:594:in `get_content'
    from ./test.rb:42:in `<main>'
我认为你的代码有两个地方有问题

  • 您正在为查询传递字符串值。具体地说,您正在传递
    uri
    ,它的值是我假设的您要点击的路径

  • 对于extra headers参数,您将传入
    full\u头中的字符串值

  • 要解决这个问题,您需要为第一个参数传入完整的url

    这意味着它应该是这样的:

    url = "https://services.enterprisecloud.terremark.com/cloudapi/spec/networks/environments/1"
    query = {} # if you have any parameters to pass in they should be here.
    headers = {
      "x-tmrk-date" => date, "x-tmrk-version" => "2014-01-01", 
      "Authorization" => "CloudApi AccessKey=#{access_key} SignatureType=HmacSHA1 Signature=#{signature}"
    }
    
    client = HTTPClient.new
    client.get_content(url, query, headers)
    

    你能至少显示一些stacktrace(错误堆栈)来说明你在标题中描述的错误是从哪里得到的吗?我添加了一个指向粘贴箱的链接。我不知道这是太多还是根本不是你需要的。希望它能有所帮助。这与我想要的不完全一样,我的意思是当你运行脚本时,你说你得到了这个错误
    'create_request':未定义的方法'each'
    ,应该带有一个ruby回溯,而不是
    strace
    明白了。我已经添加了回溯。忽略任何以前(现在已删除)的评论。我未能将外部标头参数更改为数组或哈希。
    uri = '/cloudapi/spec/networks/environments/1'
    url = "https://services.enterprisecloud.terremark.com"
    tmrk_headers = "x-tmrk-date:\"#{date}\"\nx-tmrk-version:2014-01-01"
    
    auth_header = "Authorization: CloudApi AccessKey=\"#{access_key}\" SignatureType=\"HmacSHA1\" Signature=\"#{signature}\""
    full_header = "#{tmrk_headers}\n#{auth_header}"
    
    client = HTTPClient.new
    client.get_content(url,uri,full_header)
    
    url = "https://services.enterprisecloud.terremark.com/cloudapi/spec/networks/environments/1"
    query = {} # if you have any parameters to pass in they should be here.
    headers = {
      "x-tmrk-date" => date, "x-tmrk-version" => "2014-01-01", 
      "Authorization" => "CloudApi AccessKey=#{access_key} SignatureType=HmacSHA1 Signature=#{signature}"
    }
    
    client = HTTPClient.new
    client.get_content(url, query, headers)