我一直在阅读,发现这个micro-framework called Grape是 ruby 。我目前正在使用Sinatra来处理Web界面,但我也想实现Grape来处理应用程序的API方面。我找不到关于此主题的任何有用建议。葡萄的文档说:“Grape是用于Ruby的类似REST的API微框架。它旨在在Rack上运行,或者通过提供简单的DSL轻松开发RESTful API来补充现有的Web应用程序框架(如Rails和Sinatra)。”因此,听起来应该有一种将两者结合起来的官方方法对吗?该应用程序还将在Heroku上运行。

最佳答案

您要查找的短语是:

  • 多个机架应用程序
  • 机架中间件
  • 映射URL机架sinatra

  • 那种事Grape,Sinatra和Rails都是Rack应用程序。这意味着您可以构建自己的Grape应用程序,Sinatra应用程序和Rails应用程序,然后可以使用Rack运行它们,因为它们都是兼容Rack的,因为它们共享接口(interface)。

    实际上,这意味着您要编写应用程序,然后将其放入机架文件中以运行它们。一个使用2个Sinatra应用程序的简短示例(但它们可以是任意数量的任何种类的Rack应用程序):
    # app/frontend.rb
    require 'sinatra/base'
    # This is a rack app.
    class Frontend < Sinatra::Base
      get "/"
        haml :index
      end
    end
    
    __END__
    
    @@ layout
    %html
      = yield
    
    @@ index
    %div.title This is the frontend.
    
    
    # app/api.rb
    # This is also a rack app.
    class API < Sinatra::Base
    
      # when this is mapped below,
      # it will mean it gets called via "/api/"
      get "/" do
        "This is the API"
      end
    end
    
    # config.ru
    require_relative "./app/frontend.rb"
    require_relative "./app/api.rb"
    
    # Here base URL's are mapped to rack apps.
    run Rack::URLMap.new("/" => Frontend.new,
                         "/api" => Api.new)
    

    如果您想从Grape README中添加Twitter API示例:
    # app/twitter_api.rb
    module Twitter
      # more code follows
    
    # config.ru
    require_relative "./app/twitter_api.rb" # add this
    
    # change this to:
    run Rack::URLMap.new("/" => Frontend,
                         "/api" => API,
                         "/twitter" => Twitter::API)
    

    希望这足以让您入门。一旦您知道要查找的位置,就会有很多示例。您还可以通过使用use(请参阅http://www.sinatrarb.com/intro#Rack%20Middleware)在Sinatra应用程序内运行其他应用程序,并且我看到Grape也提供了mount关键字。有很多可用的方法,起初可能会有些困惑,但是只需尝试一下,看看它们的作用以及您最喜欢的是什么。它的很大一部分是偏爱,所以不要害怕去做对的事情。 Ruby比计算机更适合人类:)

    编辑:带有Grape应用程序“内部”的Sinatra应用程序
    class App < Sinatra::Base
      use Twitter::API
      # other stuff…
    end
    
    # config.ru
    # instead of URLMap…
    map "/" do
      run App
    end
    

    我相信会是那样。

    关于ruby - Sinatra和Grape API在一起吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15102293/

    10-13 05:40