目前我有一个 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
?这只是解决这个问题的完全错误的方法吗?
我对几乎任何解决方案都持开放态度,但我更愿意让它尽可能简单,因为我打算经常使用这种模式,所以外部需求最少。
如果需要任何其他信息,请告诉我,我会尽力提供。