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]
类型。
答案 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