在已经存在Grape :: API端点后如何添加?

时间:2019-06-14 13:44:43

标签: ruby grape grape-api

使用Grape时遇到一个非常奇怪的问题。 项目的结构不是最简单,但仍然非常简单明了,我在Rails应用程序中有一个app/api文件夹,其中包含一个或多或少像这样的API类:

class Api < Grape::API
  prefix 'api/v2'
  ...
  mount V2::Controller::User
  ...
end

然后,我在app/api/v2/下有几个可以完成其工作的类,分为控制器,模型,服务,验证器等常用的东西。 在正式的Grape文档之后,所有内容都“挂载”在config/application.rb中(我不会重复,唯一改变的是文件夹的名称。

我必须添加另一个端点,而不是'api / v2',我想要的是'api / internal'之类的名称或其他名称,然后我遵循相同的结构,添加一个app/api/internal_api.rb类,该类遵循与Api类,更改前缀和一些其他次要内容,以及app/api/internal下的端点。 我可以运行rails c并执行InternalApi.new,结果与预期的一样,并且app/api/internal下的端点已明确加载。 不幸的是,运行该应用程序时,新端点不存在,而且我不理解为什么它具有这种行为。

我已经检查了ActiveSupport::Dependencies.autoload_paths,并且一切正常,我还应该检查什么,这可能是什么原因?我还安装了https://github.com/syedmusamah/grape_on_rails_routes,它显示了app/api/v2下的所有路由,而没有显示app/api/internal下的所有路由。可能一个端点遮盖了另一个端点吗?

1 个答案:

答案 0 :(得分:0)

评论时间太长,因此我将在这里拍照,并告诉我是否错误,然后删除答案。

我假设“ API”是“ app / api / api.rb”(或达到该目的),这就是安装“ v2”的位置。

鉴于您当前的设计,我建议将所有V2挂载移动到新的V2命名空间API类,例如。 (“ app / api / v2 / api.rb”)

 module V2
   class API < Grape::API
      version 'v2', using: :path
      mount V2::Controller::User
      #....
   end
 end 

这将允许您创建另一个名称空间(内部)“ app / api / internal / api.rb”

  module Internal
    class API < Grape::API
      # mount Internal::Controller::User
    end
  end

然后更改现有的以挂载那些:

 class Api < Grape::API
   prefix 'api'
   mount V2::API
   mount Internal::API => '/internal'
 end

这将避免冲突,以便可以通过“ api / v2”访问v2,通过“ api / internal”访问内部(如果您愿意,甚至可以更进一步)

TL; DR (仅是我的见解和经验)

我们运行了许多Web服务,我建议从一开始就在模块内部对它们进行命名间隔,以避免这些问题。 通常,我们的多版本(单一职责)API目录结构如下所示:

app
  api 
    api
      common
      v1
        [lots of other files] 
        base.rb
      v2
        [lots of other files] 
        base.rb
      base.rb

这将使您可以像这样将所有端点安装在“ api / api / base.rb”中

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

这样,当您需要新结构时,可以在其自己的模块中构建该结构,然后将其安装在API :: Base中并避免任何冲突。