带有散列数组的问题作为伤寒铁路应用中POST的参数

问题描述 投票:2回答:3

我有两个Rails服务。一种服务于UI和一些基本功能(UIService),另一种服务于管理基础模型和数据库交互(MainService)。

在UIService,我有一个收集项目列表并用于通过jQuery POST到MainService的表单。

我采用javascript数组,首先将jQuery.post调用到UIService,就像这样-

var selected_items = new Array();
// Filled up via the form...
params={"name":$("#name_input").val(),
        "items": selected_items };
jQuery.post("/items", params);

然后将其转换为带有键“ item_id”的哈希数组,然后像这样通过Typhoeus转发给MainService-

items = []
item = {}
params[:items].each do |i|
  item[:item_id] = i
end
## Gives me this ---> items = [ {item_id: 189}, {item_id: 187} ]

req = Typhoeus::Request.new("#{my_url}/items/", 
                            method: :POST, 
                            headers: {"Accepts" => "application/json"})
hydra = Typhoeus::Hydra.new
hydra.queue(req)
hydra.run

在MainService,我需要JSON模式采用特定格式。基本上是一组项目...像这样-

{ "name": "test_items", "items": [ {"item_id":"189"},{"item_id": "187"} ] }

问题是,当我从jQuery收集数组并将其传递给UIService时,它在参数中看起来像这样-

[ {item_id: 189}, {item_id: 187} ]

但是,当它到达MainService时,它变成这个-

{"name"=>"test_items",
 "items"=>{"0"=>{"item_id"=>"189"}, "1"=>{"item_id"=>"187"}}

因此,我需要使用“ item_id”对项数组进行键控并插入到参数中。我尝试了几种方法来将其保留为散列数组,但在目标位置总是以错误的格式结束。

我尝试了各种变通方法,例如字符串化,不字符串化,构建自己的哈希数组等。有任何想法吗?我做错了什么还是没有做?我可以使其适用于其他JSON模式,但我必须坚持这一模式。

ruby-on-rails arrays json hash typhoeus
3个回答
4
投票

问题出在我将参数传递到伤寒中的方式

之前(有问题)-

req = Typhoeus::Request.new("#{Rails.application.config.custom_ads_url}/groups", 
                            method: :POST,
                            params: parameters,
                            headers: {"Content-Type" => "application/json",     "AUTHORIZATION" => "auth_token #{user.auth_token}"})

(工作后-注意,我需要转换为json并将其放在正文中。 Typhous中的“ params”被视为自定义哈希。

req = Typhoeus::Request.new("#{Rails.application.config.custom_ads_url}/groups", 
                            method: :POST,
                            body: parameters.to_json,
                            headers: {"Content-Type" => "application/json", "AUTHORIZATION" => "auth_token #{user.auth_token}"})

1
投票

Typhoeus还提供了一个中间件,可以正确转换:http://rubydoc.info/github/typhoeus/typhoeus/frames/Rack/Typhoeus/Middleware/ParamsDecoder


1
投票

如果您使用Typhoeus类方法.post,则可以像这样实现您的请求:

Typhoeus.post(
  "#{Rails.application.config.custom_ads_url}/groups",
  headers: { 'Content-Type'=> "application/json" },
  body: parameters.to_json
)
© www.soinside.com 2019 - 2024. All rights reserved.