Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 字符串插值和URI.parse错误?_Ruby_Uri_Net Http - Fatal编程技术网

Ruby 字符串插值和URI.parse错误?

Ruby 字符串插值和URI.parse错误?,ruby,uri,net-http,Ruby,Uri,Net Http,我从脚本中的用户输入中获取了四个参数。除了URI.parse之外,所有其他字符串插值参数都可以正常工作 代码片段包括: require 'net/http' #ARGVs: prompt = 'test: ' url = ARGV[0] user = ARGV[1] pass = ARGV[2] xml_user = ARGV[3] # User supplied input: puts "Whats the URL?" print prompt url = S

我从脚本中的用户输入中获取了四个参数。除了
URI.parse
之外,所有其他字符串插值参数都可以正常工作

代码片段包括:

require 'net/http'

#ARGVs:
prompt   = 'test: '
url      = ARGV[0]
user     = ARGV[1]
pass     = ARGV[2]
xml_user = ARGV[3]

# User supplied input:
puts "Whats the URL?"
print prompt
url = STDIN.gets.chomp()

# HTTP connection
uri = URI.parse('#{url}')
req = Net::HTTP.new(uri.hostname, uri.port)

# Header: Creds to get a session
user_and_pass = "#{user}" + ':' + "#{pass}"
base64user_and_pass = Base64.encode64(user_and_pass)

# POST method
res = req.post(uri.path, xml_data, {'Content-Type'  => 'text/xml', 'Content-Length' => xml_data.length.to_s, 
                                    'Authorization' => "Basic #{base64user_and_pass}", "Connection" => "keep-alive" })
puts res.body
错误:

Ruby200-x64/lib/ruby/2.0.0/uri/common.rb:176:in `split': bad URI(is not URI?): #{url} (URI::InvalidURIError)
如果方向正确,我们将不胜感激

uri = URI.parse('#{url}')
应该是:

uri = URI.parse(url)

下面是一个更加惯用的Ruby版本的代码:

require 'net/http'

PROMPT = 'test: '

# ARGVs:
url, user, pass, xml_user = ARGV[0, 4]

# User supplied input:
puts "Whats the URL?"
print PROMPT
url = STDIN.gets.chomp()

# HTTP connection
uri = URI.parse(url)
req = Net::HTTP.new(uri.hostname, uri.port)

# Header: Creds to get a session
base64user_and_pass = Base64.encode64("#{ user }:#{ pass }")

# POST method
res = req.post(
  uri.path,
  xml_data,
  {
    'Content-Type'   => 'text/xml',
    'Content-Length' => xml_data.length.to_s,
    'Authorization'  => "Basic #{ base64user_and_pass }",
    "Connection"     => "keep-alive"
  }
)

puts res.body
不要做以下事情:

user_and_pass = "#{user}" + ':' + "#{pass}"
以及:

user
pass
url
已经是字符串,因此将它们粘贴在字符串中并插入它们的值是对CPU的浪费。作为开发人员,我们需要了解我们的数据类型

它可以写为以下内容之一:

user_and_pass = user + ':' + pass
user_and_pass = '%s:%s' % [user, pass]
user_and_pass = [user, pass].join(':')

但是,从我上面写的内容来看,它更为惯用。

您试图解析的URI是什么?它是一个REST API web服务。没问题。这个网站让我等了5分钟才因为一些奇怪的原因接受。这是一个伟大的锡人。感谢您重构代码。我同意。
user_and_pass = user + ':' + pass
user_and_pass = '%s:%s' % [user, pass]
user_and_pass = [user, pass].join(':')