RestClient在请求路径上解析带空格的URI

时间:2013-11-27 22:59:21

标签: ruby parsing rest rest-client

我正在处理一个代码,我在请求路径上请求包含空格的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部分。

有没有人遇到同样的问题?

2 个答案:

答案 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>

根据您自己的解决方案,它似乎正常。我可以告诉你,要么在调查问题时错过重复步骤(从头开始再试一次,以防万一),或者也许这是你正在使用的两个宝石之一的旧版本中的一个错误 - 在这种情况下,您可以通过安装最新版本来修复它。