14.4 Einen Webservice anbieten 

Anforderung
Im Folgenden erstellen wir eine Web-Applikation, die einen Webservice anbieten kann.
Jeder Flughafen besitzt einen dreistelligen Buchstaben-Code (IATA-Code). Mit unserer Web-Applikation soll es möglich sein, die Flughäfen zu verwalten. Zu jedem Flughafen sollen einfach nur der Code und der entsprechende Name des Flughafens gespeichert werden. Neben der Weboberfläche soll auch eine REST-Schnittstelle erstellt werden, die es anderen Applikationen erlaubt, auf diese Daten zuzugreifen. Es soll z. B. möglich sein, zu einem Code den Namen des Flughafens abzufragen.
Mit Rails lassen sich diese Anforderungen leicht realisieren. Wir erstellen ein neues Rails-Projekt und generieren mit dem scaffold-Generator ein Model Airport mit dem passenden Controller und den Views.
- rails airport-service
- cd airport-service
- ruby script/generate scaffold airport \
name:string code:string - rake db:migrate
Die Weboberfläche 

Nachdem wir den lokalen Rails-Server gestartet haben, können über die URL http://localhost:3000/airports die Flughäfen webbasiert verwaltet werden.
Abbildung Liste der Flughäfen
Die API 

Über die URL http://localhost:3000/airports/3 können wir z. B. den dritten Airport anzeigen. Diese Darstellung ist jedoch nicht für die Kommunikation zwischen Applikationen geeignet.
Abbildung Airport mit der ID 3
XML
Dafür bietet sich der Austausch über das XML-Format an. Der scaffold -Generator hat den Controller bereits entsprechend vorbereitet. Der Aufruf der dritten Airport-Ressource im XML-Format erfolgt dann über den Aufruf http://localhost:3000/airports/3.xml .
Abbildung XML-Darstellung
Das genügt uns jedoch noch nicht. Wir hätten gerne die Möglichkeit, dass bei Übergabe eines Codes der Name des Airports ausgegeben wird.
Dazu fügen wir eine neue Action with_code im Airports-Controller hinzu, die zu dem Parameter code den entsprechenden Airport sucht.
Listing app/controllers/airports_controller.rb
class AirportsController < ApplicationController ... def with_code @airport = Airport.find_by_code(params[:code]) respond_to do |format| format.html { render :action => :show} format.xml { render :xml => @airport } end end end
Routing erweitern
Um jedoch per URL darauf zugreifen zu können, muss das Routing für die Ressource airports erweitert werden. Dazu kann die Option :collection angewendet werden, über die der Name unserer Methode und die HTTP-Methode angegeben werden.
Listing config/routes.rb
map.resources :airports, :collection => {:with_code => :get}
Nach einem Neustart des lokalen Rails-Servers können wir zu einem Code den Namen eines Flughafens sowohl im HTML-Format als auch im XML-Format abfragen:
Abbildung http://localhost:3000/airports/with_code?code=LUX
Abbildung http://localhost:3000/airports/with_code.xml?code=LUX
Im nächsten Abschnitt wird gezeigt, wie eine andere Rails-Applikation mit Hilfe von ActiveResource sehr einfach auf den Webservice zugreifen kann.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.