我需要使用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"
答案 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