如何使用HTTParty发布数组

时间:2013-10-26 00:16:17

标签: ruby httparty

我需要使用HTTParty POST一个数组。

我的数组是[1, 2, 3],并且API希望以

的形式接收正文
"story_hash=1&story_hash=2&story_hash=3"

这不是很重要,但here's the docs for the API in question

我现在的解决方案是:

params = [1, 2, 3].inject('') { |memo, h| memo += "&story_hash=#{h}" }
# Strip the first '&'
params.slice!(0)

options = { body: params }
HTTParty.post('/reader/mark_story_hashes_as_read', options)

有没有更好的方法(理想的解决方案是HTTParty的一个我不知道的特性)?


我尝试了以下方法:

options = {
  body: { story_hash: [1, 2, 3] }
}
HTTParty.post('/reader/mark_story_hashes_as_read', options)

但这似乎错误地发送了这样的身体:

"story_hash[]=1&story_hash[]=2&story_hash[]=3"

3 个答案:

答案 0 :(得分:2)

[1, 2, 3].map{|h| "story_hash=#{h}"}.join("&")
#=> "story_hash=1&story_hash=2&story_hash=3"

我还建议使用CGI.escape(h.to_s)代替h,它会对url的值进行编码(除非HTTParty已经为你做了)。所以逃脱的版本看起来像:

[1, 2, 3].map{|h| "story_hash=#{CGI.escape(h.to_s)}"}.join("&")
#=> "story_hash=1&story_hash=2&story_hash=3"

答案 1 :(得分:1)

我同意@tihom,只是想补充一点,如果你要多次使用它,那么覆盖query_string_normalizer方法会很好。

class ServiceWrapper
  include HTTParty

  query_string_normalizer proc { |query|
    query.map do |key, value|
      value.map {|v| "#{key}=#{v}"}
    end.join('&')
  }
end

答案 2 :(得分:1)

您可以使用HTTParty::HashConversions.to_params方法来实现此目的

require "httparty"
HTTParty::HashConversions.to_params((1..3).map { |x| ["story_hash", x] })
# => story_hash=1&story_hash=2&story_hash=3