3

Sinatra 経由でリクエストを受け取り、バックエンドの Github API で HTTP リクエストを起動するファサード API を作成しようとしています。

私の "hello world" スクリプトには次のものがあります。

#!/usr/bin/ruby

require 'httpclient'
require 'sinatra'

get '/foo' do
    "hello world"
end

ただし、次のようなエラーが発生します。

$ ./api.rb 
/usr/local/share/gems/gems/sinatra-1.4.3/lib/sinatra/base.rb:1408:in `run!': undefined method `run' for HTTP:Module (NoMethodError)
from /usr/local/share/gems/gems/sinatra-1.4.3/lib/sinatra/main.rb:25:in `block in <module:Sinatra>'

なぜこれが起こるのかわかりません。行をコメントアウトするとrequire 'httpclient'、問題なく動作します。

#!/usr/bin/ruby

#require 'httpclient'
require 'sinatra'

get '/foo' do
  "hello world"
end

$ ./api.rb 
[2013-06-26 21:43:12] INFO  WEBrick 1.3.1
[2013-06-26 21:43:12] INFO  ruby 1.9.3 (2013-05-15) [x86_64-linux]
[2013-06-26 21:43:12] WARN  TCPServer Error: Cannot assign requested address - bind(2)
== Sinatra/1.4.3 has taken the stage on 4567 for development with backup from WEBrick
[2013-06-26 21:43:12] INFO  WEBrick::HTTPServer#start: pid=31272 port=4567

私の推測では、Sinatra は HTTPClient を単独で使用しており、何らかの名前空間の衝突が発生しています。HTTPClient と Sinatra を同時に使用する方法はありますか?

要求された情報は次のとおりです。

$ gem list sinatra httpclient

*** LOCAL GEMS ***

sinatra (1.4.3)

$ gem out sinatra httpclient
bigdecimal (1.1.0 < 1.2.0)
io-console (0.3 < 0.4.2)
json (1.6.8 < 1.8.0)
rdoc (3.12 < 4.0.1)

私はこの方法で httpclient のバージョンを見つけました:

$ locate httpclient.rb
/usr/local/share/gems/gems/httpclient-2.3.3/lib/httpclient.rb
/usr/local/share/gems/gems/httpclient-2.3.3/test/test_httpclient.rb

私のOSはFedora 17ですが、それが重要かどうかはわかりません.

4

1 に答える 1

13

理由がわかりました。HTTPClient は、 という名前のモジュールを定義しますHTTP。デフォルトでは、Sinatra は名前空間名HTTPWEBrickの順に Rack ハンドラを探します。

名前空間が定義されているため、HTTPSinatra は実際にはそれが Rack ハンドラであると考えています。これは Sinatra のバグだと思います。runハンドラーが使用する前に応答するかどうかを確認する必要があります。

とにかく、修正は Thin を使用することです。または、WEBrick を使用する場合は、Sinatra に次のようにして自動ラック検出をスキップするよう明示的に指示します。

set :server, 'webrick'

これにより、Sinatra は HTTPClientHTTPモジュールが Rack ハンドラーであると考えることができなくなります。

于 2013-06-27T06:17:27.573 に答える