Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在url上与Nokogiri或RestClient一起使用哈希值_Ruby On Rails_Ruby_Ruby On Rails 4_Nokogiri_Rest Client - Fatal编程技术网

Ruby on rails 在url上与Nokogiri或RestClient一起使用哈希值

Ruby on rails 在url上与Nokogiri或RestClient一起使用哈希值,ruby-on-rails,ruby,ruby-on-rails-4,nokogiri,rest-client,Ruby On Rails,Ruby,Ruby On Rails 4,Nokogiri,Rest Client,我有一个类似的url: http://172.0.0.1:22230/test.action?data={“foo”:“bar”,“joe”:“doe”}&sign=x6das 在我的浏览器中,我可以从该url获取数据,但如果我使用nokogiri Nokogiri::HTML(open('http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das')) 我明白了 还有RestClient R

我有一个类似的url:

http://172.0.0.1:22230/test.action?data={“foo”:“bar”,“joe”:“doe”}&sign=x6das

在我的浏览器中,我可以从该url获取数据,但如果我使用nokogiri

Nokogiri::HTML(open('http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das'))
我明白了

还有RestClient

RestClient.get 'http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das'

我也遇到了同样的错误。

先对url进行编码,然后再使用它

url = 'http://172.0.0:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das'
encoded_url = CGI::escape(url)
Nokogiri::HTML(open(encoded_url))

好的,我的问题解决了

url = http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das
RestClient.get(URI.encode(url.strip))

在处理URI时,最好使用为其设计的工具,例如Ruby附带的URI

URI不能为空

http://172.0.0.1:22230/test.action?data={"foo":"bar","joe":"doe"}&sign=x6das
因为
数据
组件无效。如果您正在添加
数据
,那么我将从以下内容开始:

require 'uri'

uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das')
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"}
data = {"foo" => "bar","joe" => "doe"}
uri.query = URI.encode_www_form(query.merge(data)) # => "sign=x6das&foo=bar&joe=doe"
uri.to_s # => "http://172.0.0.1:22230/test.action?sign=x6das&foo=bar&joe=doe"
您使用
{“foo”:“bar”,“joe”:“doe”}
的最初示例是JSON序列化数据,通常不会在这样的URL中传递。如果需要创建JSON,请从初始哈希开始:

require 'json'

data = {"foo" => "bar","joe" => "doe"}
data.to_json # => "{\"foo\":\"bar\",\"joe\":\"doe\"}"
to_json
将哈希序列化为字符串,然后可以将其编码到URI中:

data = {"foo" => "bar","joe" => "doe"}

uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das')
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"}
uri.query = URI.encode_www_form(query.merge('data' => data.to_json)) # => "sign=x6das&data=%7B%22foo%22%3A%22bar%22%2C%22joe%22%3A%22doe%22%7D"

但是,在URI中发送编码的JSON作为查询参数不是很常见或标准,因为没有JSON编码的数据负载更小。

Nokogiri::HTML(open('HTMLhttp://google.com/test?data={“foo”:“bar”,“joe”:“doe”}&sign=x6das'))
=>
OpenURI::HTTPError:404未找到
。你能写你的URI吗?@Ilya我认为在stackoverflow中写原始URI是个坏主意,但我会在我的问题中编辑与原始url相同的内容;它不知道该级别的代码,而是只在向流传递代码时读取该流,并解析生成的字符串。OpenURI或RestClient是将返回该错误的层。理解代码中的组件做什么很重要。请删除Nokogiri的引用和标记,并用OpenURI替换它们,您的问题将更有意义。您从哪里获得示例URI?它是由您的代码生成的吗?如果是这样的话,你的问题看起来像是XY问题,你问的是Y,但应该问X,这是如何生成URI。@第三方的Inman URI,他们为我的站点提供了一个URI,所以我不能做任何更改。哦,关于错误的问题,是的,这是我的问题,不清楚你在问什么?至少有一些人能理解,尽管我的英语不好。但感谢您的建议和双重否决投票。我得到了
Errno::enametolong:File name太长@rb_sysopen
,不幸的是,您的代码无法运行。你没有正确地声明
url
。这不是关于声明url,而是关于“我”如何解决这样的url问题,我从中找到了解决问题的有用方法,这对我很有用。
data = {"foo" => "bar","joe" => "doe"}

uri = URI.parse('http://172.0.0.1:22230/test.action?sign=x6das')
query = URI.decode_www_form(uri.query).to_h # => {"sign"=>"x6das"}
uri.query = URI.encode_www_form(query.merge('data' => data.to_json)) # => "sign=x6das&data=%7B%22foo%22%3A%22bar%22%2C%22joe%22%3A%22doe%22%7D"