現在、私はSinatra WebアプリとGrape APIを持っています.Webアプリが別のAPIコンシューマーになるようにSinatraアプリを実装するという考えです。
私のconfig.ruにはこれがあります:
run Rack::Cascade.new [API, Application]
API
グレープアプリApplication
であり、シナトラアプリです。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
スピンアップしてからスピンアップするrackup
ので、使用できる2つのインスタンスがopen("http://project.dev/what/ever/url/i_need")
あり、魅力のように機能します. つまり、問題は open-uri 自体を指すことにどこかにあるようです...私は思う...
これはのせいRack::Cascade
ですか?これは問題thin
ですか?または多分とopen-uri
?これは、この問題にアプローチする完全に間違った方法ですか?
私はほぼすべてのソリューションにオープンですが、このパターンを頻繁に使用するつもりであるため、外部要件を最小限に抑えて、できるだけシンプルに保ちたいと考えています。
追加情報が必要な場合はお知らせください。提供できるよう最善を尽くします。