Nach einer komplexen Daten-Migration sowie der Implementierung von vielen Kunden-spezifischen Funktionalitäten, gingen wir live. Anfang 2021 war der neuen Webauftritt von Zürich Tourismus aufgeschaltet. Mit dabei war die erste Version einer Open Data Schnittstelle. Dank dieser Schnittstelle ist es Partnern möglich, aktuelle Daten von der Website zu konsumieren.
Konzeption der Schnittstelle in Drupal 9
Die Schnittstelle bestand auf Drupal 7 - nun heisst es ablösen. Die Anforderungen des Kunden waren klar: wir sollten die Schnittstelle möglichst ähnlich nachbilden und in Drupal 9 statt Drupal 7 implementieren. Die Struktur der Daten muss Schema.org unterstützen, weshalb diese Schnittstelle in Drupal 7 auf die Bedürfnisse von Zürich Tourismus massgefertigt wurde.
Für die Entwicklung der neuen Open Data Schnittstelle wollten wir möglichst viele Funktionalitäten der Drupal Community verwenden. Das hilft, die Maintainability und die Qualität hoch zu halten und natürlich Zeit zu sparen.
Es gibt verschiedene Ansätze um eine solche Schnittstelle zu bauen. Und wie so oft, haben alle Ansätze ihre pros und contras.
Ansatz 1: Verwendung von bestehenden Normalisierungs-Modulen
In Drupal gibt es mehrere Module, die bereits ein ähnliches Bedürfnis abdecken, wie z.B. das Core-Modul JSON:API. Diese Module sind sehr generisch implementiert. So werden möglichst alle Felder der Entitäten normalisiert . Braucht man jedoch eine komplett andere Struktur oder bei gewissen Feldern noch zusätzliche Logik, muss in Anpassungs-Arbeit investiert werden. Dazu kommt, dass diese Module meist viel mehr Funktionalitäten bereitstellen als schlussendlich wirklich gebraucht werden. Das senkt die Flexibilität und wegen den vielen nicht verwendeten Funktionalitäten schwindet auch die Übersichtlichkeit.
Ansatz 2: Massgefertigte Normalisierung in Kombination mit dem RESTful Web Services Modul
Ebenfalls ein Drupal Core-Modul ist das RESTful Web Services Modul. Mit diesem Modul können, mit geringem Aufwand, REST Schnittstellen in ein Drupal Projekt integriert werden. Die Open Data Schnittstelle mittels diesem Modul zu implementieren heisst viel Aufwand, da auch die ganze Normalisierung selbst gemacht werden muss. Andererseits ist die Flexibilität sehr hoch, da alles selbst implementiert wird. Durch die gewonnene Flexibilität steigt auch die Möglichkeit, die Implementierung übersichtlich und nachhaltig zu realisieren.
Umsetzung
Die Normalisierung erreichen wir mittels einer Normalizer-Klasse, welche Drupal Entitäten in die von uns erstellte Modell-Klassen transformiert. Die Modell-Klassen bilden dabei die Typen von Schema.org ab. Am Beispiel einer Entität des Node-Typs Place, zeigt die folgende Grafik den Prozess. Der Model Typ entspricht in diesem Fall LocalBusiness.
Durch die Verwendung dieser Modelle, wird die Zuweisung und die Transformation voneinander abgekapselt. Und durch eine toArray Funktion auf der Model-Klasse ergibt sich die volle Kontrolle, wie Daten serialisiert werden.
Die Open Data Schnittstelle im Einsatz
Die Partner können die Open Data Schnittstelle mit einem REST-fähigen Client anbinden und so ihre Daten synchronisieren.
Auf der Übersichtsseite welche unter https://www.zuerich.com/en/data zu finden ist, erscheinen Kategorien von Lokalitäten und Übernachtungsmöglichkeiten. Möchte man nun alle Gastrobetriebe von zuerich.com beziehen, kann man über einen Query-Parameter die Kategorie-ID mitgeben.
https://www.zuerich.com/en/data?id=74
Das Hotel Schweizerhof Zürich verwendet so ihre Daten für die Seite https://www.hotelschweizerhof.com/en/concierge-service/gastronomy.