Swagger UI for Rails API 使用 ActiveModel 的 Serializer
Swagger UI for Rails API using ActiveModel's Serializer
我想知道是否有人在使用 Swagger UI 生成 API 文档之前完成过此操作,而 API 也不是由 Swagger 生成的。这是我的一个简单示例:
class Api::V1::UsersController < Api::V1::BaseController
swagger_controller :users, 'Users'
swagger_api :show do
summary 'Returns a user'
param :path, :id, :integer, :optional, "User Id"
notes '/api/v1/users/:id'
response :ok, "Success", :Users
response :unauthorized
response :not_acceptable
response :not_found
end
def show
user = User.find(params[:id])
render(json: Api::V1::UserSerializer.new(user).to_json)
end
end
我已经使用 rake swagger:docs
生成了 swagger 文档,并且可以在我看到 Users#show
的文档的地方到达 http://localhost:3000/api-docs.json
,但是当我单击 "Try it out!" 时,我收到 api/v1/users/show
的模板丢失错误
api-docs.json
:
{
"apiVersion": "1.0",
"swaggerVersion": "1.2",
"basePath": "http://localhost:3000",
"apis": [
{
"path": "/api/v1/users.{format}",
"description": "Users"
}
],
"authorizations": null
}
users.json
:
{
"apiVersion": "1.0",
"swaggerVersion": "1.2",
"basePath": "http://localhost:3000",
"resourcePath": "users",
"apis": [
{
"path": "/api/v1/users/{id}.json",
"operations": [
{
"summary": "Returns a user",
"parameters": [
{
"paramType": "path",
"name": "id",
"type": "integer",
"description": "User Id",
"required": false
}
],
"notes": "/api/v1/users/:id",
"responseMessages": [
{
"code": 200,
"responseModel": "Users",
"message": "Success"
},
{
"code": 401,
"responseModel": null,
"message": "Unauthorized"
},
{
"code": 404,
"responseModel": null,
"message": "Not Found"
},
{
"code": 406,
"responseModel": null,
"message": "Not Acceptable"
}
],
"nickname": "Api::V1::Users#show",
"method": "get"
}
]
}
],
"authorizations": null
}
如何为我的 show 方法呈现正确的响应,以便它查找序列化的 json 而不是视图文件?
所以,我找到了答案。首先,删除由 rake swagger:docs
创建的所有 json 文件,并在 swagger_docs.rb
初始值设定项中添加以下内容: :clean_directory => true
以便每次 rake swagger:docs
都是 运行 , public 文件夹中的目录被清除。
为了让 swagger 文档与我使用 ActiveModel 的序列化程序构建 API 的方式一起工作,需要更改用 Api::V1::UsersController
编写的 DSL,如下所示:
swagger_api :show do
summary 'Returns a user'
param :path, :id, :integer, :optional, "User Id"
notes '/api/v1/users/:id'
end
然后 运行 rake swagger:docs
并且显示用户的调用应该可以正常工作。
我想知道是否有人在使用 Swagger UI 生成 API 文档之前完成过此操作,而 API 也不是由 Swagger 生成的。这是我的一个简单示例:
class Api::V1::UsersController < Api::V1::BaseController
swagger_controller :users, 'Users'
swagger_api :show do
summary 'Returns a user'
param :path, :id, :integer, :optional, "User Id"
notes '/api/v1/users/:id'
response :ok, "Success", :Users
response :unauthorized
response :not_acceptable
response :not_found
end
def show
user = User.find(params[:id])
render(json: Api::V1::UserSerializer.new(user).to_json)
end
end
我已经使用 rake swagger:docs
生成了 swagger 文档,并且可以在我看到 Users#show
的文档的地方到达 http://localhost:3000/api-docs.json
,但是当我单击 "Try it out!" 时,我收到 api/v1/users/show
api-docs.json
:
{
"apiVersion": "1.0",
"swaggerVersion": "1.2",
"basePath": "http://localhost:3000",
"apis": [
{
"path": "/api/v1/users.{format}",
"description": "Users"
}
],
"authorizations": null
}
users.json
:
{
"apiVersion": "1.0",
"swaggerVersion": "1.2",
"basePath": "http://localhost:3000",
"resourcePath": "users",
"apis": [
{
"path": "/api/v1/users/{id}.json",
"operations": [
{
"summary": "Returns a user",
"parameters": [
{
"paramType": "path",
"name": "id",
"type": "integer",
"description": "User Id",
"required": false
}
],
"notes": "/api/v1/users/:id",
"responseMessages": [
{
"code": 200,
"responseModel": "Users",
"message": "Success"
},
{
"code": 401,
"responseModel": null,
"message": "Unauthorized"
},
{
"code": 404,
"responseModel": null,
"message": "Not Found"
},
{
"code": 406,
"responseModel": null,
"message": "Not Acceptable"
}
],
"nickname": "Api::V1::Users#show",
"method": "get"
}
]
}
],
"authorizations": null
}
如何为我的 show 方法呈现正确的响应,以便它查找序列化的 json 而不是视图文件?
所以,我找到了答案。首先,删除由 rake swagger:docs
创建的所有 json 文件,并在 swagger_docs.rb
初始值设定项中添加以下内容: :clean_directory => true
以便每次 rake swagger:docs
都是 运行 , public 文件夹中的目录被清除。
为了让 swagger 文档与我使用 ActiveModel 的序列化程序构建 API 的方式一起工作,需要更改用 Api::V1::UsersController
编写的 DSL,如下所示:
swagger_api :show do
summary 'Returns a user'
param :path, :id, :integer, :optional, "User Id"
notes '/api/v1/users/:id'
end
然后 运行 rake swagger:docs
并且显示用户的调用应该可以正常工作。