2013-02-27 16 views
8

Ich habe gelesen und ich fand diese micro-framework called Grape für Rubin. Ich benutze derzeit Sinatra, um die Webschnittstelle zu handhaben, aber ich möchte auch Grape implementieren, um den API-Aspekt der App zu behandeln. Ich kann keine hilfreichen Vorschläge zu diesem Thema finden. Die Weintrauben-Dokumentation sagt: "Grape ist ein REST-ähnliches API-Mikroframework für Ruby. Es wurde entwickelt, um auf Rack zu laufen oder bestehende Webanwendungsframeworks wie Rails und Sinatra zu ergänzen, indem es ein einfaches DSL bereitstellt, um einfach RESTful-APIs zu entwickeln." Es klingt also so, als müsste es eine offizielle Art geben, beide zu kombinieren, oder? Diese App wird auch auf Heroku laufen.Sinatra und Grape API zusammen?

+0

Ich stieß auf diese [http://www.slideshare.net/yorzi/rapid-rubyapiongrape-8674582], die vielleicht etwas nützlich sein könnte – SMT

Antwort

19

Die Phrasen Sie suchen sind:

  • mehreren Rack-Anwendungen
  • Rack-Middleware
  • Mapping Urls sinatra

diese Art der Sache Rack. Grape, Sinatra und Rails sind alle Rack apps. Dies bedeutet, dass Sie Ihre Grape-App, Ihre Sinatra-App und Ihre Rails-App erstellen können und dann Rack verwenden können, da sie alle Rack-kompatibel sind, da sie eine -Schnittstelle teilen.

Was dies bedeutet in der Praxis ist, schreiben Sie die Anwendungen, und dann legen Sie sie in eine Rackup Datei, um sie auszuführen. Ein kurzes Beispiel unter Verwendung von 2 Sinatra-Anwendungen (aber sie könnte ein beliebige Anzahl von jeder Art von Rack-Anwendungen sein):

# 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) 

Wenn Sie das Twitter-API Beispiel aus der Traube README hinzufügen wollen:

# 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) 

Hoffentlich ist das genug, um Sie zu beginnen. Es gibt viele Beispiele, wenn Sie wissen, wo Sie suchen müssen. Sie können auch andere Anwendungen innerhalb einer Sinatra-App mit use (siehe http://www.sinatrarb.com/intro#Rack%20Middleware) laufen lassen und ich sehe, dass Grape das mount Schlüsselwort auch anbietet. Es gibt viele Möglichkeiten, die zunächst etwas verwirrend sein können, aber probieren Sie sie einfach aus und sehen Sie, was sie tun und was Ihnen am besten gefällt. Ein großer Teil davon ist Präferenz, also haben Sie keine Angst zu gehen, was sich richtig anfühlt. Ruby ist für die Menschen mehr als der Computer :)


Edit: A Sinatra App mit einer Traube App "innen"

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

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

Ich glaube, es so etwas wie das sein wird.

+0

Hallo vielen Dank für Ihre Antwort. Wie kann ich diese Methode verwenden, aber muss meine API vom root/auch laufen? –

+0

@CristianRivera Ich habe ein Beispiel hinzugefügt, das ich _believe_ werde, wie es geht. So würde es mit anderen Rack-Apps und Sinatra funktionieren. – iain

+0

Hallo, ich habe versucht, was Sie vorgeschlagen, und ich habe "Interner Server Fehler" in meinem Browser, in den Serverprotokollen habe ich "!! Unerwarteter Fehler bei der Verarbeitung der Anfrage: falsche Anzahl von Argumenten (1 für 0)" –