【ruby on rails】rswag使用

命令

  • 生成文档
ruby 复制代码
rake rswag

一些代码

ruby 复制代码
# frozen_string_literal: true

require 'rails_helper'

RSpec.configure do |config|

  config.swagger_root = Rails.root.join('swagger').to_s

  # the root example_group in your specs, e.g. describe '...', swagger_doc: 'v2/swagger.json'
  config.swagger_docs = {
  	#  'v1/swagger.yaml' => {
    'v1/swagger.json' => {   
      openapi: '3.0.1',
      info: {
        title: 'API V1',
        version: 'v1'
      },
      paths: {},
   	  servers: [
        {
          url: 'http://{defaultHost}',
          description: '本地开发',
          variables: {
            defaultHost: {
              default: '127.0.0.1:3000'
            }
          }
        },
        {
          url: 'https://{defaultHost}',
          description: '测试服',
          variables: {
            defaultHost: {
              default: 'api.xxx.com' # 默认https
            }
          }
        }
      ],
      components: {
        securitySchemes: {
          # Bearer: {
          #   description: 'token necessary to use API calls',
          #   type: :apiKey,
          #   name: 'X-Admin-Authorization',
          #   in: :header
          # }
          bearer_auth: {
            type: :http,
            scheme: :bearer,
            bearerFormat: 'JWT'
          }
        },

        schemas: {
          marks: {
            type: :array,
            items: {
              type: :object,
              properties: {
                date: { type: :string },
                score: { type: :number },
                worksheet: { type: :string }
              }
            }
          },
          importances: {
            type: :array,
            items: {
              type: :object,
              properties: {
                school_id: { type: :integer },
                importance: { type: :integer }
              }
            }
          },
          improvement_priorities: {
            type: :array,
            items: {
              type: :object,
              properties: {
                priority: { type: :integer },
                school_id: { type: :integer }
              }
            }
          },
          subtopics: {
            type: :array,
            items: {
              type: :object,
              properties: {
                id: { type: :integer },
                name: { type: :string },
                marks: { '$ref' => '#/components/schemas/marks' },
                topic_id: { type: :integer },
                difficulty: { type: :integer },
                consistency: { type: :number },
                importances: { '$ref' => '#/components/schemas/importances' },
                proficiency: { type: :number },
                improvement_priorities: { '$ref' => '#/components/schemas/improvement_priorities' }
              }
            }
          },
          topics: {
            type: :array,
            items: {
              type: :object,
              properties: {
                id: { type: :integer },
                name: { type: :string },
                strand_id: { type: :integer },
                subtopics: { '$ref' => '#/components/schemas/subtopics' },
                difficulty: { type: :integer },
                consistency: { type: :number },
                importances: { '$ref' => '#/components/schemas/importances' },
                proficiency: { type: :number },
                improvement_priorities: { '$ref' => '#/components/schemas/improvement_priorities' }
              }
            }
          },
          strands: {
            type: :array,
            items: {
              type: :object,
              properties: {
                id: { type: :integer },
                name: { type: :string },
                topics: { '$ref' => '#/components/schemas/topics' }
              }
            }
          },
          latest_assessment: {
            type: :object,
            properties: {
              name: { type: :string },
              marks: { type: :integer },
              date_done: { type: :string },
              total_marks: { type: :integer }
            }
          },
          subjects: {
            type: :array,
            items: {
              type: :object,
              properties: {
                id: { type: :integer },
                name: { type: :string },
                target: { type: :integer },
                strands: { '$ref' => '#/components/schemas/strands' },
                latest_assessment: { '$ref' => '#/components/schemas/latest_assessment' },
                overall_proficiency: { type: :integer }
              }
            }
          },
          levels: {
            type: :array,
            items: {
              type: :object,
              properties: {
                id: { type: :integer },
                name: { type: :string },
                level: { type: :integer },
                subjects: { '$ref' => '#/components/schemas/subjects' }
              }
            }
          },
          student: {
            type: :object,
            properties: {
              id: { type: :integer },
              student_id: { type: :string },
              first_name: { type: :string },
              last_name: { type: :string },
              registration_date: { type: :string },
              school_id: { type: :integer },
              photo: {
                type: :object,
                properties: {
                  url: { type: :string }
                }
              },
              overview_data: {
                type: :object,
                properties: {
                  levels: { '$ref' => '#/components/schemas/levels' }
                }
              }
            }
          },
          detailed_subtopic: {
            type: :object,
            properties: {
              code: { type: :integer, default: 200 },
              message: { type: :string, default: 'ok' },
              data: { '$ref' => '#/components/schemas/partial_subtopic' },
            }
          },
          detailed_topic: {
            type: :object,
            properties: {
              code: { type: :integer, default: 200 },
              message: { type: :string, default: 'ok' },
              data: {
                type: :array,
                items: {
                  type: :object,
                  properties: {
                    date: { type: :string },
                    proficiency: { type: :number },
                    contributions: { '$ref' => '#/components/schemas/partial_subtopic' },
                    subtopic_id: { type: :integer },
                    subtopic_name: { type: :string }
                  }
                }
              }
            }
          },
          partial_subtopic: {
            type: :array,
            items: {
              type: :object,
              properties: {
                date: { type: :string },
                proficiency: { type: :number },
                contributions: {
                  type: :array,
                  items: {
                    type: :object,
                    properties: {
                      score: { type: :number },
                      worksheet: { type: :string },
                      date: { type: :string }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  # Defaults to json. Accepts ':json' and ':yaml'.
  config.swagger_format = :json
end
ruby 复制代码
 path '/api/v1/students/{id}' do
    # You'll want to customize the parameter types...
   parameter name: :'X-Admin-Authorization', in: :header, type: :string, required: false, default: 'sdfsd'
   parameter name: :page, in: :query, type: :integer, required: false
   parameter name: 'id', in: :path, type: :integer, description: 'id'
   
   get('show student') do
      tags 'students'
      security [ bearer_auth: []]  # security [ Bearer: []]
      produces 'application/json'
      
 	  response '401', 'need login to create' do
        let(:id) { 100 }
        run_test!
      end
      
      response(200, 'successful') do
        schema type: :object,
               properties: {
                code: { type: :integer, default: 200 },
                message: { type: :string, default: 'ok' },
                data: { '$ref' => '#/components/schemas/student' }
               }
        # let(:id) { '123' }
        # run_test!  # 运行测试
        xit  # 跳过测试用例
      end
    end
  end
end
ruby 复制代码
  path '/api/v1/pets' do

    post 'Creates a pet' do
      tags 'Pets'
      consumes 'application/json', 'application/xml'
      parameter name: :pet, in: :body, schema: {
        type: :object,
        properties: {
          name: { type: :string },
          photo_url: { type: :string },
          status: { type: :string }
        },
        required: [ 'name', 'status' ]
      }

      response '201', 'pet created' do
        let(:pet) { { name: 'Dodo', status: 'available' } }
        run_test!
      end

      response '422', 'invalid request' do
        let(:pet) { { name: 'foo' } }
        run_test!
      end
    end
  end
相关推荐
paopaokaka_luck13 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
捂月1 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
瓜牛_gn2 小时前
依赖注入注解
java·后端·spring
Estar.Lee2 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
喜欢猪猪2 小时前
Django:从入门到精通
后端·python·django
一个小坑货2 小时前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet272 小时前
【Rust练习】22.HashMap
开发语言·后端·rust
uhakadotcom3 小时前
如何实现一个基于CLI终端的AI 聊天机器人?
后端
Iced_Sheep3 小时前
干掉 if else 之策略模式
后端·设计模式
XINGTECODE3 小时前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang