为什么我不能使用铲子操作符来设置uri.query?

时间:2017-04-25 19:59:21

标签: ruby uri net-http

我使用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"

2 个答案:

答案 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结尾处有一个尾部斜杠的原因:您正在主机服务器上请求根路径。