Расширение для приложения Sinatra - PullRequest
2 голосов
/ 18 марта 2012

У меня есть простой сервер в Синатре, как

require 'sinatra/base'

class Server < Sinatra::Base

  get '/' do
    "root"
  end

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

end

Я хочу иметь возможность включать модули для каждого API, которые могут использовать Sinatra DSL. Это может быть как:

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

Затем я хочу включить модуль SomeApi в мой класс Server, чтобы иметь возможность получить результат вызова API из URL "http://localhost/someapi/api_method". Можно ли изменить код, чтобы я мог это сделать, или я должен использовать другой фреймворк, чем Синатра? Большое спасибо!

1 Ответ

3 голосов
/ 19 марта 2012

Может быть, вы найдете метод map из Rack полезным.С его помощью вы можете сделать что-то вроде:

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%    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...