API - application programming interface

Seit HTML5 steht eine ganze Reihe an API´s zur Verfügung, mit denen man einiges anstellen kann.

Wir haben viele Möglichkeiten, vom Abspielen von Video und Audiodateien im Browser bis hin zum Auslesen des Akkustandes oder der geografischen Lage des Endgerätes. Der tatsächliche Umfang im Umgang mit Web API´s ist einfach so groß, dass ich zurzeit nicht in der Lage bin, dieses Gebiet in Zahlen zu fassen. Die Tatsache, dass die Entwicklung immer weiter voranschreitet, was ja auch gut ist, macht es noch schwieriger, alles im Überblick zu behalten.


Kommunikation über JavaScript

Als Erstes betrachten wir die unidirektionale Kommunikation zwischen Client und Server.

Unidirektionale Kommunikation bedeutet, dass die Kommunikation zwischen Server und Client nur einseitig funktioniert. Egal ob wir eine klassische Webseite oder eine moderne Webanwendung haben, die Kommunikation funktioniert nur in eine Richtung. Also der Client stellt via http eine Anfrage an den Server und bekommt die entsprechende Antwort. Der Browser verarbeitet die Daten und die Seite ist fertig geladen. Wenn jetzt neue Daten auf dem Server bereit liegen, wird der Client nichts davon erfahren, solange er nicht eine neue Anfrage an den Server schickt.

Kommunikation zwischen Browser und Server

Selbstverständlich gibt es hier schon Lösungen in Form von "Ajax" (Asynchronous JavaScript and XML)-Anfragen und Ähnliches.


Web Socket API

Mit der Web Socket API ist es möglich, eine bidirektionale Kommunikation aufrecht zu erhalten, das bedeutet, dass der Client und der Server auf Ereignisse der Gegenseite reagieren. Während bei einer reinen HTTP-Verbindung jede Aktion des Servers eine vorhergehende Anfrage des Clients erfordert, reicht es beim "WebSocket-Protokoll", wenn der Client die Verbindung öffnet. Der Server kann dann diese offene Verbindung aktiv verwenden und neue Informationen an den Client ausliefern, ohne auf eine neue Verbindung des Clients zu warten.


Nutzer wiedererkennen

In einigen Anwendungen ist es sicherlich vom Vorteil, wenn man Daten vom User wieder abrufen kann. Eine schon lange bestehende Möglichkeit, um Daten auf Clientseite bis zum Abruf abzuspeichern, sind die sogenannten Cookies.

Cookies verwenden

Das Protokoll HTTP ist ein zustandsloses Protokoll, das bedeutet, dass jede Anfrage unabhängig von anderen Anfragen ist. Das bedeutet aber auch, dass ein Server nicht erkennt, ob dieser Nutzer bereits vorher eine Anfrage gestellt hat. Stellen wir uns vor, es ist Sonntag Abend man liegt auf der Couch, der Kühlschrank ist leer und der Magen inzwischen auch. Nun wollen wir uns ein paar Sachen bei Lieferdienst bestellen und nutzen die Internetseite vom Food-Handler unseres Vertrauens. Wir legen die erste Pizza in den Warenkorb und wollen noch bei den Snacks nachschauen, was es da gibt. Nun wissen wir bereits, damit bei einem Klick auf einen Button eine neue Anfrage an den Server gesendet wird. Wir wissen auch, dass unsere Anfragen über HTTP zustandslos sind, der Server also gar nicht weiß, ob wir bereits vorher eine Anfrage gestellt haben. Das würde ja auch bedeuten, dass unsere Pizza aus dem Warenkorb wieder verschwunden ist. Nun tatsächlich wäre das auch so, wenn wir die Daten nicht irgendwo speichern könnten. Genau hier kommen die Cookies ins Spiel. Über Cookies haben wir die Möglichkeit, kleine Datenmengen auf der Clientseite zu speichern und wieder abzurufen. Cookies sind sozusagen kleine Textdateien, die auf dem Rechner des Clients gespeichert werden, solange er es zulässt und keine entsprechenden Änderungen im Browser vorgenommen hat. Diese Informationen werden bei jeder Anfrage an den Server mit übergeben. Dadurch weiß der Server auch, dass wir bereits eine Pizza in den Warenkorb gelegt haben. Die Cookies bestehen aus folgenden Bestandteilen.


