Ruby 如何使用HTTParty发布阵列

Ruby 如何使用HTTParty发布阵列,ruby,httparty,Ruby,Httparty,我需要发布一个数组 我的数组是[1,2,3],API希望接收表单中的主体 "story_hash=1&story_hash=2&story_hash=3" 这不是很重要,但是 我目前的解决办法是: params = [1, 2, 3].inject('') { |memo, h| memo += "&story_hash=#{h}" } # Strip the first '&' params.slice!(0) options = { body: param

我需要发布一个数组

我的数组是
[1,2,3]
,API希望接收表单中的主体

"story_hash=1&story_hash=2&story_hash=3"
这不是很重要,但是

我目前的解决办法是:

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"
我还建议使用
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"
我还建议使用
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"

我同意@tihom,只是想补充一点,如果您要多次使用它,最好覆盖query\u string\u normalizer方法

class ServiceWrapper
  include HTTParty

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

我同意@tihom,只是想补充一点,如果您要多次使用它,最好覆盖query\u string\u normalizer方法

class ServiceWrapper
  include HTTParty

  query_string_normalizer proc { |query|
    query.map do |key, value|
      value.map {|v| "#{key}=#{v}"}
    end.join('&')
  }
end
您可以为此目的使用方法

require "httparty"
HTTParty::HashConversions.to_params((1..3).map { |x| ["story_hash", x] })
# => story_hash=1&story_hash=2&story_hash=3
您可以为此目的使用方法

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

这个身体其实并不是错的,只是和你期望的不一样。这将被重构(例如,由Rails)为一个名为story_hash的数组参数,其中包含三个元素。(看一看表单中多选的结果是如何发布到rails的——这个想法是一样的)。@struthersneil是的,对不起,我可能不该用这个词。我的意思是“不适合我的目的”。我知道——我只是添加了一条评论,以防有人想知道他们的数组为什么会被奇怪地编码:)这个主体并不是真的错了,只是不是你所期望的那样。这将被重构(例如,由Rails)为一个名为story_hash的数组参数,其中包含三个元素。(看一看表单中多选的结果是如何发布到rails的——这个想法是一样的)。@struthersneil是的,对不起,我可能不该用这个词。我的意思是“不适合我的目的”。我知道——我只是添加了一条评论,以防有人想知道为什么他们的数组编码奇怪:)这个答案需要一些澄清。到底应该叫什么名字?这个答案需要一些澄清。具体应该在哪里调用?这不起作用:
NoMethodError:undefined method
to_hash',for[[“story_hash”,1],“story_hash”,2],“story_hash”,3]:Array`。我使用Ruby 2.2尝试了这一点,但不起作用:
NoMethodError:undefined method
to_hash',for[[“story_hash”,1],“story_hash”,2],“story_hash”,3]:Array`。我用Ruby 2.2试过这个