Jak sprawić, by Sinatra działała z HTTPClient?
Próbuję utworzyć interfejs fasadowy, który odbiera żądania za pośrednictwem Sinatry, a następnie uruchamia żądania HTTP na interfejsie API Github w zapleczu.
W moim skrypcie „Witaj świecie” mam:
#!/usr/bin/ruby
require 'httpclient'
require 'sinatra'
get '/foo' do
"hello world"
end
Jednak działa na błędy takie jak:
$ ./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>'
Nie rozumiem, dlaczego tak się dzieje. Jeśli komentujęrequire 'httpclient'
line, działa dobrze:
#!/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
Domyślam się, że Sinatra używa HTTPClient samodzielnie i ma miejsce kolizja przestrzeni nazw. Czy istnieje sposób na jednoczesne używanie HTTPClient i Sinatra?
OK tutaj jest żądana informacja:
$ 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)
W ten sposób wymyśliłem wersję 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
Mój system operacyjny to Fedora 17, choć nie jestem pewien, czy ma to znaczenie.