Name und Wert

Bei den Namen spielt die Groß- und Kleinschreibung keine Rolle und sie sind die einzigen Angaben, die zwangsweise erforderlich sind. Als Wert sind nur Zeichenketten erlaubt, keine Zahlen. Name und Wert sind Pflichtangaben.


Die Domäne des Servers und der Pfad auf dem Server

Ein Cookie wird nur an einen korrekten Pfad mitgeschickt (example.com/test).


Das Ablaufdatum

Das Ablaufdatum sorgt dafür, dass das Cookie nach Ablauf dieses Datums gelöscht wird. Wenn kein Datum angegeben wird, dann wird das Cookie am Ende der Browsersitzung gelöscht. Über das Sicherheitsflag kann optional bestimmt werden, ob ein Cookie nur bei HTTPS mitgesendet wird oder auch bei HTTP-Anfragen erlaubt ist.


Cookies anlegen

Cookies werden auf 2 Arten angelegt, entweder werden sie im Header einer http-Antwort vom Server an den Client geschickt, oder sie werden mit JavaScript erzeugt. Natürlich machen wir das mit JavaScript. Die Eigenschaft "cookie" des "document"-Objekts ist der Ausgangspunkt für die Verwaltung. Um ein Cookie zu erstellen, schreiben wir.

Cookie erstellen

document.cookie = 'username=User Name';

Damit haben wir das erste Cookie erstellt. Nicht gerade beeindruckend, aber ein voll gültiges Cookie. Um zu prüfen, ob unser Cookie auch wirklich erstellt wurde, lassen wir ihn uns auf der Konsole ausgeben.

Cookie erstellen

console.log(document.cookie);

Wer den Chrome-Browser verwendet, der muss die Zulassung für das Verwenden von lokalen Cookies einstellen, damit eine Ausgabe in der Konsole sichtbar ist. Die Rückgabe des Cookie in der Konsole ist unter der Verwendung anderer Browser hingegen problemlos.

Cookies erstellen und auslesen

Um den Cookie von unserer Pizzabestellung zu rekonstruieren, müssten wir so was schreiben.

Cookie erstellen

document.cookie = 'einkaufswagen=PizzaSalami,SchokoEis,Zitronenlimonade,; expires=Mon, 01 Jun  23:59:59 GMT; path=/';

Dieser Cookie hätte Gültigkeit bis zum 01.06. mit Angabe der Zeit und der Zeitzone. Einen Pfad wurde hier jetzt nicht angegeben, aber so müsste das Ganze aussehen. Für das Arbeiten mit Cookies gibt es einige Bibliotheken und nützliche Funktionen.


Den Browserspeicher nutzen

Es gibt 2 Arten von Browserspeicher

Der lokale Browserspeicher, er ist über mehrere Tabs und Fenster zugänglich. Der Sessionspeicher, er ist nur aus einem Browsertab zugänglich. Beide Speicherarten werden über das globale Objekt "window" aufgerufen und sind im Umgang mit ihren Methoden und Eigenschaften identisch. Der Unterschiede der beiden Speicher im Browser ist der Zugriff aus dem Fenster bzw. aus dem Tab.

Methode Bedeutung
length() Enthält die Anzahl der Elemente im Speicher (Storage)
clear() Entfernt alle Schlüsselwertpaare aus dem Speicher (Storage)
getItem(key) Liefert für einen Schlüssel den entsprechenden Wert aus dem Speicher (Storage)
key(index) Liefert den Namen des Schlüssels an Position Index aus dem Speicher(Storage)
removeItem(key) Entfernt das Schlüsselwertpaar für den übergebenen Schlüssel, wenn dieser vorhanden ist.
setItem(key,value) Fügt für den entsprechenden Schlüssel einen Wert in den Speicher, wenn dieser bereits vorhanden ist, wird der Wert überschrieben.

Beginnen wir mit dem Speichern von Werten im Browserspeicher Über die Methode "setItem()" erlangen wir Zugriff auf den Browserspeicher. Der erste Parameter ist ein Schlüssel, unter dem der Wert gespeichert wird und der zweiter Parameter ist der Wert, der gespeichert wird.

