ASCII ruby net/http 更改请求 uri
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
?
,
是查询中的合法字符(扩展说明在这里)
ERB::Util.url_encode
改为 does 替换 [^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>
我需要在遗留系统上执行一个非常具体的请求,并发现在获取请求期间,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
?
,
是查询中的合法字符(扩展说明在这里)
ERB::Util.url_encode
改为 does 替换 [^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>