【问题标题】:String interpolation and URI.parse error?字符串插值和 URI.parse 错误?
【发布时间】:2014-01-12 23:06:59
【问题描述】:

我有四个参数取自脚本中的用户输入。除了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 是什么?
  • 它是一个 REST API 网络服务。

标签: ruby uri net-http


【解决方案1】:

这里有一些更惯用的 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}"

和:

uri = URI.parse('#{url}')

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

可以写成以下之一:

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

但是看我上面写的更习惯。

【讨论】:

  • 这是伟大的铁皮人。感谢您重构代码。我同意。
【解决方案2】:
uri = URI.parse('#{url}')

应该是:

uri = URI.parse(url)

【讨论】:

  • 没问题。由于某种奇怪的原因,该网站让我等待 5 分钟才能接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多