ruby – 如何让Sinatra使用HTTPClient?
发布时间:2020-12-17 01:50:28 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个Facade API,通过Sinatra接收请求,然后在后端的 Github API上启动HTTP请求. 在我的“你好世界”剧本中我有: #!/usr/bin/rubyrequire 'httpclient'require 'sinatra'get '/foo' do "hello world"end 但是,它会遇到如下错误: $./api.rb /us
我正在尝试创建一个Facade API,通过Sinatra接收请求,然后在后端的
Github API上启动HTTP请求.
在我的“你好世界”剧本中我有: #!/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 我的操作系统是Fedora 17,但不确定它是否重要. 解决方法
我找到了原因. HTTPClient定义了一个名为HTTP的模块.默认情况下,Sinatra按顺序查找名称空间名称为HTTP和WEBrick的Rack处理程序.
由于已经定义了HTTP命名空间,因此Sinatra实际上认为它是一个Rack处理程序.我认为这是Sinatra的一个错误.它应该检查处理程序在使用之前是否响应运行. 无论如何,修复是使用Thin,或者如果你想使用WEBrick,那么明确告诉Sinatra跳过自动机架检测: set :server,'webrick' 这将阻止Sinatra认为HTTPClient HTTP模块是Rack处理程序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |