我使用ruby URI来构建一个基本的uri,我对某些事情感到困惑。
这是我的代码:
uri = URI("https://myhost.com")
uri.path << "/myapi/endpoint"
uri.query = "p1=value1&p2=value2"
uri.to_s
=> "https://myhost.com/myapi/endpoint?p1=value1&p2=value2"
这一切都很好但我不明白为什么我可以使用<<
运算符设置uri.path
而不是uri.query
?
uri.query
uri = URI("https://myhost.com")
uri.path << "/myapi/endpoint"
uri.query << "p1=value1&p2=value2"
答案 0 :(得分:1)
因为传递给构造函数的解析后的URL没有查询,所以它是nil,路径被创建为空字符串。将查询设置为空字符串将允许此操作。
这只是举例,因为有更好的方法来设置它比铲运营商。
irb(main):001:0> require 'uri'
=> true
irb(main):002:0> uri = URI('http://example.com')
=> #<URI::HTTP http://example.com>
irb(main):003:0> uri.path
=> ""
irb(main):004:0> uri.query
=> nil
irb(main):005:0> uri.query = ""
=> ""
irb(main):006:0> uri.query << 'p1=value1&p2=value2'
=> "p1=value1&p2=value2"
irb(main):007:0> uri
=> #<URI::HTTP http://example.com?p1=value1&p2=value2>
更好:
irb(main):011:0> uri.query =+ 'p1=value1&p2=value2'
=> "p1=value1&p2=value2"
irb(main):012:0> uri
=> #<URI::HTTP http://example.com?p1=value1&p2=value2>
答案 1 :(得分:1)
由于nil
未对<<
做出响应,因此uri.query
默认为nil
。
uri = URI("https://myhost.com")
# => #<URI::HTTPS https://myhost.com>
uri.query
# => nil
nil.respond_to? :<<
# => false
uri.path
# => ""
"".respond_to? :<<
# => true
请注意,uri.path
默认为空字符串。当连接完整URI时,路径实际上变为/
,这就是URL结尾处有一个尾部斜杠的原因:您正在主机服务器上请求根路径。