我正在处理一个代码,我在请求路径上请求包含空格的URL:
http://example.com/path1/path2/some details.detail?keyword=key word
我正在使用rest-client gem。
url = http://example.com/path1/path2/some details.detail?keyword=key word
RestClient::Request.execute(method: :get, url: url)
但它引发了一个错误:
URI::InvalidURIError: bad URI(is not URI?): http://example.com/path1/path2/some details.detail?keyword=key word
文档建议首先解析和规范化URL:
parsed_url = Addressable::URI.parse(url).normalize.to_str
# parsed_url is now: http://example.com/path1/path2/some%20details.detail?keyword=key%20word
RestClient::Request.execute(method: :get, url: parsed_url)
但错误仍然存在。
URI::InvalidURIError: bad URI(is not URI?): http://example.com/path1/path2/some details.detail?keyword=key%20word
看起来它无法解析网址的/some details.detail
部分。
有没有人遇到同样的问题?
答案 0 :(得分:1)
尝试URI.encode
:
$ irb
2.0.0-p247 :001 > require "uri"
=> true
2.0.0-p247 :002 > URI.encode("http://example.com/path1/path2/some details.detail?keyword=key word")
=> "http://example.com/path1/path2/some%20details.detail?keyword=key%20word"
2.0.0-p247 :003 >
答案 1 :(得分:0)
在Ruby 2.0.0上使用rest-client
1.6.7和addressable
2.3.5,这是一个尝试复制错误的irb会话:
:001 > require 'rest-client'
=> true
:002 > require "addressable/uri"
=> true
:003 > url = 'http://example.com/path1/path2/some details.detail?keyword=key word'
=> "http://example.com/path1/path2/some details.detail?keyword=key word"
:004 > parsed_url = Addressable::URI.parse(url).normalize.to_str
=> "http://example.com/path1/path2/some%20details.detail?keyword=key%20word"
:005 > RestClient::Request.execute(method: :get, url: parsed_url)
RestClient::ResourceNotFound: 404 Resource Not Found: <!doctype html>
<html>
<head>
<title>Example Domain</title>
根据您自己的解决方案,它似乎正常。我可以告诉你,要么在调查问题时错过重复步骤(从头开始再试一次,以防万一),或者也许这是你正在使用的两个宝石之一的旧版本中的一个错误 - 在这种情况下,您可以通过安装最新版本来修复它。