- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是使用 rspec_api_documentation 和 rswag-ui 或通过将 swagger-ui 直接添加到项目中来显示参数和响应的多个示例。我在用我的配置生成正确的 open_api.json 时遇到了一些问题,我想知道我做错了什么。
gem :
# spec/acceptance_helper.rb
require 'spec_helper'
require 'rspec_api_documentation'
require 'rspec_api_documentation/dsl'
RspecApiDocumentation.configure do |config|
config.app = Rails.application
config.api_name = 'My API'
config.api_explanation = 'API Description'
config.configurations_dir = Rails.root.join('public', 'docs', 'api', 'config')
config.docs_dir = Rails.root.join('public', 'docs', 'api', 'generated')
config.format = :open_api
API_VERSIONS.each do |version|
config.define_group(version) do |config|
config.docs_dir = Rails.root.join('public', 'docs', 'api', 'generated', version.to_s)
end
end
config.client_method = :client
config.io_docs_protocol = 'https'
config.request_headers_to_include = nil
config.request_body_formatter = :json
config.response_headers_to_include = []
config.response_body_formatter = Proc.new { |response_content_type, response_body|
response_body
}
end
swagger: '2.0'
info:
title: My Api
description: Blah.
termsOfService: 'http://open-api.io/terms/'
contact:
name: API Support
url: 'http://www.open-api.io/support'
email: support@domain.com
license:
name: Apache 2.0
url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
version: 1.0.0
host: 'localhost:3000'
schemes:
- http
- https
consumes:
- application/json
produces:
- application/json
require 'documentation_helper'
resource 'Sessions' do
header 'Accept', 'application/json'
header 'Content-Type', 'application/json'
explanation 'Endpoints to start and end API sessions for a user'
route '/api/v1/users/sign_in', 'Sign In' do
route_summary 'Starts a new session for a user'
route_description 'Given valid credentials, will create a new API session for a user'
post 'Signing in a user', document: :v1 do
let(:user) { FactoryBot.create(:user) }
parameter :login, 'The username or email of the user', scope: :user, required: true
parameter :password, 'The password for the user', scope: :user, required: true
example '401 - No user object', document: :v1 do
request = { login: user.email, password: user.password }
do_request(request)
expect(status).to eq(401)
expect(json.keys.size).to eq(1)
expect(json['error']).to eq(I18n.t('devise.failure.unauthenticated'))
end
example '401 - No login', document: :v1 do
request = { user: { password: user.password } }
do_request(request)
expect(status).to eq(401)
expect(json.keys.size).to eq(1)
expect(json['error']).to eq(I18n.t('devise.failure.unauthenticated'))
end
end
end
end
{
"swagger": "2.0",
"info": {
"title": "My Api",
"description": "Blah.",
"termsOfService": "http://open-api.io/terms/",
"contact": {
"name": "API Support",
"url": "http://www.open-api.io/support",
"email": "support@domain.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "1.0.0"
},
"host": "localhost:3000",
"schemes": [
"http",
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/api/v1/users/sign_in": {
"post": {
"tags": [
"Sessions"
],
"summary": "Starts a new session for a user",
"description": "Given valid credentials, will create a new API session for a user",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "body",
"in": "body",
"description": "",
"required": false,
"schema": {
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {
"login": {
"type": "string",
"description": "The username or email of the user"
},
"password": {
"type": "string",
"description": "The password for the user"
}
},
"required": [
"login",
"password"
]
}
}
}
}
],
"responses": {
"401": {
"description": "No login",
"schema": {
"type": "object",
"properties": {
}
},
"headers": {
},
"examples": {
"application/json": {
"error": "You need to sign in or sign up before continuing."
}
}
}
},
"deprecated": false,
"security": [
]
}
}
},
"tags": [
{
"name": "Sessions",
"description": "Endpoints to start and end API sessions for a user"
}
]
}
{
"swagger": "2.0",
"info": {
"title": "My Api",
"description": "Blah.",
"termsOfService": "http://open-api.io/terms/",
"contact": {
"name": "API Support",
"url": "http://www.open-api.io/support",
"email": "support@domain.com"
},
"license": {
"name": "Apache 2.0",
"url": "http://www.apache.org/licenses/LICENSE-2.0.html"
},
"version": "1.0.0"
},
"host": "localhost:3000",
"schemes": [
"http",
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
"/api/v1/users/sign_in": {
"post": {
"tags": [
"Sessions"
],
"summary": "Starts a new session for a user",
"description": "Given valid credentials, will create a new API session for a user",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"parameters": [
{
"name": "body",
"in": "body",
"description": "",
"required": false,
"schema": {
"type": "object",
"properties": {
"user": {
"type": "object",
"properties": {
"login": {
"type": "string",
"description": "The username or email of the user"
},
"password": {
"type": "string",
"description": "The password for the user"
}
},
"required": [
"login",
"password"
]
}
}
}
}
],
"responses": {
"401": {
"description": "Invalid params",
"schema": {
"type": "object",
"properties": {
}
},
"headers": {
},
"examples": {
"No password": {
"error": "You need to sign in or sign up before continuing."
},
"No login": {
"error": "You need to sign in or sign up before continuing."
}
}
}
},
"deprecated": false,
"security": [
]
}
}
},
"tags": [
{
"name": "Sessions",
"description": "Endpoints to start and end API sessions for a user"
}
]
}
最佳答案
对不起,我迟到了一年,但我自己也遇到了这个。我目前正在尝试通过使用 swagger-codegen 将 open_api 输出转换为 open_api v3 来将我们的文档连接到 postman 。
在查看 rspec_api_documentation 的代码后,它看起来像是使用哈希作为构建文档的类型,并且它使用的 key 依赖于 path
+ http_method
.因此,如果您尝试有多个使用相同 key 但具有不同有效负载的示例,那么由于此原因,它将采用第一个:https://github.com/zipmark/rspec_api_documentation/blob/d3892cc7388460a98476734963face5a7a2ac158/lib/rspec_api_documentation/open_api/node.rb#L65
我解决这个问题的方法是将一个虚拟查询参数传递给路径以创建一个唯一的键。例子:
post "/api/v2/foos?example=example1" do
example "example1" do
do_request(payload1)
end
end
post "/api/v2/foos?example=example2" do
example "example2" do
do_request(payload2)
end
end
这并不完全理想,因为我宁愿在同一请求下将示例组合在一起,但它至少为我提供了我想要的文档(减去虚拟参数)。
关于ruby-on-rails - rspec_api_documentation - 如何有多个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60471608/
sanitize 是什么意思在 Rails 中是什么意思? 我正在阅读 CanCanCan 的文档.它说: When using strong_parameters or Rails 4+, you
在过去的几个月里,我感觉自己对 Ruby on Rails (RoR) 开发的了解达到了极限。我为大/小客户和 friend /爱好项目开发了大大小小的应用程序。我知道如何开发这些应用程序,但开始感觉
我昨天参加了一个关于扩展 Rails 的聚会,其中一个主题是 Hexagonal Rails。然而,我只做了一年的 Rails,对 MVC 结构非常满意(也许太舒服了),所以我不太了解适配器和消息队列
我使用多个 Rails 应用程序,一些在 Rails 3.2/Ruby 2.0 上,一些在 Rails 2.3/Ruby 1.8.7 上。 他们的共同点是,随着他们的成长和添加更多的依赖项/ gem
这个问题在这里已经有了答案: Using Rails-UJS in JS modules (Rails 6 with webpacker) (5 个答案) 关闭 3 年前。 我正在尝试使用 UJS
我正在开发一个当前使用 Rails 1.2 的 Rails 应用程序,所以我现在离最新的稳定版本(Rails 2.3)还有很长的路要走。 我应该如何进行迁移到更新版本的 Rails 的过程? 我应该一
尝试按照 Ryan Bates Backbone.js 教程构建抽奖应用程序,但我已经遇到了第一段代码的问题。在 application.js 的 init 函数中,他初始化了 Raffler 路由的
我正在使用 Rails 3.2 并且我有一个数据库表,我想在其中找到符合以下条件的所有行: a = true and b = true and ( 0 true, :b =>
我有一个用户类和一个联系人,其中联系人是用户的子类。这两个类都存储在用户表中。 我的联系人可能有也可能没有电子邮件地址,而我的用户需要一个电子邮件地址(我的用户模型定义中有 validates_pre
我正在编写一个教程,我在其中演示了一些 rails 命令。在我的机器上 rails和 script/rails两者都同样有效。有“首选”形式吗?两者中哪一个更普遍? 最佳答案 当您运行 rails 时
我正在寻找有关通过我的应用程序前进的最佳方式的建议,这是我首次开始集成Elasticsearch。我是一名初学者,但是热衷于深入研究,以便原谅任何明显的错误! 我遵循了http://www.sitep
我刚刚用 Rails new 启动了一个新的 Rails 应用程序,将默认数据库设置更改为 PostgresSQL。我用 bin/rails s 启动服务器,结果很奇怪 2016-04-21 05:0
我收到一个参数并希望它是这样的字符串: "abc,efg" 或者像这样的数组 ["abc","efg"] 在第一种情况下,我想将它转换成一个数组,什么是好的方法? 这是我的想法 if params[:
我刚刚用 Rails new 启动了一个新的 Rails 应用程序,将默认数据库设置更改为 PostgresSQL。我用 bin/rails s 启动服务器,结果很奇怪 2016-04-21 05:0
我收到一个参数并希望它是这样的字符串: "abc,efg" 或者像这样的数组 ["abc","efg"] 在第一种情况下,我想将它转换成一个数组,什么是好的方法? 这是我的想法 if params[:
我有 Rails 4,这是我的默认版本(我仍然希望它是)。但我不想在我的电脑上添加 rails 3.2。在以下命令中:gem install rails -v 3.2.16 我有这个警告: railt
您好,我想使用 Sheevaplug 构建一个“Rails Brick”来自 Marvell(操作系统是开箱即用的 Ubuntu,但您可以在其上安装其他发行版)。它将成为家庭服务器和静音、低成本(99
我需要能够从 Rails 控制台发送我的 Rails 应用程序的 Postgres 数据库中所有未接受的邀请。 (我有一个名为 Invitations 的表,其中包含一个名为 accepted 的 b
validate :cannot_modify_if_locked, on: :update def cannot_modify_if_locked if self.locked erro
我正在学习教程(学习 Rails 播客),需要更改以下路由语法,以便它与 Rails 3.0 兼容。谁能帮忙? map.view_page ':name', :controller => 'viewe
我是一名优秀的程序员,十分优秀!