Schlüsselwertpaar erstellen

localStorage.setItem('Hauptstadt', 'Berlin');

Der Wert, der gespeichert wird, darf nur eine Zeichenkette sein. Wenn Objekte gespeichert werden sollen, dann müssen diese zuvor in einen String umgewandelt werden.


Um Werte aus dem Browserspeicher zu lesen, verwenden wir die Methode "getItem()".

Wert vom Schlüssel auslesen

localStorage.setItem('Hauptstadt', 'Berlin');
let wert = localStorage.getItem('Hauptstadt');
console.log(wert);

Wenn ein Wert im Browserspeicher überschrieben werden soll, dann können wir das mit der Methode "setitem()" angehen. Wenn ein Schlüssel noch nicht existiert, wird dieser erstellt und wenn der Wert bereits vergeben ist, dann wird der Wert überschrieben.

Wert vom Schlüssel überschreiben

localStorage.setItem('Hauptstadt', 'Rom');
let neuerWert = localStorage.getItem('Hauptstadt');
console.log(neuerWert);

Um einen Eintrag komplett zu löschen, verwenden wir die Methode "removeItem()". Der übergebene Parameter ist der Schlüssel vom Wert, welcher gelöscht werden soll.

Wert vom Schlüssel löschen

let geloescht = localStorage.removeItem('Hauptstadt');
console.log(geloescht);

Wenn alle Daten des Browserspeichers gelöscht werden sollen, dann kann auch die Methode "clear()" verwendet werden.

Browserspeicher vollständig löschen

let allesLoeschen = localStorage.clear();
console.log(allesLoeschen);

Mit dem Eventlistener können wir auf Änderungen im Speicher reagieren. Dabei wird jedes Mal, wenn ein Wert im Browserspeicher hinzugefügt, entfernt oder verändert wird, ein Event vom Typ StorageEvent ausgelöst.


Browserdatenbank nutzen

Die Indexed Database API implementiert eine Browserdatenbank.

Diese clientseitige Datenbank funktioniert in etwa wie eine serverseitige Datenbank. Das Erstellen auslesen Aktualisieren und Löschen wird auch als "CRUD" bezeichnet. CRUD steht für create, read, update und delete. In der Indexed DB werden JavaScript Objekte unter bestimmten Schlüsseln abgespeichert. Über die Eigenschaft "onsuccess" lässt sich ein Eventhandler definieren, der aufgerufen wird, wenn die Datenbank fertig geladen ist.

Browserdatenbank erstellen

let idb = window.indexedDB;
let erstellen = idb.open('ersteDatenbank', 1);
erstellen.onsuccess = function (event) {
 let db = event.target.result;
 console.log(db.name);
 console.log(db.version);
};

Die Variable "erstellen" öffnet die Datenbank mit dem Namen "ersteDatenbank" und optional zum Testen die Version "1". Das Erstellen einer Datenbank funktioniert wie das Beispiel von localStorage. Eine Datenbank, die aufgerufen wird und noch nicht existiert, wird genau in dem Moment erstellt, wo sie aufgerufen wird.

Im weiteren Verlauf könnten wir das Hinzufügen und Updaten von Objekten im Objektspeicher behandeln. Sowie das Auslesen und gegebenenfalls Löschen der Objekte aus dem Speicher.


Auf das Dateisystem zugreifen

Um auf das Dateisystem des Nutzers zugreifen zu können, verwenden wir die File API.

Das Interface File repräsentiert eine einzelne Datei und beinhaltet Informationen wie das letzte Änderungsdatum oder den Namen der Datei. Das Interface FileList hingegen repräsentiert eine Liste von einzelnen Dateien oder File Objekten. Im Umgang mit binären Dateien verwenden wir das Interface Blob. Um Dateien vom Typ File oder Blob zu lesen, verwenden wir Methoden vom Interface FileReader. Um Dateien auswählen zu können, verwenden wir entweder einen Dialog, in dem der Nutzer die Dateien auswählt oder wir stellen auf unserer Webseite einen Bereich zur Verfügung, in dem der Nutzer via Drag an Drop Dateien zur Verfügung stellten kann.


