默认情况下,HTTParty 使用HashConversions 将Hash 正文转换为参数:
示例:
{ :name => "Bob",
:address => {
:street => '111 Ruby Ave.',
:city => 'Ruby Central',
:phones => ['111-111-1111', '222-222-2222']
}
}.to_params
#=> "name=Bob&address[city]=Ruby Central&address[phones][]=111-111-1111&address[phones][]=222-222-2222&address[street]=111
红宝石大道。”
您可以使用HTTParty.query_string_normalizer 使用您自己的转换器覆盖它:
覆盖查询字符串的标准化方式。有助于覆盖
Array 查询的默认 rails 规范化。
查询:
get '/', :query => {:selected_ids => [1,2,3]}
默认查询字符串规范化器返回:
/?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
让我们把它改成这样:
/?selected_ids=1&selected_ids=2&selected_ids=3
将 Proc 传递给接受产生的查询的查询规范化器。
@example 修改数组查询字符串
class ServiceWrapper
include HTTParty
query_string_normalizer proc { |query|
query.map do |key, value|
value.map {|v| "#{key}=#{v}"}
end.join('&')
}
end
@param [Proc] 规范化器自定义查询字符串规范化器。 @yield [哈希,
String] 查询字符串 @yieldreturn [Array] 一个数组,稍后将
加入'&'
或简单地将其传递给您的选项:
response = HTTParty.post url, :body =>
{"key"=>'XYZ123',
"content"=>
[{"placename"=>"placeholder",
"placecontent"=>"sample content"}]},
:query_string_normalizer => -> (h) { ... your own implementation here ...}
要获得a[1]=val1&a[2]=val2 而不是a[]=val1&a[]=val2 的序列化,您可以基于current one 创建自己的HashConversions
class MyHashConversions
def to_params(hash)
params = hash.map { |k,v| normalize_param(k,v) }.join
params.chop! # trailing &
params
end
def normalize_param(key, value)
param = ''
stack = []
if value.is_a?(Array)
#### THE CHANGE IS HERE
param << value.each_with_index.map { |element, i| normalize_param("#{key}[#{i}]", element) }.join
####
elsif value.is_a?(Hash)
stack << [key,value]
else
param << "#{key}=#{URI.encode(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))}&"
end
stack.each do |parent, hash|
hash.each do |k, v|
if v.is_a?(Hash)
stack << ["#{parent}[#{k}]", v]
else
param << normalize_param("#{parent}[#{k}]", v)
end
end
end
param
end
end
上面的代码没有经过测试,但如果它可以工作,并且足够通用,你可以考虑分叉项目和 github,在那里进行修复,所以它可以开箱即用:)