© Matej Kotula/Shutterstock.com
Teil 2: Moderne Web-APIs mit Node.js

Gib mir den REST


Als im Jahr 2007 das erste iPhone auf den Markt kam, war klar, dass diese Erfindung bahnbrechend sein wird. Seit dieser Zeit tragen wir unseren Taschencomputer bei uns. Das Beste daran ist, dass wir damit ins Internet kommen und alle möglichen Informationen abrufen können. Die ersten mobilen Seiten waren jedoch eine Qual: serverseitig gerenderte Internetseiten. In der heutigen Entwicklerwelt sind Web-APIs ein oft genutztes Wort. Doch was genau steckt dahinter?

Mit jeder Navigation die komplette Internetseite neu laden zu müssen, war früher und ist auch heute – vor allem mit Egde-Verbindungsqualität – keine Freude. Abhilfe schaffen hier leichtgewichtige Datenschnittstellen in Form von modernen Web-APIs. Sie übertragen nur noch das, was der Client zur Anzeige benötigt. Die clientseitige Anwendung selbst kann offline in Form von Apps auf dem Endgerät liegen. Die Informationen lassen sich damit schneller übertragen und sorgen für ein angenehmes Gefühl bei der App-Nutzung.

Heutzutage ist der Begriff Web-APIs in aller Munde. Die Abkürzung API steht für Web Application Programming Interface – also eine webbasierte Programmierschnittstelle. Einfach ausgedrückt macht ein Client einen HTTP(S)-Request und erhält daraufhin Daten. Ein Prinzip, dass wir schon lange kennen. Doch was ist nötig, damit wir das Adjektiv „modern“ vor ein Web-API setzen können? Moderne Web-APIs sind schlanke, einfache, durch standardisierte Sicherheitsmaßnahmen geschützte Schnittstellen. Sie können als vollständige REST Web APIs implementiert werden, über RESTful Web APIs bis hin zu einem normalen HTTP(S)-basierten Web-API. Auch eine Implementierung über WebSockets für die Echtzeitkommunikation ist möglich. Abbildung 1 zeigt die Gemeinsamkeit aller Web-APIs und den grundlegenden Aufbau für das Prädikat „modern“.

image

Abb. 1: Grundlegender Aufbau eines modernen HTTP(S)-basierten Web-APIs

Generell besteht ein Web-API aus drei grundlegenden Komponenten. Die erste ist ein Konsument bzw. ein Client, stellvertretend dargestellt durch einen Browser (Abb. 1). Dabei kann es sich um jeden beliebigen Client handeln, solange er HTTP(S) spricht – prinzipiell also auch ein vernetzter Kühlschrank. Die zweite Komponente ist ein Security Token System (STS). Es dient zum Ausstellen und – optional – Validieren von Tokens, sodass wir unser Web-API vor unbefugtem Zugriff schützen können. Die dritte Komponente ist das Web-API selbst. Es abstrahiert funktionale Services hinter einem wohldefinierten Interface. Für den Client spielt es keine Rolle, woher das Web-API seine Daten bezieht, solange er eine Antwort bekommt, die er erwartet.

Auch der Kommunikationsablauf verhält sich zumeist recht ähnlich. Hat der Client kein oder ein abgelaufenes Token, wird er zunächst das STS aufrufen, um ein neues Token zu beziehen. Im einfachsten Fall reichen ein Benutzername und ein Passwort für ein neues Token aus. Zusammen mit dem Token ruft er das Web-API auf. Bevor das Web-API damit loslegt, die Daten zu beziehen, wird es das Token validieren. Die Validierung kann beispielsweise über das STS erfolgen. Ist das Token gültig, können die Daten abgerufen, gesammelt und aggregiert werden, bevor die Antwort meist in Form von JSON an den Client geschickt wird. Im Rahmen dieses Artikels werden wir den STS gedanklich auf dem Papier lassen und uns den Web-APIs widmen.

Moderne Web-APIs in Node.js

Wie es in der Node.js-Welt üblich ist, gibt es für die Realisierung von Web-APIs bereits viele verschiedene Frameworks. Beispielsweise kann man auf die Module express, restify oder koa zurückgreifen. Express und koa bieten neben der reinen Verwendung als API-Framework beide auch weitere Funktionalitäten an, um vollumfängliche Webapplikationen beispielsweise mit einem MVC-Pattern abzubilden. Restify ist der Platzhirsch, wenn es sich um eine reine Web-API-Entwicklung handelt. Prinzipiell spielt es keine Rolle, welches Framework eingesetzt wird, da die Unterschiede in Bezug auf die Nutzung der Frameworks eher im Detail liegen oder an persönlichen Vorlieben. Im Rahmen dieses Artikels werden wir restify [1] nutzen, um ein kleines Web-API zur Kundenverwaltung zu schreiben.

Customer as a Service

Wir werden nun gemeinsam Schritt für Schritt das Projekt entwickeln, sodass wir über ein Web-API verschiedene Operationen mit Kunden ausführen können. Die Operationen umfassen das typische Create-Read-Update-Delete-Szenario (CRUD) sowie die Auflistung aller Kunden. Das Projekt ist öffentlich auf GitHub [2] einsehbar. Wie eingangs erwähnt, abstrahieren Web-APIs funktionale Services hinter einer wohldefinierten Schnittstelle. Unsere funktionalen Services sind fünf Operationen, die wir mit Kunden durchführen können. Diese Operationen werden wir als RESTful-HTTP-Schnittstelle anbieten. Das bedeutet, dass wir pro Operation einen eigenen URL mit einem semantisch passenden HTTP-Verb definieren:

  • Liste aller Kunden: GET /customers
  • Detailansicht eines Kunden: GET /customer/:id
  • Anlegen eines Kunden: POST /customer
  • Editieren eines Kunden: PUT /customer/:id
  • Löschen eines Kunden: DELETE /customer/:id

Die Angabe :id steht für einen Platzhalter im URL, der bei der tatsächlichen Anfrage durch einen Integer-Wert ersetzt wird.

Man muss das Rad nicht neu erfinden

Zu Beginn erstellen wir einen neuen Ordner customerApi, in dem wir all unsere Sourcen speichern. Per Kommandozeilen navigieren wir nun zu diesem Ordner und führen folgenden Befehl aus:

npm init -y

Damit initialisieren wir unseren Paketmanager mit einer Standard-package.json-Datei, in der grundlegende Informationen wie Abhängigkeiten oder Beschreibungen vom Projekt abgelegt sind. Wir benötigen diese Datei nun, da wir unsere erste Abhängigkeit restify installieren wollen. Das geschieht über die folgende Eingabe in der Kommandozeile:

npm install --save restify

Dieses Kommando dient generell der Installation von neuen Paketen. Das Flag --save gibt an, dass wir die installie...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang