Erste Praxiserfahrungen mit Backend as a Service

Seite 2: Parse & Azure Mobile Services

Inhaltsverzeichnis

Parse, der zweite große Fels in der BaaS-Landschaft, wurde mittlerweile von Facebook gekauft. Es lässt sich wie bei Kinvey mit einem kostenfreien Startpaket beginnen. Das umfasst ein GByte Speicherplatz in Verbindung mit einer Million API-Requests pro Monat. Zusatzdienste und weitere Komfortfunktionen gibt es in kostenpflichtigen Paketen.

Auch hier wird als Erstes ein Account für den Start benötigt. Dabei kann man alternativ einen Facebook-, GitHub- oder Google-Account zur Authentifizierung angeben. Es wird danach in einer Weboberfläche eine Anwendung angelegt und dabei API-Keys generiert, gefolgt von der Auswahl der zu nutzenden Module – im Beispiel das "Data"-Modul mit der Zielplattform "Web". Jetzt besteht die Möglichkeit, ein bestehendes Projekt für diese Plattform zu übernehmen oder ein neues anzulegen. Damit man den Dienst nutzen kann, benötigt man wieder eine JavaScript-Bibliothek. Diese lässt sich per CDN beziehen:

<script src="http://www.parsecdn.com/js/parse-1.2.13.min.js"></script>

Alternativ gibt es diese Datei aber auch als lokale Bibliothek zum Herunterladen. Zusätzlich generiert Parse eine Zip-Datei mit einer kleinen HTML-Starterdatei, um den Einstieg zu vereinfachen. In ihr sind das HTML-Gerüst erstellt und die notwendigen Bibliotheken nebst Initialisierung geladen. Es fehlt nur noch das Austauschen der API-Keys in der Parse.initialize()-Funktion:

Parse.initialize("APPLICATION_ID", "JAVASCRIPT_KEY");

Nach diesem Einzeiler kann es mit den Standardfunktionen losgehen. Das Speichern von Daten erfolgt bei Parse etwas anders als bei Kinvey. Hier wird mit Parse.Object.extend() ein Objekt vererbt. Die damit erzeugte Instanz kann einfach per instanz.set(eigenschaft, wert) neue Eigenschaften übergeben bekommen.

Die Instanz besitzt aber auch noch durch die Vererbung einige interessante Funktionen. Da ist zum Beispiel save(), das die beiden Callbacks "success" und "error" kennt. Mit der Funktion wird dann der Datensatz gespeichert. Dabei bekommt jedes Datenobjekt automatisch eine Eigenschaft "id" mit einem eindeutigen Wert.

Das Laden von Daten kann auch durch die beim Speichern vergebene ID erfolgen. Dafür wird wieder per extend() vom Parse.Object abgeleitet, aber nun mit dem Aufruf von Parse.Query(Objekt) eine neue Query-Instanz erstellt. Sie wird dann die ID übergeben und stellt für das Ergebnis einen Success- beziehungsweise Error Callback zur Verfügung.

Lässt sich allerdings nicht direkt per eindeutigem ID-Schlüssel auf einen Datensatz zugreifen, ist die Zeit für Abfragen gekommen. Der erste Aufbau gleicht dem der ID-Abfrage. Allerdings werden statt query.get() nun Vergleichsoperatoren wie query.equalTo(eigenschaft, wert); aufgerufen. Das dann folgende query.find() liefert per Success- oder Error Callback das Ergebnis vom Backend. Auch hier ist die Query-Abfrage beliebig komplexer möglich.

Darüber hinaus bietet Parse nicht nur das Speichern und Lesen von Daten an. Es gibt noch Komfortfunktionen wie serverseitige Logik beziehungsweise Jobs. Auch an Analytics oder Push-Dienste wurde gedacht.

Parse bietet ebenfalls komplett fertige Beispielprojekte an. Hier gibt es etwa die obligatorische To-do-Liste. Der Quellcode ist auch auf GitHub zu finden.

Hier geht's zum BaaS-Komplettbeispiel für Parse.

Auch Microsoft ist beim BaaS-Geschäft dabei. Unter dem Label Azure Mobile Services wird unter anderem ein BaaS-Dienst angeboten. Hier ist gleich eine ganze Masse an Zielplattformen vertreten, natürlich Windows und Windows Phone, aber auch iOS und Android fehlen nicht. Darüber hinaus gibt es ein JavaScript-SDK. Als kostenfreien Einstieg gibt es leider nur ein zeitlich begrenztes Testangebot mit 20 MByte Datenbankplatz bei 500 aktiven Geräten mit maximal 500.000 API-Aufrufen. Nach zwölf Monaten wird die Nutzung kostenpflichtig. Für das Angebot benötigt man außerdem ein Microsoft-Konto (ehemals Windows-LiveID).

Nach dem Registrieren landet man in einer sich in den Browser integrierenden Azure Management Console. Hier ist ein neuer Dienst zu abonnieren. Dabei wird erst die Servicekategorie "Server" gewählt und danach der Typ "Mobiler Service". Vergleichbar mit den anderen Anbietern wird nun ein Anwendungsname vergeben, allerdings ist das auch gleich die URL zum Backend (https://<appname>.azure-mobile.net/). Das heißt, diese muss einzigartig sein und wird daher automatisch überprüft. Anders als bei den anderen BaaS-Anbietern wird direkt angegeben, was der Dienst in einer SQL-Datenbank speichern soll. Es gibt die Möglichkeit einer kostenfreien 20-MByte-Datenbank oder das Erstellen einer eigenen Datenbankinstanz mit zusätzlichen Kosten je nach Ausprägung. Dazu werden noch der Backend-Typ und die Region des Hostings ausgewählt.

Im zweiten Schritt folgt die Vergabe von Nutzernamen und Passwort für die SQL-Datenbank. Das ist erforderlich, da sich auch mit den Data Tools aus Visual Studio auf den Datensatz zugreifen lässt. Damit ist der SQL-Server erstellt. Darauf geht es an das Datendesign. Hier wählt man zunächst die Zielplattform aus, hier "HTML/JavaScript". Im Reiter "Daten" lässt sich nun eine Tabelle anlegen. Neben einigen vorgegebenen Spalten wie "id" kann man eigene definieren – für das Beispiel also "vorname", "nachname" und "alter". Danach lässt sich mit der Implementierung in der eigenen Webseite beginnen.

Wie bei Kinvey und Parse ist zum Arbeiten mit dem Backend erst einmal eine JavaScript-Bibliothek einzubinden.

<script src='http://ajax.aspnetcdn.com/ajax/mobileservices/
MobileServices.Web-1.1.0.min.js'></script>

Nach dem Laden der Bibliothek wird der Service initialisiert. Dafür ruft man erst WindowsAzure.MobileServiceClient auf und erstellt danach eine neue Instanz des MobileServiceClient. Als Argumente werden die URL und der generierte App-Key übergeben. Die damit erzeugte Client-Variable ist im Nachhinein für das Beziehen jeglichen Tabelleninhalts zu gebrauchen. Für das Arbeiten mit beispielsweise der Personen-Tabelle reicht ein Aufruf von client.getTable('Person'), um Zugriff zu erhalten.

var MobileServiceClient = WindowsAzure.MobileServiceClient;
var client = new MobileServiceClient('https://testapp42.azure-mobile.net/',
'dZSmjfaURRNbxOlvAhXlRZXiHiGcvc97');
var personTable = client.getTable('Person');

Damit sich nun Daten speichern lassen, reicht die Funktion insert() aus. Hier wird ein Objekt mit den Schlüssel/Wert-Paaren übergeben, das den Spaltennamen der Tabelle entspricht. Am Schluss lässt sich über ein Promise .done() prüfen, ob das Einfügen erfolgreich war. Beim Speichern wird zusätzlich ein eindeutiger Bezeichner in Form einer UUID (Universally Unique Identifier) automatisch mitgeneriert.

Will man mit der ID den Datensatz wieder aufrufen, geht das mit der Funktion .where. Ihr wird ein Abfrageobjekt übergeben – hier in Form der Spalte "id", die mit dem Bezeichner des Datensatzes gesetzt wird. Wenn man aber mit einer Abfrage nach einem Wert einer Spalte operiert, ist einfach das Abfrageobjekt zu ändern. Damit sind die wichtigsten Datenmanipulationen besprochen.

Der größte Unterschied zu anderen Anbietern ist sicherlich, dass Tabellen auf einer SQL-Server-Instanz erstellt werden. Mit diesemAnsatz ist es im Gegensatz zu Kinvey und Parse nicht möglich, versehentlich aus einer Eigenschaft "vorname" eine Eigenschaft "VorName" zu stellen, die dann zusätzlich im Dokumentenspeicher erzeugt wird. Es würde eine Fehlermeldung erscheinen, dass das Tabellenschema die Spalte nicht kennt. Das ist eine Einschränkung der Flexibilität durch Schemata, aber eben auch eine Schutz vor möglichen Fehlern. Beim Thema Skalierung lässt Microsoft dem Admin die Wahl, ob automatisch skaliert werden oder die Verantwortung beim Admin manuell liegen soll.

Hier geht's zum BaaS-Komplettbeispiel für die Azure Mobile Services.