senäh

17senäh und so…

HTML/CSS/JS
27. Okt 2013
Kommentare: 5

Baucis

Kategorien: HTML/CSS/JS | 27. Okt 2013 | Kommentare: 5

Serie: Einführung in den MEAN Stack

Im heutigen Artikel wenden wir unser theoretisches Wissen über REST praktisch an. Zu diesem Zweck stelle ich Baucis vor, welches uns schnell und einfach eine vollständige REST API generiert.

Baucis ist ein Framework, welches das Konzept von REST auf Mongoose Schemas anwendet und diese als Express Middleware zur Verfügung stellt. Zuerst müsste ihr Baucis installieren. Die aktuellste Version zum Zeitpunkt des Schreibens ist 0.6.17:

$ npm install baucis

Die Benutzung von Baucis ist simpel. Ihr müsst lediglich ein Mongoose Schema zu einer URL zuweisen. Anschließend wird die REST API als Middleware über Express offen gelegt. Der Code sieht folgendermaßen aus:

var mongoose = require('mongoose');
var baucis = require('baucis');
var express = require('express');

mongoose.connect('mongodb://localhost:27017/todo-db');

var TodoSchema = new mongoose.Schema({
    title: { type: String, default: '' },
    completed: { type: Boolean, default: false }
});
mongoose.model('todo', TodoSchema);

baucis.rest({
  singular: 'todo',
  plural: 'todos'
});

express()
  .use('/api', baucis())
  .listen(1337, '127.0.0.1');

Als Schema definieren wir Todos bestehend aus einem String namens title und einem Boolean namens completed, der anzeigt, ob das Todo gelöst wurde oder nicht. Das Schema wird todo genannt. Soweit gibt es keine Veränderung zum vorigen Beispiel außer das wir ein Feld mit dem Typ Boolean verwenden, welches beim Anlegen eines neuen Todos automatisch false ist. Anschließend wird über die Methode baucis.rest die CRUD-Funktionalität auf das Schema todo übertragen. Diese Methode nimmt ein Konfigurationsobjekt entgegen, dessen Wert für das Feld singular exakt dem Namen des entsprechenden Schemas entsprechen muss. Der Wert für das Feld plural wird eigentlich automatisch gesetzt und spielt bei der späteren URL für die REST API ein Rolle. Da Baucis in diesem Fall aus todo fälschlicherweise den Plural todoes macht, setze ich manuell die richtige Pluralform todos.

Als einzige Middleware wird baucis() verwendet, welche den Route-Prefix /api erhält. Der Prefix ist frei wählbar, aber /api ist ein häufig verwendeter Prefix für den Zugang zur REST API. Die Middleware baucis() erlaubt es nun das vorher über baucis.rest offengelegte Mongoose Schema über eine REST API zu steuern.

Ruft ihr nun http://127.0.0.1:1337/api/todos im Browser auf, erhaltet ihr ein leeres Array („[]“). todos ist die vorher festgelegte Pluralform von todo und das leere Array besagt, dass der Aufruf korrekt war, aber noch kein Dokument in der Collection todo existiert. Mit dem Command Line Tool cURL könnt ihr schnell ein entsprechendes Dokument anlegen. Es ist unter Mac OS X vorinstalliert. Der Befehl lautet:

$ curl -X POST -H 'Content-Type: application/json' -d '{"title":"REST lernen"}' http://127.0.0.1:1337/api/todos

Ruft ihr nun http://127.0.0.1:1337/api/todos auf, so seht ihr das eben erstellte Todo:

REST API im Einsatz

Das Feld _id wird automatisch von MongoDB gesetzt und das Feld __v wird automatisch von Mongoose gesetzt. _id werden wir gleich verwenden, um das Dokument zu manipulieren; __v kann für diese Artikelserie ignoriert werden (siehe hier für mehr Informationen).

Mit der Methode PUT und der _id können wir unser Dokument aktualisieren. Beachtet das eure _id vermutlich anders ist!

$ curl -X PUT -H 'Content-Type: application/json' -d '{"completed":"true"}' http://127.0.0.1:1337/api/todos/524989d90c67d4a135000001

Jetzt ist das Feld completed auf true gesetzt. Ihr könnt es gerne im Browser überprüfen. Mit folgendem Befehl kann das Todo komplett gelöscht werden.

$ curl -X DELETE http://127.0.0.1:1337/api/todos/524989d90c67d4a135000001

Glückwunsch! Ihr habt eine funktionierende REST API. Im nächsten Kapitel werden wir die letzten Vorbereitungen treffen, um anschließend einen Client für unsere Webapplikation mit AngularJS zu entwickeln.

Autor: Pipo

...kommt ursprünglich aus der Designerecke, ist aber im Laufe seines Studiums in die Webentwicklung gestolpert. Kann sich seit dem nicht so richtig entscheiden wo er hingehört und wagt deswegen vielleicht die Flucht nach vorne in ein komplett neues Gebiet. Vielleicht Management? Niemand weiß es. Auch er nicht.