ruby-on-rails - 葡萄,将 JSON 作为参数发送

标签 ruby-on-rails ruby json ruby-grape

我的 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 类型时,第一个变体起作用了,但是如果我想发送 Array 的哈希/jsons 呢?我知道 Grape 不支持 Array[Hash] 类型。

最佳答案

grape 在到达您的参数 block 之前解析 application/json 数据。


在此 block 中:

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"}
}

在你的帖子请求中,你的参数 block 应该是这样的:

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

关于ruby-on-rails - 葡萄,将 JSON 作为参数发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36686659/

相关文章:

ruby-on-rails - 使用 Rails 4 对象将 PSQL 查询转换为工作

ruby-on-rails - 在 Sublime Text 编辑器中构建 Ruby 时出错

ruby - 使用 Ruby gem 打包只读数据文件

ruby-on-rails - 500内部服务器错误

ruby-on-rails - ruby 一行 "check value and return"

asp.net - 在 Web API 中将数组标题添加到 Linq-to-SQL-to-JSON

json - 已经将字段更改为字符串,但仍然出现错误

ruby-on-rails - 使用 delay_job 的 ActiveJob 不会在测试中创建 delay_jobs 行

javascript - 在选择框 HTML 中显示 UTF8 和 ISO-8859-1

ruby-on-rails - 尝试为一百万条记录生成 csv 时,RAM 使用率为 99% Rails