【问题标题】:Grape API + Grape Swagger versioning issueGrape API + Grape Swagger 版本控制问题
【发布时间】:2018-07-25 05:13:30
【问题描述】:

尝试采用未版本化的 Grape + Rails API 并将其分解为 v1 和 v2,并遵循在线发布的几种不同模式。但我不能让它正常工作。当我得到 swagger 文档时,我不断收到这个无益的错误:

无法从 http://localhost:3000/api/v1/swagger_doc 读取 swagger JSON

我不确定这是从哪里来的,无论是来自我的 Grape API 结构、路由还是大摇大摆的东西。我做错了什么?

宝石是:

gem 'grape'
gem 'grape-entity'
gem 'grape-swagger'
gem 'grape-swagger-ui'

文件结构:

app/
  api/
    v1/
      api.rb
      calendars.rb
      schedule_cycles.rb
      scheduled_events.rb
    v2/
      api.rb
      calendars.rb
      schedule_cycles.rb
      scheduled_events.rb
    api.rb

app/api/api.rb:

Dir[File.dirname(__FILE__) + '/v1/*.rb'].each do |file| 
  require file
end

Dir[File.dirname(__FILE__) + '/v2/*.rb'].each do |file| 
  require file
end

module API
  class Root < Grape::API
    prefix 'api'
    mount API::V1::Root 
    mount API::V2::Root

    add_swagger_documentation
  end
end

app/api/v1/api.rb:

Dir[File.dirname(__FILE__) + '/*.rb'].each do |file| 
  require file
end

module API
    module V1
      class Root < Grape::API
        prefix 'v1'
        mount API::V1::Calendars
        mount API::V1::ScheduleCycles
        mount API::V1::ScheduledEvents
      end
    end
end

app/api/v2/api.rb:

Dir[File.dirname(__FILE__) + '/*.rb'].each do |file| 
  require file
end

module API
    module V2
      class Root < Grape::API
        mount API::V2::Calendars
        mount API::V2::ScheduleCycles
        mount API::V2::ScheduledEvents
      end
    end
end

config/routes.rb:

Rails.application.routes.draw do
    mount API::Root => '/'

    namespace :api do
      namespace :v1 do

            resources :calendars do
                resources :schedule_cycles
                resources :scheduled_events
            end

        end
    end

    namespace :api do
      namespace :v2 do

            resources :calendars do
                resources :schedule_cycles
                resources :scheduled_events
            end

        end
    end

end

然后,我的实际 Grape API 类遵循如下格式,来自 app/api/v1/schedule_cycles.rb:

module API
    module V1       
        class ScheduleCycles < Grape::API
            # configure whether it's developers only here
          helpers ApiHelpers::AuthenticationHelper
          # before { restrict_access_to_developers }
          before { authenticate! }

          format :json

            # ScheduleCycle endpoints here
          desc 'End-points for ScheduleCycles'
          namespace :schedule_cycles do
            desc 'Retrieve schedule_cycles'
            params do
              requires :token, type: String, desc: 'user token'
            end
            get do
                schedule_cycles = ScheduleCycle.all
                present schedule_cycles, with: Entities::ScheduleCycleEntity
            end

..

  end
end

【问题讨论】:

    标签: ruby-on-rails swagger grape


    【解决方案1】:

    我发现了这一点,并发布了对我有用的内容,以防其他人发现它有用。这真的只是一个大摇大摆的问题。首先,我需要将add_swagger_documentation 移动到实际版本的Root 类中,而不是在父API Root 类中,其次,我需要为swagger 添加api_version 参数。我还将prefix 参数也移到了这些版本类中。结果变成:

    app/api/api.rb:

    Dir[File.dirname(__FILE__) + '/v1/*.rb'].each do |file| 
      require file
    end
    
    Dir[File.dirname(__FILE__) + '/v2/*.rb'].each do |file| 
      require file
    end
    
    module API
      class Root < Grape::API
        mount API::V1::Root 
        mount API::V2::Root
      end
    end
    

    app/api/v1/api.rb:

    Dir[File.dirname(__FILE__) + '/*.rb'].each do |file| 
      require file
    end
    
    module API
        module V1
          class Root < Grape::API
            prefix 'api/v1'
    
            mount API::V1::Calendars
            mount API::V1::ScheduleCycles
            mount API::V1::ScheduledEvents
    
            add_swagger_documentation api_version: 'v1'
          end
        end
    end
    

    app/api/v2/api.rb:

    Dir[File.dirname(__FILE__) + '/*.rb'].each do |file| 
      require file
    end
    
    module API
        module V2
          class Root < Grape::API
            prefix 'api/v2'
    
            mount API::V2::Calendars
            mount API::V2::ScheduleCycles
            mount API::V2::ScheduledEvents
    
            add_swagger_documentation api_version: 'v2'
          end
        end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多