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(':')