2

目前我有一个 Sinatra 网络应用程序和一个 Grape API,其想法是实现 Sinatra 应用程序,使网络应用程序只是另一个 API 使用者。

在我的 config.ru 我有这个:

run Rack::Cascade.new [API, Application]

API是 Grape 应用程序,Application也是 Sinatra 应用程序。我正在使用 open-uri 尝试从 Sinatra 路由中的 Grape api 获取 JSON。我用的是薄的。为了便于阅读,我在端口号后面省略了 /uri,Grape 和 Sinatra 应用程序独立运行,稍后我将进一步解释

open("http://localhost")返回:

#<StringIO:0x007fbeab1b2e68
@base_uri=#<URI::HTTP:0x007fbeab1d47e8 URL:http://localhost>,
@meta=
 {"content-type"=>"text/html; charset=utf8",
  "x-pow-template"=>"welcome",
  "date"=>"Fri, 06 Sep 2013 07:29:15 GMT",
  "connection"=>"keep-alive",
  "transfer-encoding"=>"chunked"},
@status=["200", "OK"]>

但是,如果我open("http://localhost:9292")的应用程序挂起。我觉得可能有什么东西阻塞了 I/O,比如它可能在等待自己连接到自己,但我不确定引擎盖下发生了什么,无法真正确定。

如果我将 pow 指向它,将其旋转起来,project.dev然后用它旋转起来,rackup这样我就有两个可以使用的实例open("http://project.dev/what/ever/url/i_need"),它就像一个魅力。所以问题似乎出在将open-uri指向自身的某个地方......我认为......

这是因为Rack::Cascade? 这是一个问题thin吗?或者也许 with open-uri?这只是解决这个问题的完全错误的方法吗?

我对几乎任何解决方案都持开放态度,但我更愿意让它尽可能简单,因为我打算经常使用这种模式,所以外部需求最少。

如果需要任何其他信息,请告诉我,我会尽力提供。

4

1 回答 1

0

似乎 sinatra 和 open-uri 相互交叉,因为我在使用不同服务器(puma、webrick、thin)的 sinatra 1.4.4 中遇到了同样的问题。

我的解决方案是切换到curb,这解决了问题。

于 2014-03-06T07:37:26.017 回答