Sinatra и Grape API вместе?

Я читал и нашел эту микро-структуру Grape для рубина. В настоящее время я использую Sinatra для обработки веб-интерфейса, но я также хотел бы реализовать Grape для обработки аспекта API приложение. Я не могу найти полезных предложений по этой теме. В документации по grape говорится: «Grape - это REST-подобная микросхема API для Ruby. Она предназначена для работы в Rack или дополняет существующие инфраструктуры веб-приложений, такие как Rails и Sinatra, предоставляя простой DSL для простой разработки RESTful API». Похоже, должен быть официальный способ их объединения, верно? Это приложение также будет работать на Heroku.


person Cristian Rivera    schedule 27.02.2013    source источник
comment
Я наткнулся на this, который, возможно, может быть немного полезен   -  person Stephen Tetreault    schedule 27.02.2013


Ответы (1)


Вам нужны следующие фразы:

  • несколько стоечных приложений
  • промежуточное ПО для стойки
  • сопоставление URL-адресов стойки sinatra

Такие вещи. Grape, Sinatra и Rails - это приложения Rack. Это означает, что вы можете создать свое приложение Grape, приложение Sinatra и приложение Rails, а затем вы можете использовать Rack для их запуска, поскольку все они совместимы с Rack, потому что они имеют общий интерфейс.

На практике это означает, что вы пишете приложения, а затем помещаете их в файл rackup для их запуска. Краткий пример использования двух приложений Sinatra (но это может быть любое количество любых приложений для стойки):

# app/frontend.rb
require 'sinatra/base'
# This is a rack app.
class Frontend < Sinatra::Base
  get "/"
    haml :index
  end
end

__END__

@@ layout
%html
  = yield

@@ index
%div.title This is the frontend.


# app/api.rb
# This is also a rack app.
class API < Sinatra::Base

  # when this is mapped below,
  # it will mean it gets called via "/api/"
  get "/" do
    "This is the API"
  end
end

# config.ru
require_relative "./app/frontend.rb"
require_relative "./app/api.rb"

# Here base URL's are mapped to rack apps.
run Rack::URLMap.new("/" => Frontend.new, 
                     "/api" => Api.new) 

Если вы хотите добавить пример Twitter API из Grape README:

# app/twitter_api.rb
module Twitter
  # more code follows

# config.ru
require_relative "./app/twitter_api.rb" # add this

# change this to:
run Rack::URLMap.new("/" => Frontend, 
                     "/api" => API,
                     "/twitter" => Twitter::API)

Надеюсь, этого достаточно, чтобы вы начали. Если вы знаете, где искать, можно найти множество примеров. Вы также можете запускать другие приложения внутри приложения Sinatra, используя use (см. http://www.sinatrarb.com/intro#Rack%20Middleware), и я вижу, что Grape также предлагает ключевое слово mount. Доступно множество способов, которые поначалу могут немного сбивать с толку, но просто попробуйте их и посмотрите, что они делают и что вам больше всего нравится. По большей части это предпочтения, поэтому не бойтесь делать то, что кажется правильным. Ruby для человека больше, чем компьютер :)


Изменить: приложение Sinatra с приложением Grape "внутри"

class App < Sinatra::Base
  use Twitter::API
  # other stuff…
end

# config.ru
# instead of URLMap…
map "/" do
  run App
end

Я верю, что будет что-то в этом роде.

person iain    schedule 27.02.2013
comment
Здравствуйте, спасибо за ответ. Как я могу использовать этот метод, но мой API также запускается из корня /? - person Cristian Rivera; 28.02.2013
comment
@CristianRivera Я добавил пример, который, верю, покажет, как это сделать. Так будет работать с другими приложениями Rack и Sinatra. - person iain; 28.02.2013
comment
Привет, я попробовал то, что вы предложили, и у меня возникла внутренняя ошибка сервера в моем браузере, в журналах сервера, которые я получил !! Неожиданная ошибка при обработке запроса: неверное количество аргументов (1 вместо 0) - person Cristian Rivera; 01.03.2013
comment
@CristianRivera, вам нужно описать, что именно вы сделали, и что именно было сообщением об ошибке, в вашем вопросе в качестве редактирования, иначе это будет сложно исправить с помощью комментариев. - person iain; 01.03.2013
comment
Привет, я заставил ваш метод работать, но в итоге я использовал другой метод и запустил их как два отдельных приложения heroku. Я тоже отмечу это как ответ. - person Cristian Rivera; 03.03.2013