葡萄,将JSON作为params发送

时间:2016-04-18 06:15:51

标签: ruby-on-rails ruby json grape

My Grape API接受json格式,我有接受JSON作为参数的方法:

desc 'JSON test'
params do
  requires :json, type: JSON
end
post :json_test do
  json = params[:json]
  {result: json}
end

当我通过邮递员发出请求时,参数是raw / json内容类型:

{
   "json": {"test": "test"}
}

当我发送此消息时,我收到错误消息:

"json is invalid"

然而,当我这样发送时:

{
  "json": "{\"test\": \"test\"}"
}

它向我显示了正确的答案:

{
 "result": {
   "test": "test"
  }
}

为什么会这样?当我创建类型Hash时,第一个变体可以正常工作,但是如果我想发送哈希/ jsons的Array?我知道Grape不支持Array[Hash]类型。

2 个答案:

答案 0 :(得分:6)

grape在应用程序/ json数据到达你的params块之前解析它。

在这个区块中:

params do
  requires :json, type: JSON
end

你告诉葡萄你的:json param应该包含一个JSON字符串。

所以发送时:

{
   "json": {"test": "test"}
}

json包含

{"test": "test"} 

被视为哈希,而不是有效的JSON字符串,因此我们的错误。

但是当你发送这个

{
  "json": "{\"test\": \"test\"}"
}

json包含

"{\"test\": \"test\"}"

这是一个有效的JSON字符串,然后它会愉快地解析为哈希值。

如果你想使用

{
   "json": {"test": "test"}
}

在你的帖子请求中,你的params块应该是这样的:

params do
    requires :json, type: Hash #<-- Hash here instead of JSON since json data has already been parsed into a Hash
end

答案 1 :(得分:1)

如果你想用Grape解析经典的JSON:

params do
  requires :groceries, type: JSON
end

然后发送带有 的JSON,其类型为String(JSON字符串)。

发送JSON的示例:

用作原始参数:

{ "groceries_key": "{\"fruits\": { \"apples\": 2 }, \"vegetables\": { \"carrets\": \"a few\" }}" }

在HTTP GET请求中使用:

http://localhost/api/test?groceries=<the_above_raw_parameter_without_whitespaces>

解析JSON的示例:

是一个JSON字符串,要解析它,请使用

get do    
  JSON.parse (params['groceries']['groceries_key'])
end

这会给你一个不错的json:

{
  "fruits": {
    "apples": 2
  },
  "vegetables": {
    "carrets": "a few"
  }
}

使用的版本:

gem 'grape',         '0.14.0'
gem 'grape-swagger', '0.20.2'
ruby 1.9.3p545