【问题标题】:Sinatra and Grape API together?Sinatra 和 Grape API 在一起?
【发布时间】:2013-02-12 16:21:42
【问题描述】:

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

【问题讨论】:

  • 我遇到了this,也许有点用处

标签: ruby heroku rubygems sinatra grape-api


【解决方案1】:

您要查找的短语是:

  • 多个机架应用程序
  • 机架中间件
  • 映射 url 机架 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) 

如果您想从 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 更适合人类而不是计算机 :)


编辑:Sinatra 应用程序“内部”有 Grape 应用程序

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

# config.ru
# instead of URLMap…
map "/" do
  run App
end

我相信会是这样的。

【讨论】:

  • 您好,谢谢您的回答。我怎样才能使用这种方法,但让我的 API 也从根 / 运行?
  • @CristianRivera 我添加了一个示例,我相信将说明如何做到这一点。这就是它与其他 Rack 应用程序和 Sinatra 一起使用的方式。
  • 您好,我尝试了您的建议,但在浏览器中出现“内部服务器错误”,在服务器日志中出现“!!处理请求时出现意外错误:参数数量错误(1 代表 0) "
  • @CristianRivera 您需要在您的问题中概述您所做的确切内容以及错误消息的确切内容,作为编辑,否则将很难通过 cmets 修复。
  • 您好,我确实让您的方法起作用,但我最终使用了另一种方法并将它们作为两个单独的 heroku 应用程序运行。我也会将此标记为答案。
猜你喜欢
  • 2013-05-06
  • 2012-10-14
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多