Auswahl der Dateien per Dateidialog

Um den Nutzer zu schützen, können wir mit JavaScript nicht einfach auf alle Dateien zugreifen, sondern nur auf die Dateien, die der Nutzer selber auswählt. Eine Möglichkeit, um den Nutzer Dateien zur Verarbeitung auswählen zu lassen, ist das <input> Element mit dem Attribut file.

Input-Element zum Dateiupload

<input type="file" id="dateien" name="dateien[]" type="file" multiple/>
<li id="list"></li>

Wenn der Nutzer seine Dateien ausgewählt hat, wird im Hintergrund das "change-Event" ausgelöst. Das bedeutet, dass wir auf eine Dateiauswahl mit einem Eventhandler reagieren können.

Dateiinformationen ausgeben

function dateiAuswahl(event) {
 let dateien = event.target.files;
 let ausgabe = '';
 for (let i = 0; i<dateien.length; i++) {
  let datei = dateien[i];
  ausgabe += '<li>' + '<strong>' + datei.name + '</strong>' + ' (' + (datei.type || "n/a") + ') - ' + datei.size + 'Bytes' + ' geändert am: ' + datei.lastModifiedDate.toLocaleDateString() + '</li>';
 }
 document.getElementById('list').innerHTML = '<ul>' + ausgabe + '</ul>';
} 
document.getElementById('dateien').addEventListener('change', dateiAuswahl, false);

Nun können wir mehrere Dateien Selektieren und uns auf dem Monitor die einzelnen Informationen dazu ausgeben lassen. "datei.name" enthält dabei den Dateinamen, "datei.type" liefert Informationen zum Dateityp, "datei.size", hat Informationen zur Dateigröße in Bytes und über "datei.lastModifiedDate.toLocaleString()" wird uns das Datum der letzten Änderung in lokaler Formatierung angezeigt.


Weiteres

Auch das auswählen von Dateien, die per Drag and Drop markiert werden sollen, ist in JavaScript relativ einfach umzusetzen. Nachdem wir Dateien auswählen konnten, werden wir auch deren Inhalt lesen. Bei dem Laden großer Dateien ist es hilfreich eine Fortschrittsanzeige zur Verfügung zu stellen.


Den Standort von Nutzern ermitteln

Über die Geolocation API können wir den Standort des Nutzers ausfindig machen.

Die Geocolation API gehört zu dem navigator Objekt. Über die Methode "getCurrentPosition()" können wir die Position ermitteln. Dieser Methode übergibt man eine Funktion als Callback-Handler, sobald die Position ermittelt wurde, wird diese Funktion aufgerufen. Innerhalb der Funktion können wir auf Längengrad, Breitengrad oder sogar Geschwindigkeit und Richtung zugreifen.

Standortinformationen

function positionErmitteln() {
 if(navigator.geolocation) {
  navigator.geolocation.getCurrentPosition((position) => {
   console.log(position.coords.latitude);
   console.log(position.coords.longitude);
   console.log(position.coords.altitude);
   console.log(position.coords.accuracy);
   console.log(position.coords.altitudeAccuracy);
   console.log(position.coords.heading);
   console.log(position.coords.speed);
  });
 };
};
positionErmitteln();

Das sind abfragen zu Breitengrad, Längengrad, Höhenlage, Genauigkeit, Genauigkeit der Höhenlage, Richtung und Geschwindigkeit. Wer am Desktop PC die geolocation ausprobiert, erhält bei den Werten, die die Richtung und Geschwindigkeit sowie die Höhenlage beschreiben, mit hoher Wahrscheinlichkeit null. Bei der Verwendung von der Geolocation API wird der Nutzer immer gefragt, ob er zustimmt. Nur bei Zustimmung kann die API verwendet werden.


Kontinuierlich auf Standort Informationen zugreifen

Wenn eine einmalige Standortabfrage nicht reicht, sondern diese Abfrage kontinuierlich stattfinden soll, dann verwenden wir die Methode "watchPosition()".

Standortinformationen

