葡萄,将JSON作为参数发送

4

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

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

当我通过Postman发出请求时,参数是以application/json内容类型为原始数据格式的:
{
   "json": {"test": "test"}
}

当我发送这个时,出现了错误提示信息:
"json is invalid"

然而,当我像这样发送它时:
{
  "json": "{\"test\": \"test\"}"
}

它向我展示了正确的响应:

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

为什么会出现这种情况?当我使用Hash类型时,第一个变量可以工作,但是如果我想发送哈希/JSON数组怎么办?我知道Grape不支持Array[Hash]类型。

2个回答

7

grape在到达params块之前解析应用程序/ 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块应该像这样:

在您的Post请求中,params块应该像这样:

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

这个可以工作。但是,如果我想发送JSON对象数组,它就不起作用了,因为Grape没有Array[Hash]类型,只有Array[JSON]类型。 - Mr.D
1
根据文档所述,类型为Array将嵌套参数视为“数组中的哈希值”,因此您将仅使用“Array”而不是“Array [Hash]”。如果您使用类型为Array [JSON],则指定类型的参数必须是有效的JSON字符串,如上所述。 - KorreyD

1
如果您想使用Grape解析一个经典的JSON,请使用以下内容:
params do
  requires :groceries, type: JSON
end

然后发送一个JSON,其中只有一个键(key),该键的值为字符串类型(JSON字符串)。请保留HTML标签。 发送JSON的示例: 使用原始参数:
{ "groceries_key": "{\"fruits\": { \"apples\": 2 }, \"vegetables\": { \"carrets\": \"a few\" }}" }

在HTTP GET请求中使用:

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

解析JSON的示例:

value是一个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接