1

在现实世界中,感谢 Rack::Builder,我启动了两个 sinatra 应用程序并将一个映射到“/api/v1”,另一个映射到“/ui”。

我希望映射到 /ui 的应用程序能够利用 /api 中的路由,但是因为它们是分开的,所以 ui 应用程序无法在 api 方面执行调用。

有没有办法通过机架从另一个应用程序的路由调用,或者我应该只使用 Net::HTTP ?

这是我正在尝试做的一个简化示例:

#/usr/bin/ruby
require 'sinatra'

class API < Sinatra::Base
  get '/accounts/' do
    '{"json":"account_data"}'
  end
end

class UI < Sinatra::Base
  get '/accounts/' do
    # How do I get /api/accounts?
    # call "/api/accounts" obviously does not work

    # would use erb here to render accounts list in human readable form
  end
end

rack = Rack::Builder.new

rack.map "/ui" do
  run UI.new
end

rack.map "/api" do
  run API.new
end

Rack::Server.start :app => rack
exit

非常感谢!

4

1 回答 1

1

如果这些应用程序一起放在 Rack 中,它们就没有真正的连接性。Rack.call(env)对任何你已经安装的应用程序的调用和响应[status,env,body] 你可以在中间有层来操作和修改env。您的机架正在触发#call您映射以响应该路径的任何应用程序。被调用的应用程序不知道 Rack 中运行的是什么。env除非上游填充了它的句柄,否则它也不能调用另一个应用程序。

但是您必须首先考虑为什么决定制作这两个不同的应用程序。我想这是因为可能有多个应用程序使用 API。或者你享受解耦的自然。因此,在这种情况下,您必须考虑是否需要通过 Rack 进行一些耦合。如果 API 在另一台服务器上怎么办?2 through Rack 之间的任何内部链接都会破坏 UI 应用程序。如果您始终知道您的 API 将在同一台机器上自包含,那么您也可以将其设为库而不进行 HTTP 调用。

因此,即使可以从一个合作的应用程序中调用路线,我也永远不会这样做。拥有 API 服务器的全部原因是有一个解耦层。而且您应该通过 HTTP 访问该层,以便它在同一个盒子上或世界各地都可以工作。

于 2013-08-16T22:00:08.010 回答