{"id":279,"date":"2018-05-24T10:28:00","date_gmt":"2018-05-24T10:28:00","guid":{"rendered":"https:\/\/www.wpvs.de\/iot-2018\/?p=279"},"modified":"2021-05-14T10:07:06","modified_gmt":"2021-05-14T08:07:06","slug":"smartlock-3-entwurf-der-web-api-mit-express-js","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2018\/projekt-smart-lock\/smartlock-3-entwurf-der-web-api-mit-express-js\/","title":{"rendered":"SmartLock (3): Entwurf der Web-API mit Express.js"},"content":{"rendered":"<p>In den beiden vorherigen Blogbeitr\u00e4gen haben wir bereits etwas \u00fcber die Idee hinter \u201eSmart Lock\u201c geh\u00f6rt. Au\u00dferdem haben wir dort die verwendeten Hardwarekomponenten vorgestellt. In diesem Blogbeitrag soll es nun etwas Softwarelastiger werden.<\/p>\n<p>Die Softwareentwicklung besch\u00e4ftigt sich, grob umrissen, mit zwei Themenbereichen: Dem Frontend und dem Backend. Im Frontend werden komfortable Nutzeroberfl\u00e4chen entwickelt und bereitgestellt, in denen sich der Nutzer m\u00f6glichst leicht zurechtfinden soll. Die Gesch\u00e4ftslogik wird im Frontend sehr schlank gehalten, da Clients h\u00e4ufig nur \u00fcber begrenzt leistungsf\u00e4hige Hardware verf\u00fcgen. Die Gesch\u00e4ftslogik wird dann in das performantere Backend ausgelagert.<\/p>\n<p>Ein weiterer Vorteil dieser Architektur ist die strikte Trennung der implementierten Benutzeroberfl\u00e4che und der Gesch\u00e4ftslogik, wodurch die Wartbarkeit enorm erleichtert wird. In diesem Blog soll es prim\u00e4r um die Ausgestaltung des Backend gehen. In einem sp\u00e4tern Blogbeitrag wird dann auch das Frontend thematisiert.<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-280 aligncenter\" src=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/Node-und-Express-300x165.png\" alt=\"\" width=\"300\" height=\"165\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/Node-und-Express-300x165.png 300w, https:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/Node-und-Express.png 365w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<p style=\"text-align: center\">Abbildung 1: Logo von node.js und express.js<\/p>\n<p>Unser Backend basiert auf der Javascript Laufzeitumgebung Node.js. Mithilfe von Node.js kann Javascript auch f\u00fcr die Backendentwicklung eingesetzt werden. Des Weiteren bietet Node.js mit dem Packagemanager npm eine Vielzahl von Bibliotheken an, die bei der Softwareentwicklung unterst\u00fctzen k\u00f6nnen. Bei der Entwicklung von Web-APIs in Kombination mit node.js kommt h\u00e4ufig das Framework express.js zum Einsatz. Auch bei unserem Projekt baut auf node.js express.js auf. Mithilfe von express.js k\u00f6nnen sehr einfach Routen auf Grundlage des REST Prinzips erstellt werden. Weiterhin wird der Umgang mit HTTP-Anfragen und Antworten durch eine einfache Auswertung der URL-Parameter oder des Request-Bodies erm\u00f6glicht. Au\u00dferdem l\u00e4sst sich mit express.js besonders gut eine Middleware zwischen Client und Web-API realisieren.<\/p>\n<p>Tabelle 1: Einge Routen der Web-API<\/p>\n<table style=\"height: 941px\" width=\"1221\">\n<tbody>\n<tr>\n<td width=\"160\"><strong>Bezeichnung<\/strong><\/td>\n<td width=\"66\"><strong>HTTP-Verb<\/strong><\/td>\n<td width=\"113\"><strong>Route<\/strong><\/td>\n<td width=\"123\"><strong>Request<\/strong><\/td>\n<td width=\"151\"><strong>Response<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"160\">&nbsp;<\/p>\n<p><strong>Login des Admins<\/strong><\/p>\n<p><strong>\u00a0<\/strong><\/td>\n<td width=\"66\">POST<\/td>\n<td width=\"113\">\/v1\/login<\/td>\n<td width=\"123\">&nbsp;<\/p>\n<p>admin, password<\/p>\n<p>&nbsp;<\/td>\n<td width=\"151\">admin, loginStatus<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">&nbsp;<\/p>\n<p><strong>User Liste anfordern<\/strong><\/p>\n<p><strong>\u00a0<\/strong><\/td>\n<td width=\"66\">GET<\/td>\n<td width=\"113\">\/v1\/userList<\/td>\n<td width=\"123\">&#8211;<\/td>\n<td width=\"151\">Liefert alle User in einem Array zur\u00fcck.<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">&nbsp;<\/p>\n<p><strong>User anhand einer Id l\u00f6schen<\/strong><\/p>\n<p><strong>\u00a0<\/strong><\/td>\n<td width=\"66\">DELETE<\/td>\n<td width=\"113\">\/v1\/user\/userId<\/td>\n<td width=\"123\">&#8211;<\/td>\n<td width=\"151\">Liefert den gel\u00f6schten User zur\u00fcck.<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">&nbsp;<\/p>\n<p><strong>L\u00f6sche die Bilder eines Users in der KAIROS Galerie<\/strong><\/p>\n<p><strong>\u00a0<\/strong><\/td>\n<td width=\"66\">&nbsp;<\/p>\n<p>DELETE<\/p>\n<p>&nbsp;<\/td>\n<td width=\"113\">\/v1\/image\/userId<\/td>\n<td width=\"123\">&#8211;<\/td>\n<td width=\"151\">imageDeleted<\/td>\n<\/tr>\n<tr>\n<td width=\"160\">&nbsp;<\/p>\n<p><strong>F\u00fcge einen neuen User hinzu und lade ein Bild des Users (optional) in der KAIROS Bibliothek hoch<\/strong><\/p>\n<p><strong>\u00a0<\/strong><\/td>\n<td width=\"66\">POST<\/td>\n<td width=\"113\">\/v1\/addUser<\/td>\n<td width=\"123\">Daten des zu erstellenden Users.<\/td>\n<td width=\"151\">Bei Erfolg werden die Userdaten zur\u00fcckgeliefert. Ansonsten wird ein leeres Objekt versandt.<\/td>\n<\/tr>\n<tr>\n<td width=\"160\"><strong>Erhalte eine Liste mit allen Usern, die das Haus in einem definierten Zeitraum betreten haben <\/strong><\/td>\n<td width=\"66\">GET<\/td>\n<td width=\"113\">\/v1\/getAccessList\/from\/to<\/td>\n<td width=\"123\">&#8211;<\/td>\n<td width=\"151\">Alle User die das Haus im definierten Zeitraum betreten haben.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Unsere express.js Web-API besteht aktuell aus zw\u00f6lf unterschiedlichen Routen. Diese erwarten und versenden Daten im JSON Format. In diesem Blog werden nachfolgend sechs dieser Routen vorgestellt. Diese sind in Tabelle 1 zu erkennen. Alle Routen der API finden sich <a href=\"http:\/\/www.iot-embedded.de\/iot-2018\/wp-content\/uploads\/sites\/3\/2018\/05\/Doku-API.docx\">hier<\/a>. In unserer API ist der <strong>Admin <\/strong>eine Person, die sich in die Weboberfl\u00e4che anmelden kann. Zudem gibt es den <strong>User<\/strong>. Dieser repr\u00e4sentiert eine berechtige Person, die das Haus betreten darf.<\/p>\n<p>Die erste Funktionalit\u00e4t unserer Web-API sollte eigentlich nahezu jede Weboberfl\u00e4che bieten. Die M\u00f6glichkeit sich einzuloggen. \u00dcber die Route \/v1\/login ist der Login bei uns aufrufbar. Dabei muss der Client im Body des http-Requests den Login Namen und das korrekte Passwort versenden. Ist der Login erfolgreich, wird in der Antwort des Servers der Login Status auf true gesetzt.<\/p>\n<p>Die zweite Route, die in Tabelle 1 zu erkennen ist, erm\u00f6glicht es Listen der User anzufordern. Die Route ist unter \/v1\/userList aufrufbar und erwartet keine Request Parameter. Der zur\u00fcckgelieferte Array besteht aus einzelnen Userobjekten, in denen die Daten der User zu finden sind.<\/p>\n<p>\u00dcber den Pfad \/v1\/user\/userId ist die n\u00e4chste Route aufrufbar. Hierr\u00fcber kann ein User, mithilfe des gelieferten URL-Parameters userId, in der Datenbank gel\u00f6scht werden. Als Antwort kommuniziert der Server dann den gel\u00f6schten User an den Client.<\/p>\n<p>Eine weitere wichtige Schnittstellenfunktionalit\u00e4t ist das L\u00f6schen von Bildern in der KAIROS Galerie. In KAIROS sind s\u00e4mtliche Bilder der User in einer Galerie gespeichert. M\u00f6chte nun ein User seine gespeicherten Bilder in der KAIROS Galerie l\u00f6schen, ruft er die Route \/v1\/image\/userId auf und \u00fcbergibt seine userId als URL-Parameter. War das L\u00f6schen aller Bilder erfolgreich verschickt der Server eine entsprechende imageDeleted flag.<\/p>\n<p>K\u00f6nnen Bilder in der KAIROS Galerie gel\u00f6scht werden muss es auch einen Weg geben diese dort zu hinterlegen. Hierf\u00fcr dient die n\u00e4chste API-Funktionalit\u00e4t. Wird die Route \/v1\/addUser vom Client aufgerufen, kann dieser im HTTP-Body alle Daten des anzulegenden Users bereitstellen. Der Server legt den User dann in der Datenbank an. Wurde ein Bild beigef\u00fcgt, wird au\u00dferdem eine Aufforderung an die KAIROS API gesendet dieses in der Galerie hochzuladen.<\/p>\n<p>Die letzte API-Funktionalit\u00e4t, welche ich hier pr\u00e4sentieren m\u00f6chte, ist eine Option Log Daten der User abzufragen. Daf\u00fcr ruft der Client die Route \/v1\/getAccessList\/from\/to auf. Mithilfe von from und to muss entsprechend ein Zeitraum abgesteckt werden. Als Antwort erh\u00e4lt der Client vom Server alle User die in diesem Zeitraum das Haus betreten haben.<\/p>\n<p>Soviel erstmal zu unserer Web-API. \u00dcber Feedback und sonstige Anregungen w\u00fcrde ich mich freuen :). In unserem n\u00e4chsten Blogbeitrag wird sich <span class=\"atwho-inserted\">@alexanderfuchs<\/span> ein wenig mit dem Thema Backendsicherheit besch\u00e4ftigen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In den beiden vorherigen Blogbeitr\u00e4gen haben wir bereits etwas \u00fcber die Idee hinter \u201eSmart Lock\u201c geh\u00f6rt. Au\u00dferdem haben wir dort die verwendeten Hardwarekomponenten vorgestellt. In diesem Blogbeitrag soll es nun etwas Softwarelastiger werden. Die Softwareentwicklung besch\u00e4ftigt sich, grob umrissen, mit<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/279"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/comments?post=279"}],"version-history":[{"count":1,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/279\/revisions"}],"predecessor-version":[{"id":657,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/279\/revisions\/657"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/media?parent=279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/categories?post=279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/tags?post=279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}