3

我有两个 Rails 服务。一个提供 UI 和一些基本功能(UIService),另一个负责管理底层模型和数据库交互(MainService)。

在 UIService,我有一个表单,它收集项目列表并使用它通过 jQuery 发布到 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 模式,但我需要坚持这个。

4

3 回答 3

5

问题在于我将参数传递给 typhoeus 的方式

之前(有问题)--

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}"})

after (works) - 注意我需要转换为 json 并将其放入正文中。typhoeus 中的“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}"})
于 2013-06-14T19:10:07.957 回答
1

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

于 2013-06-19T08:21:13.043 回答
1

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

Typhoeus.post(
  "#{Rails.application.config.custom_ads_url}/groups",
  headers: { 'Content-Type'=> "application/json" },
  body: parameters.to_json
)
于 2020-04-15T10:48:13.800 回答