我使用grape构建REST API,我在使用params
选项时遇到了一些问题。
这是我发布POST请求的方式:
# Curl Request
# curl -X POST -H "Content-Type:application/json" 0:9292/v1/articles -d '{"title":"hello","body":"world"}'
# {"error":"article is missing"}
# curl -X POST -H "Content-Type:application/json" 0:9292/v1/articles -d '{"article":{title":"hello","body":"world"}}'
# {"error":"article is invalid"}
正如您所看到的,如果我省略article
它会失败article missing
,如果我放article
但它失败article invalid
。
这是代码,我使用的是葡萄实体。
# Entity
module API
module Entities
class Article < Grape::Entity
expose :title, documentation: { type: 'string', desc: 'Title' }
expose :body, documentation: { type: 'string', desc: 'Body' }
end
end
end
# API
desc "Create an article"
params do
requires :article, type: API::Entities::Article, documentation: { eg: "aklsdfj" }
end
post '/articles' do
puts params
article = Article.create(params(:title, :body))
represent(article, env)
end
# Add Swagger Docs
add_swagger_documentation mount_path: 'api/doc',
api_version: 'v1',
markdown: GrapeSwagger::Markdown::KramdownAdapter,
hide_documentation_path: true,
base_path: Application.config.base_path,
models: [API::Entities::Article]
具体而言,问题是由params
阻止,requires
:article
类型API:Entities::Article
造成的。
另请注意,我使用的是add-swagger-documentation
和此代码
产生正确的招摇文档,因此解决方案必须如此
完全兼容招摇。 params
的正确用法是什么
阻止而不冒犯招摇。
答案 0 :(得分:1)
我不确定你要在这里完成什么。我想你想以一种接受这样的JSON的方式改变你的帖子方法:
{ attribute1: value, attribute2: value }
而不是
{ article: { attribute1: value, attribute2: value } }
在这种情况下,您必须将参数块更改为此类
params do
requires :attribute1, type: String, documentation: { eg: "aklsdfj" }
requires :attribute2, type: String, documentation: { eg: "aklsdfj" }
end
而不是
params do
requires :article, type: API::Entities::Article, documentation: { eg: "aklsdfj" }
end
上面的 params 块期望一个JSON包含由实体API :: Entities :: Article中定义的每个属性组成的article属性。
实际上,Grape不接受实体对象作为参数的类型。