葡萄,发送 JSON 作为参数

Grape, sending JSON as params

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

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

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

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

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

"json is invalid"

然而,当我这样发送时:

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

它告诉我正确的回答:

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

为什么会这样?当我输入 Hash 时,第一个变体有效,但是如果我想发送 hashes/jsons 的 Array?我知道 Grape 不支持 Array[Hash] 类型。

葡萄在到达您的参数块之前解析 application/json 数据。


在此区块中:

params do
  requires :json, type: JSON
end

你告诉 grape 你的 :json 参数应该包含一个 JSON 字符串。

所以当你发送这个时:

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

json 包含

{"test": "test"} 

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

但是当你发送这个

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

json 包含

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

这是一个有效的 JSON 字符串,然后它会很乐意为您解析为哈希值。


如果你想使用

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

在您的 post 请求中,您的参数块应该是这样的:

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

如果您想用 Grape 解析经典 JSON,请使用以下命令:

params do
  requires :groceries, type: JSON
end

然后发送一个 JSON 和一个 single key,它有一个 value 类型的字符串(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