葡萄,发送 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
我的葡萄 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