Teil 2: Das API auf Herz und Nieren geprüft

Shopware 6 und der neue API-First-Ansatz
Keine Kommentare

Im ersten Teil der Artikelserie zu Shopware 6 haben wir uns mit den technischen Änderungen der neuen Version beschäftigt. Wir wollen nun im zweiten Teil tiefer in das Thema API einsteigen und uns die verschiedenen Anwendungsfälle einmal genauer anschauen.

Mit Shopware 6 wurde die Software auf eine vollständig neue Basis gestellt und konsequent ein API-First-Ansatz verfolgt. Das hat im Vergleich zu der Vorgängerversion den Vorteil, dass alle Funktionalitäten der neuen Administration auch über das API gesteuert werden können. Durch das strikte verfolgen des API-First-Ansatzes sind drei verschiedene API-Endpunkte, Sync, SalesChannel und Admin, entstanden. Der Sync-Endpunkt ist für den Im- und Export großer Datenmengen vorgesehen, wobei aktuell 300 Produkte pro Sekunde importiert werden können. Langwierige Prozesse, wie zum Beispiel die Erstellung von Thumbnails, werden über eine Messaging Queue im Hintergrund abgearbeitet.

Artikelserie

  • Teil 1: Grundlegende Veränderungen im Onlineshopsystem
  • Teil 2: Das API auf Herz und Nieren geprüft
  • Teil 3: Das Plugin-System und eigene Erweiterungen

Eine asynchrone Verarbeitung der langwierigen Prozesse beschleunigt den Importprozess natürlich deutlich. Damit erreichen wir, verglichen mit Shopware 5, eine zwanzigfache Steigerung. Das Admin API wird konsequent von der neuen Administration, die auf Vue.js basiert, verwendet. Man kann nun alle Einstellungen und Funktionen, die die Administration bietet, auch über die API nutzen. Das ermöglicht es, eigene Oberflächen für administrative Tätigkeiten zu erstellen, wie z. B. eine Ansicht für offene Bestellungen, die versandt werden müssen. Welche Technologie dafür schlussendlich genutzt wird, ist völlig egal. Zu guter Letzt gibt es noch das SalesChannel API. Dieser Endpunkt ist für alle Anforderungen zuständig, um ein eigenes Shop-Frontend, POS oder beliebige andere Verkaufskanäle anzuschließen. Das ermöglicht es, vollständig neue Verkaufskonzepte im Internet umzusetzen. Wir haben verschiedene Experimente auf GitHub veröffentlicht, um zu zeigen, wie einfach es ist, das neue API zu verwenden. Insgesamt gibt es einen One-Page-Shop, ein Shop-Snippet und einen Alexa Skill. Der One-Page-Shop ist ein Experiment, das zeigt, wie einfach man eine eigene Storefront für Shopware 6 bauen kann. Auf einer einzigen Seite beinhaltet es einen funktionierenden Check-out inklusive Zahlungsabwicklung.

Das Shop-Snippet ist für Shopbetreiber interessant, die viel bloggen, mit Influencern. zusammenarbeiten usw. Es ermöglicht z. B., in einem Blogbeitrag mit einem einfachen Snippet Produkte aus einem Shopware-6-Shop einzubinden. Natürlich mit einer Verknüpfung zum Shop, um dort direkt kaufen zu können. Das dritte Experiment, der Alexa Skill, verbindet den Shopware-6-Shop mit Amazons Alexa. Nach der Aktivierung kann man über Alexa-Sprachbefehle nach Produkten suchen, diese bestellen und die Produktbeschreibungen vorlesen lassen. Des Weiteren können der Status einer Bestellung verfolgt und neue Produkte vorgeschlagen werden. Diese Experimenten sind ein guter Einstieg, um das SalesChannel API anzuwenden und zu verstehen.

International PHP Conference

PHP in 2020: Fully Loaded

by Arne Blankerts (thePHP.cc)

PSR-14: A Major PHP Event

by Larry Garfield (Platform.sh)

Leaving a Legacy

by Ewout Pieter den Ouden (PHPUnit, open source contributor)

JavaScript Days 2020

Wie ich eine React-Web-App baue

mit Elmar Burke (Blendle) und Hans-Christian Otto (Suora)

Architektur mit JavaScript

mit Golo Roden (the native web)

Nun möchten wir unseren Blick auf das Admin API richten. In den nächsten Abschnitten werden wir eine Demoumgebung aufsetzen, eine Kategorie erstellen, aktualisieren, löschen und schauen, wie man nach spezifischen Kategorien suchen kann.

Demoumgebung aufsetzen

Wir verwenden die Docker-Umgebung, die auf einem Linux-Client ausgeführt wird. Zuerst klonen wir mit git clone git@github.com:shopware/development.git das Entwicklungstemplate von GitHub. Jetzt haben wir die Entwicklungsvorlage für Shopware 6 im Verzeichnis development. Anschließend gehen wir mit cd development in das Verzeichnis und klonen noch mit git clone git@github.com:shopware/platform.git das eigentliche Shopware Platform Repository in das Standardverzeichnis. Achtung: Bitte kein anderes Verzeichnis beim Klonen angeben, da das wichtig für das Autoloading ist. Damit haben wir jeglichen Quellcode, den wir zum Starten auf unserem Rechner benötigen. Um nun die notwendigen Docker-Container zu bauen und zu starten, geben wir ./psh.phar docker:start ein. Anschließend verbinden wir uns via ./psh.phar docker:ssh mit dem Application-Container und starten mit ./psh.phar install die Installation.

