如何使用与Swagger兼容的params块对Grape REST API执行POST请求

时间:2014-11-28 13:31:23

标签: ruby rest swagger swagger-ui grape-api

我使用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的正确用法是什么 阻止而不冒犯招摇。

1 个答案:

答案 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不接受实体对象作为参数的类型。