2012-03-18 33 views
2

我在西納特拉一個簡單的服務器,像擴展爲西納特拉應用

require 'sinatra/base' 

class Server < Sinatra::Base 

    get '/' do 
    "root" 
    end 

    get '/api/:apiname' do 
    "return api from module #{params.apiname}" 
    end 

end 

我希望能夠以包括每個API,它可以使用DSL西納特拉模塊。這可能是這樣的:

module SomeApi 
    get '/api_method' 
    "result of api call" 
    end 
end 

然後我想包括SomeApi模塊,以我的Server類,要能夠從URL的「http://本地主機/ someapi /的api_method」獲得API調用的結果。是否有可能改變我的代碼,以便能夠做到這一點,或者我應該使用另一個框架,然後Sinatra?非常感謝!

回答

3

也許你會發現Rack的map方法有用。有了它,你可以這樣做:

config.ru:

require 'sinatra/base' 
require './app' 

map('/api1'){ run API1 } 
map('/api2'){ run API2 } 
map('/'){ run Server } 

app.rb:

class Server < Sinatra::Base 
    get '/' do 
    "root" 
    end 

    get '/foo' do 
    "foo from Server" 
    end 
end 

class API1 < Sinatra::Base 
    get '/foo' do 
    "foo from API1" 
    end 
end 

class API2 < Sinatra::Base 
    get '/foo' do 
    "foo from API2" 
    end 
end 

啓動服務器:

$ thin start 
>> Using rack adapter 
>> Thin web server (v1.3.1 codename Triple Espresso) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:3000, CTRL+C to stop 

測試:

$ curl localhost:3000 
root% 
$ curl localhost:3000/foo  
foo from Server%  
$ curl localhost:3000/api1/foo 
foo from API1% 
$ curl localhost:3000/api2/foo 
foo from API2%  
+0

謝謝,那就是我一直在尋找的。 – Ondra 2012-03-18 22:11:48