Das kann beim ersten Mal einige Zeit in Anspruch nehmen, da bei der initialen Ausführung einige Caches erstellt werden müssen. Um zu prüfen, ob die Installation erfolgreich war, könnt ihr einfach Euren Lieblingsbrowser öffnen und auf http://localhost:8000 zugreifen. Wenn ihr z. B. Mac-Anwender seid, könnt ihr das Ganze auch lokal aufsetzen. Eine beispielhafte Virtual-Host-Konfiguration könnt ihr im Installation Guide unter „Setting up your webserver“ finden. Anschließend müsst ihr nur bin/setup ausführen und werdet dann durch einen interaktiven Installationsprozess geführt. Wenn etwas während der Installation nicht funktioniert hat, prüft, ob es die Datei .psh.yaml.override gibt. Wenn nicht, startet das Set-up-Skript mit ./psh.phar install erneut.

Admin API verwenden

In den folgenden Beispielen verwende ich Guzzle 6. Ansonsten habe ich keine Libraries im Einsatz. Die benötigte Client-Id und das Client-Secret könnt ihr in der Administration unter Settings | System | Integrations mit einem Klick auf Add Intetration selbst erstellen. Wir können uns nun mit der Client-Id und dem Client-Secret einen Bearer-Token generieren, den wir für die weiteren API Requests benötigen werden (Listing 1). Bis auf die OAuth-Route sind alle anderen versioniert, um Abwärtskompatibilität bei zukünftigen Änderungen des API zu gewährleisten. Das kann man an dem v1 im Routennamen erkennen. Im Moment existiert nur die Version 1. Nun haben wir in $token alle notwendigen Informationen, um uns für die nächsten Requests autorisieren zu können. Wenn wir uns alle vorhandenen Kategorien ausgeben lassen wollen, können wir das wie in Listing 2 tun. Weitere Beispiele, wie man bei dieser Abfrage Filter, Suchen, Sortieren oder Limits definieren kann, findet ihr in der Onlinedokumentation zu Shopware 6.

$client = new GuzzleHttp\Client([
          'base_uri' => 'http://localhost:8000',
          'timeout' => 2.0,
          'headers' => ['Content-Type' => 'application/json'],
]);

$token = $client->post(
  '/api/oauth/token',
  [
    'body' => json_encode([
              'client_id' => $clientId,
              'client_secret' => $clientSecret,
              'grant_type' => 'client_credentials',
    ]),
  ]
);
$categories = $client->get(
  '/api/v1/category/',
  [
    'headers' => [
      'Authorization' => $token['token_type'] . ' ' . $token['access_token'],
      'Accept' => 'application/json',
    ],
  ]);

Aber wie legen wir nun eine neue Kategorie an? Im Endeffekt ist vieles identisch mit dem Request, in dem wir alle vorhandenen Kategorien abrufen. Die Header sind identisch und der angesprochene Endpunkt wird nur um ?_response=true erweitert, um vom API eine Rückgabe inklusive des generierten Unique Identifiers zu erhalten. Des Weiteren wird anstatt eines GET-Request ein POST-Request abgesetzt. Um eine Kategorie mit dem Namen new Category zu erstellen, benötigen wir das folgende Quellcodesnippet aus Listing 3. Wir werten die Rückgabe der API aus, um den Unique Identifier der Kategorie für weitere Requests zu speichern. Um die nun frisch erstellte Kategorie zu verändern, müssen wir an dem vorherigen Snippet nicht viel ändern. Wir ersetzen ?_response=true durch den Unique Identifier der Kategorie und ändern den Namen in new Category updated. Das Ganze wird dann als PATCH-Request verschickt. Das nun verwendete Snippet findet ihr in Listing 4.

$result = $client->post(
  '/api/v1/category?_response=true',
  [
    'headers' => [...],
    'body' => json_encode(['name' => 'new Category']),
  ]
);
$result = json_decode((string) $result->getBody(), true);
$categoryIdentifier = $result['data']['_uniqueIdentifier'];
$client->patch(
  '/api/v1/category/' . $categoryIdentifier,
  [
    'headers' => [...],
    'body' => json_encode(['name' => 'new Category updated']),
  ]
);

Zu guter Letzt möchten wir natürlich die neu erstellte Kategorie wieder aus dem System löschen. Den entsprechenden Quellcodeschnipsel könnt ihr im Listing 5 finden.

$client->delete(
  '/api/v1/category/' . $categoryIdentifier,
  [
    'headers' => [...],
  ]
);

Fazit

Mit der neuen API-Struktur bietet Shopware Shopbetreibern, Entwicklern und Agenturen vielfache neue Möglichkeiten, sich im E-Commerce zu präsentieren. Es war noch nie so einfach, Drittanbietersysteme an Shopware anzubinden, geschweige denn selbst eigene Storefronts zu bauen, um eine noch größere kundenspezifische Ansprache zu ermöglichen. Trotz all der neuen Funktionen geht dies nicht zu lasten der Performance. Die aktuellen Benchmarks für die API sind schon sehr vielversprechend und ermöglichen ERP-Integrationen neue Synchronisation-Konzepte zu verwirklichen.

PHP Magazin

Entwickler MagazinDieser Artikel ist im PHP Magazin erschienen. Das PHP Magazin deckt ein breites Spektrum an Themen ab, die für die erfolgreiche Webentwicklung unerlässlich sind.

Natürlich können Sie das PHP Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Kiosk ist das PHP Magazin weiterhin im Print-Abonnement erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -