Sinatra和Grape API在一起?

Cri*_*era 9 ruby rubygems heroku sinatra grape-api

我一直在读书,我发现这个名为Grape的微框架用于红宝石.我目前正在使用Sinatra来处理Web界面,但我还想实现Grape来处理应用程序的API方面.我找不到任何有用的建议来解决这个问题.葡萄文档说"Grape是一个类似REST的API微框架,用于Ruby.它设计用于在Rack上运行,或通过提供简单的DSL来轻松开发RESTful API,从而补充现有的Web应用程序框架,如Rails和Sinatra." 所以听起来应该有正式的两种方式相结合的方式吗?这个应用程序也将在Heroku上运行.

iai*_*ain 21

您正在寻找的短语是:

  • 多个机架应用
  • 机架中间件
  • 映射网址架sinatra

那种事.Grape,Sinatra和Rails都是Rack应用程序.这意味着你可以构建你的Grape应用程序,你的Sinatra应用程序和你的Rails应用程序,然后你可以使用Rack来运行它们,因为它们都是Rack兼容的,因为它们共享一个界面.

这在实践中意味着你编写应用程序,然后将它们放在一个rackup文件中运行它们.使用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) 
Run Code Online (Sandbox Code Playgroud)

如果您想从Grape自述文件中添加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)
Run Code Online (Sandbox Code Playgroud)

希望这足以让你开始.一旦你知道在哪里看,有很多例子.您还可以使用use(请参阅http://www.sinatrarb.com/intro#Rack%20Middleware)在Sinatra应用程序中运行其他应用程序,我也看到Grape也提供了mount关键字.有很多可用的方法,一开始可能有点令人困惑,但只是尝试一下,看看他们做了什么,你最喜欢什么.其中很大一部分是偏好,所以不要害怕去感觉正确.Ruby对于人类来说不仅仅是计算机:)


编辑:一个带有"内部"葡萄应用程序的Sinatra应用程序

class App < Sinatra::Base
  use Twitter::API
  # other stuff…
end

# config.ru
# instead of URLMap…
map "/" do
  run App
end
Run Code Online (Sandbox Code Playgroud)

我相信它会是那样的.