Ruby httpclient:&x27;创建请求';:未定义的方法';每个';
说到红宝石,我是新手。现在我正在忙着写一个连接到。我正在尝试使用httpclient gem,但对于如何构建我的客户机,我有点困惑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
#!/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
,它的值是我假设的您要点击的路径full\u头中的字符串值
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)