在单个POST HTTP请求中发送一系列不同的哈希值

时间:2019-07-17 18:48:03

标签: ruby-on-rails ruby http

我有两种不同的哈希值:

hash1 = {"h1_k1": "h1_v1", "h1_k2": ["h1_v2"]}
hash2 = {"h2_k1": "h2_v1", "h2_k2": "h2_v2"}

每个散列的值都可能有很多次出现,但是即使每个散列都出现一次,也会出现以下问题:

我想在HTTP发布请求中将数据发送到Rails服务器,并且当我在单个请求中将整个数据发送给每个数据,在每个哈希中的一个请求中发送给行为时,行为有所不同。

在控制器中,params将为以下内容:

一个请求:我将两个哈希值都推入arrayNet::HTTP.post_form(uri, array)中。

Parameters: {"{\"h1_k1\"=>\"h1_v1\", \"h1_k2"\"=>"=>{"\"h1_v2"\""=>{"}"=>nil}, {\"h2_k1\"=>\"h2_v1\", {\"h2_k2\"=>\"h2_v2\"}"=>nil}

每个哈希请求一个:array.each {|hash| Net::HTTP.post_form(uri, hash) }

Parameters: {"h1_k1": "h1_v1", "h1_k2": "h1_v2"} # array converted to string of only the last element
Parameters: {"h2_k1": "h2_v1", "h2_k2": "h2_v2"}

这背后的原因是什么,有什么方法可以在单个请求中正确发送数据?

2 个答案:

答案 0 :(得分:1)

post_form(url, params)的定义中:

  

表单数据必须作为从 String String

的哈希映射提供

在您的示例中,您有一个包含两个散列的 Array 。考虑将参数作为哈希传递。

答案 1 :(得分:1)

我最终以两种不同的方式解决它:

  1. 我在数组上使用了to_json,并将标头Content-Type设置为application/json。 这允许即时访问格式正确的数组和服务器端params[:_json]中的哈希。 例如params[:_json][0]['h1_k1']给出h1_v1

  2. 我在阵列上使用了to_yaml,并将标头Content-Type设置为any of the YAML options。 后端的参数是空的,因为(我想)Rails无法自动解析它,但是使用request.raw_post可以从发布主体获取数据。 因此,使用Psych.safe_load(request.raw_post)会将其解析回哈希数组,从而可以像方法1中一样使用数据(不考虑params)。