目前我有一个Sinatra网络应用程序&一个Grape API,其目的是以一种Web应用程序只是另一个API使用者的方式实现Sinatra应用程序。
在我的config.ru中,我有这个:
run Rack::Cascade.new [API, Application]
API
是Grape app& 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的东西,比如它可能会等待自己连接到自身,但我不确定它们是什么?在引擎盖下真的可以确定。
如果我指着它,请在project.dev
&amp;然后使用rackup
将其旋转,这样我就可以使用open("http://project.dev/what/ever/url/i_need")
&amp;它就像一个魅力。所以这个问题似乎在某种程度上指向开放式的uri ...我认为......
这是因为Rack::Cascade
吗?这是thin
的问题吗?或者与open-uri
合作?这完全是解决这个问题的错误方法吗?
我对任何解决方案持开放态度,但我希望尽可能保持简单,只需极少的外部需求,因为我打算经常使用这种模式。
如果需要任何其他信息,请与我们联系。我会尽力提供。
答案 0 :(得分:0)
看起来sinatra和open-uri互相攻击,因为我使用不同的服务器(puma,webrick,thin)与sinatra 1.4.4面临同样的问题。
我的解决方案是切换到curb
,这解决了问题。