【问题标题】:Encoding parameters with multiple duplicate keys使用多个重复键编码参数
【发布时间】:2016-01-15 14:12:51
【问题描述】:

我似乎和这个小伙子here有同样的问题

我想编码一些参数(对于 import.io api)。有效:

params = {
  :input => "webpage/url:http://www.example.com",
  :input => "keywords:some+keywords"

}

但这行不通,所以我认为这是正确的方法:

params = { :input => ["webpage/url:http://www.example.com", "keywords:some+keywords"] }

我希望它输出

params.to_query
=> "input=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com%2Fsome-id&input=keywords%3Asome%2Bkeywords"

不幸的是,我明白了

"input%5B%5D=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com%2Fsome-id&input%5B%5D=keywords%3Asome%2Bkeywords"

它在输入之后添加 [],我认为这是标准行为。我怎样才能阻止它这样做?

为了澄清,处理需要重复键的 url 参数的 ruby​​ 或“rails 方式”是什么?

【问题讨论】:

  • 为什么要阻止它这样做?这是一个有效的查询参数
  • [] 是在参数中处理数组的方式。如果您希望最终结果与开始参数相同,则需要那些 []
  • 问题是我不能将它们都称为“输入”,因为哈希只会覆盖自己。我需要一种传递值的方法,两者都使用键“输入”到我将要传递到 URL 中的一组查询参数。
  • Anthony... 我确定是这样,但它破坏了 api。即 api 不会接受它作为有效参数。接受具有重复键的变量是非常高兴的。不是我的 API,所以除了遵守他们的规则之外,我无能为力....
  • 是的,输入应该作为值的数组发送。这就是我们发送多个值的方式。如果您的 API 不接受它,那就太愚蠢了。你确定是这样吗?我们可以建议一些 hacky 变通方法,但对 API 一无所知就很难提出建议。

标签: ruby-on-rails ruby


【解决方案1】:

遇到了类似的问题,这里有一个有用的帖子 Ruby Hash with duplicate keys? 但很简短

params = {}.compare_by_identity
params['input'] = "webpage/url:http://www.example.com"
params['input'.dup] = "keywords:some+keywords"

然后

params.to_query

返回

"input=keywords%3Asome%2Bkeywords&input=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com"

【讨论】:

    【解决方案2】:

    url 中的某些字符对于 url 的处理具有特殊的重要性:它们是保留,就像编程语言中的关键字一样。见Which characters make a URL invalid?

    如果您尝试将这些用作参数的名称或值,则会破坏 uri,并且您将很难预测所看到的结果。

    答案是 URI 转义 字符串,它将用它们的编码版本替换特殊字符。 Rails 在收到请求时会自动取消转义它们,因此您无需担心。

    您可以手动转义它们,但如果您已经将它们作为哈希值,最好的方法是在哈希值上调用 .to_param

    params = { :input => ["webpage/url:http://www.example.com", "keywords:some+keywords"] }
    => {:input=>["webpage/url:http://www.example.com", "keywords:some+keywords"]}
    params.to_param
    => "input%5B%5D=webpage%2Furl%3Ahttp%3A%2F%2Fwww.example.com&input%5B%5D=keywords%3Asome%2Bkeywords"
    

    【讨论】:

    • 是的,我想我误解了他在问什么。
    • 我认为您已经意识到,问题不在于正在编码的参数。没关系。它是在变量输入后添加数组参数。
    猜你喜欢
    • 2018-09-15
    • 2010-10-18
    • 1970-01-01
    • 2014-01-12
    • 2015-08-03
    • 2021-11-04
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多