ASCII ruby net/http changing request uri



我需要在遗留系统上执行一个非常具体的请求,并发现在获取请求期间,http库正在将任何%2C更改回,。 使用不同实现的net-http,httparty,faraday和open-uri的相同问题

2.5.0 :001 > require 'net/http'
=> true 
2.5.0 :002 > require 'erb'
=> true 
2.5.0 :003 > link = "http://example.com?q=" + ERB::Util.url_encode("Hello, World")
=> "http://example.com?q=Hello%2C%20World" 
2.5.0 :004 > uri = URI(link)
=> #<URI::HTTP http://example.com?q=Hello%2C%20World> 
2.5.0 :005 > res = Net::HTTP.get_response(uri)
=> #<Net::HTTPOK 200 OK readbody=true> 

所有这些看起来都不错,直到我查看VCR的实际请求

http_interactions:
- request:
method: get
uri: http://example.com/?q=Hello,%20World
body:
encoding: US-ASCII
string: ''
...

如何保持请求http://example.com?q=Hello%2C%20World

,

是查询中的法律字符(此处 https://stackoverflow.com/a/31300627/3820185 扩展说明(

ERB::Util.url_encode反而替换了[^a-zA-Z0-9_-.]

# File erb.rb, line 930
def url_encode(s)
s.to_s.dup.force_encoding("ASCII-8BIT").gsub(/[^a-zA-Z0-9_-.]/n) {
sprintf("%%%02X", $&.unpack("C")[0])
}
end

因此,在执行请求时,很可能会重新解析查询以符合实际标准。

编辑

此外,您根本不需要使用ERB::Util.url_encode,您只需将URL传递给URI,它将根据标准对其进行转义。

irb(main):001:0> require 'net/http'
=> true
irb(main):002:0> link = URI 'http://example.com?q=Hello, World'
=> #<URI::HTTP http://example.com?q=Hello,%20World>
irb(main):003:0>

相关内容

  • 没有找到相关文章

最新更新