可以在机架应用程序中使用open-uri吗?

时间:2013-09-06 07:42:56

标签: sinatra rack open-uri grape-api

目前我有一个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合作?这完全是解决这个问题的错误方法吗?

我对任何解决方案持开放态度,但我希望尽可能保持简单,只需极少的外部需求,因为我打算经常使用这种模式。

如果需要任何其他信息,请与我们联系。我会尽力提供。

1 个答案:

答案 0 :(得分:0)

看起来sinatra和open-uri互相攻击,因为我使用不同的服务器(puma,webrick,thin)与sinatra 1.4.4面临同样的问题。

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