navigator.geolocation.watchPosition((position) => {

Die Funktionsweise ist wie bei "getCurrentPosition()" nur das hier bei Veränderung auf Standortdaten reagiert werden kann.


Position auf Karte anzeigen

Wenn wir unsere Standortdaten mit der Google Maps API kombinieren, dann können wir uns den Standort auf einer Karte anzeigen lassen. Mit dieser Vorlage sind wir sogar in der Lage, eine Route zwischen 2 Orte zu planen.


Den Batteriestand eines Endgeräts auslesen

Über die Battery Status API können wir Informationen der Batterie bzw. des Akkus vom Endgerät abfragen und entsprechend darauf reagieren.

Die API definiert dazu das Interface Batterymanger über der wir Informationen des Akkus einholen können. Das Batterymanger Interface stellt 4 Eigenschaften bereit.

Eigenschaft Bedeutung
charging Gibt an ob geladen wird oder nicht.
chargingTime Zeit bis Batterie vollständig geladen ist.
dischargingTime Zeit bis Batterie vollständig entladen ist.
level Batteriestand als Fließkommazahl 0-1 leer bis voll.

Auf Ereignisse reagieren

Dem Batteriemanager können über die Methode "addEventlistener()" noch 4 weitere Events zugewiesen werden.

Event Bedeutung
chargingchange Löst aus wenn der Ladestatus geändert wird.
levelchange Löst bei Änderung des Batteriestands aus.
chargingtimechange Löst aus wenn sich Ladezeit ändert.
dischargingtimechange Löst aus wenn sich Entladezeit ändert.

Sprache ausgeben und Sprache erkennen

Die Ausgabe von Sprache aus einer Textdatei wird über das Interface SpeechSynthesis erzeugt.

Das umgekehrte Verfahren also das Erstellen von Text aus einer Sprachaufnahme übernimmt das Interface SpeechRecognitation. Beide Interfaces stammen von der Web Speech API. Diese API wird nicht von allen Browsern unterstützt und gilt auch nicht als Standard in der Webentwicklung, zumindest zurzeit nicht. Um die Verfügbarkeit zu prüfen und entsprechend darauf regieren zu können, schreiben wir einfach:

Sprach-api

if(window.speecheSynthesis) {
 console.log('wird unterstützt!');
} else {
 console.log('wird nicht unterstützt!');
}

Animationen erstellen

Mit der Web Animation API können wir auf einer Webseite Animationen definieren.

Diese API wird aber nicht von allen Browsern verwendet. Ob eine Verwendung möglich ist, kann auch auf der Seite https://caniuse.com/ überprüft werden. Über die Methode "animate()" lassen sich einzelne Animationen erstellen.

Interface Beschreibung
Animation Repräsentiert eine Animation.
Animatable Repräsentiert ein Animierbares Element.
AnimationTimeLine Zusammenfassung der Animation auf einer Zeitachse.
AnimationEffectTiming Repräsentiert die Effekte einer Animation (2ter Parameter).
DocumentTimeLine Fasst die Animationen einer Zeitachse zusammen.
KeyframeEffect Repräsentiert die Effekte des einzelnen Keyframes.

Des Weiteren können wir die Erstellung und den Ablauf einer Animation behandeln.


Mehrsprachige Anwendungen entwickeln

Sobald eine Webanwendung "Mehrsprachig" sein soll, ist eine Internationalisierung unumgänglich. Dabei werden Zeit und Währungsdarstellungen an den jeweiligen Gegebenheiten des Nutzers angepasst.


Weiteres

Ein kleiner Überblick über nützliche API´s

API Beschreibung
Ambient Light API Sensorschnittstelle für das erfassen des Umgebungslichtes
Device Orientation API Auslesen der Orientierungsoptionen von Endgeräten
Notifications API Ermöglicht das zusenden von Hinweismeldungen
Vibration API Schnittstelle zu der Vibrationsfunktion von Endgeräten
Web Worker API Ermöglicht eine parallele ausführung von JavaScript-Code

Überhaupt werden es immer mehr API´s die auch mit anderen Diensten wie Facebook, Twitter, YouTube usw. in Verbindung treten können oder eine Kommunikation über Bluetooth ermöglichen. Es scheint eine unmögliche Aufgabe zu sein, einen Gesamtüberblick der API´s zu haben.


Weiter mit Schlüsselwörter (Keywords)