2013-10-26 35 views
2

我需要使用HTTParty发布数组。如何使用HTTParty发布数组

我的阵列是[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" 
+0

该机构是不是真的错,只是不太你期待什么。这将被重建​​(例如Rails)作为包含三个元素的名为story_hash的数组参数。 (看看如何将表单中的多重选择的结果发布到rails - 相同的想法)。 – struthersneil

+0

@struthersneil对不起,我可能不应该使用这个词。我只是说“不适合我的目的”。 –

+0

我知道 - 我只是添加了传递googlers的注释,以防有人想知道为什么他们的数组编码奇怪:) – struthersneil

回答

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" 
+0

这个答案可以使用一些说明。究竟应该在哪里被调用? –

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 
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 
+0

这不起作用:[[“story_hash”,1],[“story_hash”,2],[“story_hash”,3]]:Array''NoMethodError:undefined method'to_hash'。我使用Ruby 2.2试了这个 – pisaruk