2

現在、私は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?これは、この問題にアプローチする完全に間違った方法ですか?

私はほぼすべてのソリューションにオープンですが、このパターンを頻繁に使用するつもりであるため、外部要件を最小限に抑えて、できるだけシンプルに保ちたいと考えています。

追加情報が必要な場合はお知らせください。提供できるよう最善を尽くします。

4

1 に答える 1

0

異なるサーバー (puma、webrick、thin) を使用して sinatra 1.4.4 で同じ問題に直面したため、sinatra と open-uri が互いにステップオーバーしているようです。

私の解決策はに切り替えることcurbで、これで問題は解決しました。

于 2014-03-06T07:37:26.017 に答える