添加参数到url

问题描述 投票:38回答:5

我有一个网址(例如 http:/www.youtube.comwatch?v=og9B3BEnBHo),我想给它添加一个参数(wmode=opaque),这样它的。

http:/www.youtube.comwatch?v=og9B3BEnBHo&wmode=opaque

谁能告诉我应该用哪个函数来实现这个功能?

ruby url parameters
5个回答
64
投票
require 'uri'

uri =  URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&') 
puts uri.to_s

#edit Since 1.9.2 there are methods added to the URI module

uri =  URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
new_query_ar = URI.decode_www_form(String(uri.query)) << ["wmode", "opaque"]
uri.query = URI.encode_www_form(new_query_ar)
puts uri.to_s

(调用 String 确保在原始URI没有查询字符串的情况下也能使用)


19
投票

随着Ruby多年来的发展,不同版本的答案也有所不同。

1.9.2之后

Ruby 1.9.2看到了 decode_www_formencode_www_form 添加到URI模块中,使得编码参数更加简单。

require 'uri'

uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
new_query_ar = URI.decode_www_form(uri.query || '') << ["wmode", "opaque"]
uri.query = URI.encode_www_form(new_query_ar)
puts uri.to_s

解释

URI.decode_www_form 断开一串查询参数 (uri.query)变成一个嵌套的参数数组([["v", "og9B3BEnBHo"]])

uri.query || '' 提供 uri 的查询字符串,如果不存在,则提供一个空字符串。这可以防止 decode_www_form 的情况下,避免出现错误。uri.querynil.

<< ["wmode", "opaque"] 在查询参数的数组中增加一个元素。你可以通过进一步扩展 new_query_ar: new_query_ar << ["fullscreen", "1"]

URI.encode_www_form 将嵌套数组中的新查询参数编码成字符串。

1.9.2之前

require 'uri'

uri = URI.parse("http://www.youtube.com/watch?v=og9B3BEnBHo")
uri.query = [uri.query, "wmode=opaque"].compact.join('&') 
puts uri.to_s

解释:将嵌套的新查询参数数组编码成字符串。

[uri.query, "wmode=opaque"] 是一个包含所有最终查询参数的数组。你可以通过扩展数组来添加更多的参数。[uri.query, "wmode=opaque", "fullscreen=1"] 或添加到最后一个元素中。"wmode=opaque&fullscreen=1"

compact removes nil 元素,因此它从一个数组中删除了 uri.query 如果没有现存的查询参数,则将它们连接成一个查询字符串。

join最后,将它们连接成一个查询字符串。


6
投票

由于你可能有多个查询参数要添加,而不仅仅是一个,这里有一个版本可以让你通过简单地传递一个哈希值来添加任意多的参数......。另外,哈希值似乎是一种更自然的方式来传入 params 即使你只添加了一个param。

  require 'uri'
  def add_params(url, params = {})
    uri = URI(url)
    params    = Hash[URI.decode_www_form(uri.query || '')].merge(params)
    uri.query =      URI.encode_www_form(params)
    uri.to_s
  end

例子。

pry(main)> helper.add_params("http://example.com", b: 2)
=> "http://example.com?b=2"

pry(main)> helper.add_params("http://example.com?a=1", b: 2, c: 3)
=> "http://example.com?a=1&b=2&c=3"

pry(main)> helper.add_params("http://www.youtube.com/watch?v=og9B3BEnBHo", wmode: 'opaque')
=> "http://www.youtube.com/watch?v=og9B3BEnBHo&wmode=opaque"

4
投票

另一个选择是使用 可寻址的宝石

https:/github.comsporkmongeraddressable。

一旦你在你的项目中加入了Addressable,你所要做的就是。

url = Addressable::URI.parse('http://www.youtube.com/watch?v=og9B3BEnBHo')
url.query_values = url.query_values.merge(wmode:"opaque")

0
投票

在最近版本的URI模块中,你可以简单地:

original_uri = 'http://www.youtube.com/watch?v=og9B3BEnBHo'
append_params = { 'wmode': 'opaque' }

uri = URI.parse(original_uri)
params = URI.decode_www_form(uri.query || '') + append_params.to_a
uri.query = URI.encode_www_form(params)
puts uri.to_s
© www.soinside.com 2019 - 2024. All rights reserved.