Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Auch in der .NET-Welt werden immer mehr Web- und Cross-Plattformanwendungen mit HTML, CSS, JavaScript/TypeScript und SPA-Frameworks clientseitig programmiert, während auf dem Server ASP.NET oder ASP.NET Core zum Einsatz kommt. Das erfahrene IT-Visions.de-Expertenteam um Dr. Holger Schwichtenberg zeigt, wie Sie mit diesem Technikmix moderne Single-Page-Webanwendungen und mobile Cross-Platform-Apps realisieren. Es liefert Praxiswissen für Entwickler, die bislang Windows-Desktop-Anwendungen entwickelt haben oder nur mit älteren ASP.NET-Konzepten (Webforms) vertraut sind. Das Buch deckt ein umfassendes Themenspektrum ab: Web-Basiswissen: HTML und CSS, das Framework Bootstrap, das von CSS abstrahiert und von Microsoft in den Projektvorlagen für ASP.NET und ASP.NET Core eingesetzt wird. Webserverprogrammierung mit ASP.NET: das klassische Framework ASP.NET Model-View-Controller (MVC) und das klassische Web API ASP.NET sowie ASP.NET SignalR, die auf dem .NET Framework 4.x und nur auf Windows-Systemen laufen. Webserverprogrammierung mit ASP.NET Core: das neue ASP.NET Core inklusive WebAPI und SignalR Core, das auf dem Windows-basierten .NET "Full" Framework 4.x oder dem plattformneutralen .NET Core läuft. Inklusive einer Fallstudie zu Microservices mit ASP.NET Core Web API und RabbitMQ. Web-Client-Programmierung: Einführungen in die Programmiersprachen JavaScript und TypeScript und die Single-Page-Web-Frameworks Angular und React sowie ASP.NET Blazor, das auf C# aufbauende SPA-Framework. Hosting von ASP.NET und ASP.NET Core: Self-Hosting sowie Hosting in den Internet Information Services (IIS), in Docker-Containern und über den Microsoft-Cloud-Dienst Azure. Das Fallbeispiel MiracleList: komplettes Fallbeispiel einer modernen Webanwendung, bestehend aus einem Backend (C# mit ASP.NET Core), einem Web-Frontend (TypeScript mit Angular) sowie Cross-Platform-Apps für Linux, macOS, Windows, Android und iOS (mithilfe von Electron und Cordova aus dem Web-Frontend erzeugt). Bonuskapitel: Sie erhalten zusätzlich drei Kapitel zu React, Open Web Interface for .NET (OWIN) / Katana und ASP.NET Sicherheit als kostenloses PDF zum Herunterladen.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 1051
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+:
www.oreilly.plus
3., aktualisierte Auflage
Server-Anwendungen, Web APIs, SPAs & HTML-Cross-Platform-Anwendungen mit ASP.NET, ASP.NET Core, JavaScript, TypeScript & Angular
mit Beiträgen von Dr. Holger Schwichtenberg, Jörg Krause, Dr. Joachim Fuchs, Sebastian Kleinschmager und Manfred Steyer
Holger Schwichtenberg und Jörg Krause
Lektorat: Ariane Hesse
Korrektorat: Claudia Lötschert, www.richtiger-text.de
Satz: Gerhard Alfes, mediaService, Siegen, www.mediaservice.tv
Herstellung: Stefanie Weidner
Umschlaggestaltung: Michael Oréal, www.oreal.de
Bibliografische Information Der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-96009-015-1
PDF 978-3-96010-258-8
ePub 978-3-96010-259-5
mobi 978-3-96010-260-1
Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.
3., aktualisierte Auflage 2018
Copyright © 2018 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.
Vorwort zur 3. Auflage
Warum dieses Buch?
Was ist der Inhalt dieses Buchs?
Welche Voraussetzungen sollten Sie für dieses Buch mitbringen?
Was ist das Ziel des Buchs?
Welche Versionen werden in diesem Buch behandelt?
Welche Programmiersprache wird in diesem Buch verwendet?
Welche Werkzeuge werden in diesem Buch verwendet?
Welche Sprachversion wird in diesem Buch verwendet?
Woher bekommen Sie die Code-Beispiele und die drei Bonuskapitel zu diesem Buch?
Wem ist zu danken?
Die Autoren
Teil AWeb-Basiswissen
1Protokolle, Standards und Konzepte
Standardisierung
RFCs
World Wide Web Consortium (W3C)
European Computer Manufacturers Association (ECMA)
Hypertext Transfer Protocol (HTTP)
Protokollaufbau, Header, Body
Kommandoaufbau
Die HTTP-Statuscodes
Ablauf einer HTTP-Kommunikation
Kopffelder
HTTP 2.0
Ergänzende Standards zu HTTP
Web-Sockets
WebDAV
Simple Mail Transfer Protocol (SMTP) oder Extended SMTP (ESMTP)
File Transfer Protocol (FTP)
REpresentational State Transfer (REST)
Webdienste
Merkmale
REST-Beispiel
URI
HTTP-Methoden für REST
Multipurpose Internet Mail Extensions (MIME)
JavaScript Object Notation (JSON)
Atom Syndication Format (ATOM)
Grenzen von REST: GraphQL und OData
Single Page Application (SPA)
Asynchronous JavaScript and XML (AJAX)
Responsive Web Design (RWD)
2Hypertext Markup Language (HTML)
Grundlagen HTML
Geschichte
XML – Grundlage für HTML
Markup
XML-Dokumente
Verarbeitung
Der Begriff »Markup«
Seitenaufbau
Document Object Model (DOM)
Der Dokumenttyp (Doctype)
Codierungen
HTML5-Seitenstruktur
Elemente der Seite
Textelemente
Fließtextauszeichnung
Verweise
Tabellen
Multimedia und Grafiken
Formulare
Skripte
Interaktive Elemente
Allgemeine und universelle Attribute
id
class
accesskey
contenteditable
contextmenu
dir
draggable
dropzone
hidden
lang
spellcheck
style
tabindex
title
3Cascading Style Sheets (CSS)
Grundlagen
Syntax
Selektor
Elemente (Tags)
ID
Klassen
Attribute
Logische Auswahl
Weitere Selektoren
Das Box-Modell
Bausteine der Box
Zählweise
Ausnahmen
Das Box-Modell in CSS3
Das Flexbox-Modell
Prinzipien
Eigenschaft der Container
Beachtung von Medien
Syntax
Parameter
Der Viewport
Viewport einstellen
Parameter für den Viewport
Einheiten
Absolute Einheiten
Relative Einheiten
4Bootstrap
Einführung in Bootstrap
Neuerungen in Bootstrap 4
Installation
Struktur der CSS-Dateien
Seitenaufbau
Browserunterstützung
ARIA
Optimierung
Hilfsklassen
Reboot
Struktur der Seite
Einführung
Das Rastersystem
Das Flex-Raster
Typografie
Überschriften
Text und Textelemente
Listen
Tabellen
Hilfsklassen
Formulare
Struktur eines Formulars
Eingabeelemente
Schaltflächen
Weitere Bausteine
Symbole
Responsive Bilder
Eingebettete Quellen
Farben und Hintergründe
Ausrichtung von Elementen im Fluss
Inhalte anzeigen und verstecken
Komponenten
Klappmenüs (dropdown)
Werkzeugleisten (toolbar)
Schaltfläche mit Menü (button group)
Navigation (nav, navbar)
Pfadnavigation (breadcrumb)
Seitenweises Blättern (pagination)
Kennzeichnungen (tag)
Großbildleinwand (jumbotron)
Seitenüberschriften (page header)
Meldungen (alert)
Fortschrittsbalken (progress)
Medien (media)
Allgemeine Listen (list group)
Karten (cards)
Aktive Komponenten
Einrichtung und Aktivierung
Die Programmierschnittstelle
Übergänge (transition)
Modale Dialoge (modals)
Klappmenü (dropdown)
Scrollbar-Überwachung (scrollspy)
Angeheftete Navigation (affix)
Umschaltbare Tabulatoren (tab)
Tooltips (tooltip)
Inhaltsüberlagerung (popover)
Meldungen (alert)
Interaktive Schaltflächen (button)
Inhaltseinblendung (collapse)
Bilderkreisel (carousel)
Teil BWebserverprogrammierung mit ASP.NET
5ASP.NET MVC
Geschichte und Verbreitung von ASP.NET
Architektur von ASP.NET MVC
Erste Schritte mit ASP.NET MVC
ASP.NET-MVC-Projekt anlegen
Projektaufbau
Nuget-Pakete
Controller anlegen
View anlegen
Webanwendung testen
Einträge editieren
Vorschlagswerte über Drop-down-Listenfelder anbieten
Controller
Models entgegennehmen
View auswählen
Auf Ausnahmen reagieren
URL-Mapping beeinflussen (Routing)
Asynchrone Controller
Vereinfachte Implementierung asynchroner Controller seit .NET 4.5
Views
Razor
Razor-Helper
Layoutseiten
Partielle Views
Vorlagen für Felder und Models
Views für mobile Anwendungen
Zwischen unterschiedlichen Ansichten wechseln
Minification und Bundling
Models
Metadaten im Model festlegen
HTML-Text übermitteln
Validieren von Benutzereingaben
Globalisierung
Sprach- und Ländereinstellungen festlegen
Über Ressourcedateien mehrsprachige Inhalte bereitstellen
Codierung festlegen
Areas
Filter
Überblick
Umsetzung
Filter auf Controller und Action-Methoden anwenden
Globale Filter
Authentifizierungsfilter
6ASP.NET Web API
Einen einfachen HTTP-Service erstellen
Parameter und Rückgabewerte
HTTP-Services konfigurieren
HTTP-Services mit Fiddler testen
Mehr Kontrolle über HTTP-Nachrichten
Antworten mit HttpResponseMessage beeinflussen
Anfragen als HttpRequestMessage darstellen
HttpRequestMessage und HttpResponseMessage am Beispiel Conditional Get
Antworten über IHttpActionResult zurückgeben
HTTP-Services über HttpClient konsumieren
Routing
Benutzerdefinierte Routen über die Konfiguration festlegen
Attributbasiertes Routing
Weiterführende Schritte mit der Web API
Dynamische Parameter
Tracing
Request Batching
Cross Origin Resource Sharing (CORS)
Validieren
Querschnittsfunktionen implementieren
Message-Handler
Filter
Filterüberschreibungen
Benutzerdefinierte Formate unterstützen
Formatter implementieren
Formatter mit HttpClient verwenden
Serialisierung beeinflussen
JSON-Serializer konfigurieren
XML-Serializer konfigurieren
Eigenschaften von der Serialisierung ausschließen
Zirkuläre Referenzen serialisieren
Binary JSON (BSON)
Web API und HTML-Formulare
Einfache Formularfelder übermitteln
Datei-Upload via HTML-Formular
Fortschritt ermitteln
Feingranulare Konfiguration
Controllerbasierte Konfiguration
Routenbasierte Konfiguration
7ASP.NET SignalR
Long-Polling
Web-Sockets
Überblick über ASP.NET SignalR
PersistentConnection
Erste Schritte mit SignalR und PersistentConnection
Lifecycle-Methoden
URL-Mapping für persistente Verbindungen
Einfacher Client für eine persistente Verbindung
Einfacher JavaScript-Client für eine persistente Verbindung
Hubs
Methoden und Callbacks mit SignalR und Hubs
URL-Mapping für Hubs
Lifecycle-Methoden
Hubs konsumieren
Hubs über JavaScript konsumieren
Gruppen
Pipeline-Module für Querschnittsfunktionen
SignalR konfigurieren
Cross Origin Resource Sharing (CORS)
SignalR skalieren
Überlegungen zum Skalieren von SignalR
SignalR mit SQL Server skalieren
Implementierung eines SignalR-Clients
Das Skalierungsszenario testen
Azure Service Bus und Redis als Alternative zu SQL Server
8ASP.NET-Programmierschnittstellen
Direkt mit HTTP interagieren
HttpContext
Server (HttpServerUtility)
Request (HttpRequest)
Response (HttpResponse)
Zustandsverwaltung auf Sitzungsebene
Überblick
Weitere Optionen
Programmieren mit dem Sitzungszustand
URL-basierte Sitzungsverwaltung ohne Cookies
Konfiguration des Sitzungszustands
Speicherort der Sitzungstabelle wählen
Komprimierung des Sitzungszustands
Deaktivieren des Sitzungszustands
Caching
Überblick
Pro und Contra der Zwischenspeicherung
Zwischenspeicherung ganzer Seiten (Output-Caching)
Caching von Seitenteilen (Fragmentzwischenspeicherung)
Programmatisches Caching
Cacheinvalidierung
Teil CWebserverprogrammierung mit ASP.NET Core
9Einführung in ASP.NET Core
Klassisches ASP.NET oder ASP.NET Core?
Einführung in die Core-Welt
.NET Standard
Windows Compatibility Pack für .NET Core
Open Source
Dokumentation
Werkzeuge
Kommandozeilenwerkzeug dotnet
Editoren
Erste Schritte mit ASP.NET Core (auf .NET Core)
Installation
Projekt anlegen
Projektaufbau
Die Klasse Program
Klasse Startup und Middleware
Referenzen/Pakete
Übersetzen und Debugging
Deployment
ASP.NET Core auf dem klassischen .NET Framework
Einsatzszenarien
Anlegen von ASP.NET-Core-Projekten mit dem klassischen .NET Framework
Projektaufbau
Referenzen/Pakete
Deployment
In ASP.NET Core integrierte Webserver: Kestrel versus HTTP.sys (WebListener)
Kestrel
HTTP.sys
10ASP.NET Core MVC und Razor Pages
POCO-Controller
Controller und View
Tag Helper
Wie funktionieren Tag Helper?
Eingebaute Tag Helper
Eigene Tag Helper
Beispiel: Tag <autor>
Beispiel: Tag <row>
Beispiel: Tag <condition>
Beispiel: Tag <repeater>
View Components
Razor Pages
Von Webforms über MVC zu Razor Pages
Razor Pages versus MVC
Page Model als Code-Behind
URL-Parameter
Eingebaute Objekte
Datenbindung
Praxisbeispiel zu Razor Pages
Drittanbieterkomponenten für ASP.NET Core
11ASP.NET-Core-Klassenbibliotheken
Dependency Injection in ASP.NET Core
Implementierung eines Diensts
Registrierung von Diensten
Injektion in einen Konstruktor
Manuelle Beschaffung
Injektion in eine View
Vordefinierte Dienste der ASP.NET-Core-Infrastruktur
Konfiguration in ASP.NET Core
Sitzungen in ASP.NET Core
Cookies
URL-Rewriting in ASP.NET Core
Benutzerverwaltung und Authentifizierung
12ASP.NET Core Web APIs
Die Grundlagen von ASP.NET Core Web API
Abfragen von Daten
Arbeiten mit Statuscodes
Anlegen, Aktualisieren und Löschen von Daten
Nutzung von Sub-Routen für Teil-Ressourcen
Nutzung weiterer Model-Binding-Funktionen
Anbieten unterschiedlicher Repräsentationen von Ressourcen
Nutzung des PATCH-Verbs mit JSON-Patch
Cross Origin Resource Sharing
Bereitstellung von OpenAPI-Beschreibungen über Swagger
Starten von Hintergrundprozessen über IHostedService
Integrationstests mithilfe des TestHosts
Service-Kommunikation mit HttpClient
Abfragen von Daten
Versenden von Daten und Reaktion auf Statuscodes
Arbeiten mit Headern und HttpRequestMessage
Generieren von Clients für Swagger-Spezifikationen
Ausblick auf Neuerungen durch ASP.NET Core 2.1
Annotation [ApiController]
ActionResult<T>-Rückgabewerte
Optimierte Input-Verarbeitung
13Microservices mit ASP.NET Core Web API und RabbitMQ
Grundlagen von Microservices
Mögliche Vorteile von Microservices
Mögliche Nachteile von Microservices
Modellierung von Microservices
Integration und Kommunikation von Microservices
Synchrone und asynchrone Kommunikation
Messaging-basierte versus Request-Response-Kommunikation
Gesteuerte (orchestriert) versus Event-getriebene Kommunikation (choreografiert)
.NET-Core-Technologien zur Umsetzung von Service-Kommunikation
Asynchrone Service-Kommunikation über RabbitMQ
Microservices-Fallstudie
Umgebung und fachlicher Kontext
Der HumanResourcesService
Der ProjectsService
Der ManagementDashboardService
Der InvoicingService
Fazit
Nützliche Patterns und Best-Practices im Bereich Microservices
Resilienz-Patterns
Serviceübergreifender Code und serviceübergreifende Funktionen
14ASP.NET Core SignalR
Hub-Klassen
Hub-Client mit .NET Core 2.1
Hub-Client mit Angular
Serverseitig initiierte Benachrichtigungen und Gruppen
Teil DWeb-Client-Programmierung
15JavaScript-Grundlagen
Grundlagen der Sprache
Sprachmerkmale und Entwurfsmuster
Vergleich mit Programmiersprachen
JavaScript-Syntax
Typen
Objekte
Symbole
Arrays
Operatoren
Anweisungen – Statements
Fehlerbehandlung
Variablen und Scope
Objektorientierung
Erstellen von Objekten
Klassen
Statische Mitglieder
Vererbung
Exkurs Objekthierarchie
Ableiten von internen Typen
Tipps zum Umgang mit objektorientierten Techniken
Globale Standardfunktionen
Timer-Funktionen
Prüffunktionen
Konvertierungsfunktionen
Module
Entwurfsmuster
Module
Funktionen
Pfeilfunktionen (Lambdas)
Erweiterte Objektliterale
Destrukturierung
Umgang mit Argumenten
Generatoren und Iteratoren
Asynchrone Programmierung
Klassische asynchrone Programmierung
Promise
Set und Map
Set
Map
Schlüsselvergleiche
Iteratoren
WeakMap und WeakSet
Reguläre Ausdrücke
Einführung
Kopieren oder Konstruieren?
Und wie funktioniert das?
Gruppierungen
Vorwärtsreferenzen
Die JavaScript-Funktionen
Zusammenfassung
Reflektions-API
Einfache Methoden
Reflect
Erzeugerfunktionen
Operatoren für Schlüsselwörter
Dynamische Argumentlisten
Funktionsaufrufe
Proxy-Fallen
Zusammenfassung der Reflect-Methoden
Stellvertreter: Proxies
Einführung
Proxy-Fallen anwenden
Schemaprüfung mit Proxies
Entfernbare Proxies
Übersicht
16TypeScript
Geschichte von TypeScript
Open-Source-Projekt
TypeScript-Compiler
Übersetzung von TypeScript in JavaScript
TypeScript Playground
TypeScript in Visual Studio
TypeScript-Kommandozeilencompiler tsc
TypeScript in Visual Studio Code
TypeScript in Gulp
Datentypen
Arrays und Tupel
Klassen
Generische Klassen
Strukturelle Typäquivalenz (Duck Typing)
Funktionen und Lambda-Ausdrücke
Dekoratoren
Module und Verweise
TypeScript ohne externes Modulsystem (interne Module)
Externe Module
Re-Export
Deklarationsdateien
Einbindung von Deklarationsdateien (altes Verfahren)
Import von Deklarationsdateien
Deklarationsdateien und tsconfig.js
Mixins
Mixin-Konstruktortypen
Deklaratives Mischen
Module mischen
Nicht mögliche Vermischungen
Reflektion: Metadaten per Programmcode
Die Metadaten-API für Reflektion
Ermitteln von Typinformationen
Ermitteln von Parameterinformationen
Ermitteln von Rückgabeinformationen
Asynchrone Programmierung
Generatoren und Iteratoren
Iteratoren
Generatoren
Asynchrone Iteration
Asynchrone Generatoren
17Angular
Ziele und Architektur von Angular
Browserunterstützung
Veröffentlichungszyklus von Angular
Dokumentation
Beispielsammlung
Komponenten
Datenbindung und Pipes
Syntaxübersichten
Strukturelle Direktiven
Datenbindungssyntax
Angular-Pipes
Module
Formulare
Routing
Dienste und Dependency Injection
Animationen
Werkzeuge
JiT vs. AOT
Angular Universal
18ASP.NET Blazor
Silverlight wurde eingestellt
Web Assembly
Architektur von Blazor
Erste Schritte mit ASP.NET Blazor
Beispielprojekt
Weitere Möglichkeiten
Ausblick
Teil EHosting von ASP.NET und ASP.NET Core
19Internet Information Services (IIS)
Versionsgeschichte
Kernfunktionen des IIS
Installation des IIS
Modularisierung
Skriptbasierte Installation
Integration zwischen ASP.NET und IIS
Test der Installation
IIS Express
IIS-Administration
IIS-Manager
Administration per Kommandozeile und Skript
IIS-Websites (virtuelle Webserver)
Websites erstellen
Websites erstellen per Skript
Wichtige Einstellungen für Websites
Beschränken der möglichen Clients
Authentifizierung
Transport Layer Security (TLS)/Secure Socket Layer (SSL)
Server für Nicht-HTTP-Protokolle
Virtuelle Verzeichnisse im IIS
IIS-Anwendungen
Rahmenbedingungen einer IIS-Anwendung
Anlegen einer IIS-Anwendung
IIS-Anwendungspools
Eigenschaften eines Anwendungspools
Liste der Anwendungspools
Zuordnung von Websites und IIS-Anwendungen zu Anwendungspools
ASP.NET-Version
Erweiterte Einstellungen für Anwendungspools
Anwendungspoolidentität
Wiederverwendung (Recycling)
Leistungseinstellungen
Zustandsüberwachung
Besonderheiten für ASP.NET-Anwendungen
IIS-Autostart
IIS-Verarbeitungspipeline
20Microsoft Azure
Azure-Konzepte
Anlegen einer Subscription
Anlegen einer Ressource Group
Anlegen eines App Service Plans
Anlegen eines Azure App Service
Anlegen eines Azure App Service mit der PowerShell
21Verteilen von Webanwendungen aus Visual Studio heraus
Web Deploy-Werkzeug
Web Deploy in einen IIS-Webserver
Web Deploy nach Azure
Konfigurationstransformationen
Erstellen der Transformationsdateien
Syntax der Transformationsdateien
Ergebnis der Transformation
Continuous Integration und Continuous Delivery
22Webanwendungen in Docker
Docker auf Windows
Installation der Docker-Unterstützung von Microsoft
Installation von Docker for Windows
Ein Image beschaffen
Einen Container starten
Ein Visual-Studio-Container-Projekt erstellen
Debugging eines Containers
Verwendung des Containers
Images aus Containern erstellen
.NET Core-Container
Container in Windows Server 2016 hosten
Images verbreiten
Teil FFallbeispiel: MiracleList
23Das Fallbeispiel »MiracleList«
Das Szenario
Links
24Das MiracleList-Backend
Architektur
Entitätsklassen
Entity Framework Core-Kontextklasse
Lebensdauer der Kontextklasse in ASP.NET Core-Anwendungen
Geschäftslogik
Web API
25MiracleList-Web-Client
Technikeinsatz im Web-Client
Angular-CLI
Webserver starten
Zusatzkomponenten
Proxy für REST-Dienste
Daten darstellen
Navigation zu den Aufgaben
Datumsanzeigen
Zeilenumbrüche
Aufgabenstatus ändern
Aufgaben anlegen
Suchfunktion
Komponentenbildung
Schritt 1: Routing-Modul
Schritt 2: Kommunikationsdienst
Schritt 3: Teilaufgabenliste in SubTaskList-Komponente
Schritt 4: Auslagerung in TaskView
Schritt 5: Aufgaben bearbeiten
Schritt 6: Integration in AppComponent
Datepicker
Kontextmenü verwenden
Nachfragen beim Löschen
Animationen
Sortieren der Aufgabenliste
Benutzeranmeldung
Hauptmenü
Testen
Auslieferung
26MiracleList-Electron-Client
Hybride Apps
Architektur von Electron
Electron-Projekt anlegen
Kommunikation zwischen Main und Renderer
Erweiterungen in der Webanwendung
Start der Electron-Anwendung
Debugging
Deployment
27MiracleList-Cordova-Client
Architektur von Cordova
Cordova-Projekt anlegen
Cordova-Anwendung starten
Erweiterungen in der Webanwendung
Cordova-APIs verwenden
Plug-ins verwenden
Responsive Web Design mit Bootstrap
Index
Liebe Leserinnen und Leser,
herzlichen willkommen zur dritten, erheblich erweiterten Auflage dieses Buchs.
Das Web hat sich verändert. Während für gute Webanwendungen vor rund zehn Jahren noch die Regel galt, so viele Aufgaben wie möglich auf dem Server zu erledigen (Server Side Rendering), wird heutzutage in vielen Fällen die Benutzeroberfläche auf dem Client gerendert (Client Side Rendering – CSR), sodass eine Single Page Application (SPA) entsteht. Der Webserver kommt oft nur noch für das initiale Laden der SPA und zum Datenaustausch via REST-Diensten (WebAPIs) zum Einsatz. Dank Basistechniken wie HTML5/CSS3, der erweiterten JavaScript-Syntax, und vielen neuen Browser-APIs sowie zahlreichen Frameworks, die die Handhabung einfacher machen, sind heutzutage Webanwendungen möglich, die in ihrer Benutzerfreundlichkeit Desktop-Anwendungen nahekommen.
Mittlerweile werden mit Webtechniken nicht nur Browseranwendungen, sondern auch mobile Apps und Desktop-Anwendungen entwickelt. Die Produktkombination aus HTML, CSS und JavaScript ist die einzige echte Cross-Platform-Technik, die die Entwicklung von Oberflächen für alle Betriebssysteme im Sinne von »Write once, run anywhere« ermöglicht.
Trotz des Trends zur Verlagerung des Renderings auf den Client gibt es weiterhin viele Webanwendungen, bei denen mit Server Side Rendering (SSR) gearbeitet wird.
Dieses Buch beschreibt sowohl Server- als auch Clienttechniken für moderne Webanwendungen.
Anders als die Vorlagen beginnt das Buch mit einem Buchteil »Web-Basiswissen«, in dem HTTP, HTML und CSS besprochen werden. Diese Ergänzung findet bewusst statt, weil es Leser-Feedback zu den Vorauflagen gab, dass das Buch Vorwissen in diesen Bereichen voraussetzte. Natürlich kann hier nicht das komplette Wissen zu den Basistechniken des Webs abgedruckt werden. Die Basiskapitel von Jörg Krause geben Ihnen aber ein solides Fundament für den Rest des Buchs.
Serverseitig gab es im Jahr 2016 mit dem Erscheinen von ASP.NET Core einen erheblichen Umbruch, den allerdings viele Unternehmen technisch und/oder organisatorisch noch nicht nachvollziehen können. In diesem Buch wird daher auf der Serverseite sowohl das klassische ASP.NET (MVC, Web API, SignalR) im Buchteil B als auch das neue ASP.NET Core (inkl. MVC, Razor Pages und Web API, SignalR) im Buchteil C besprochen. Ein eigenes Kapitel widmet sich der Entwicklung von Microservices inklusive einer umfangreichen Fallstudie.
Im Buchteil D geht es dann um die Client-Programmierung mit JavaScript und TypeScript sowie die derzeit sehr weit verbreiteten Webframeworks Boostrap (von Twitter) und Angular (von Google). Informationen zu React (von Facebook) finden Sie in Kapitel 30, einem der drei Bonuskapitel, die Sie als Ergänzung des Buchs – so wie im Vorwort beschrieben – herunterladen können.
Ein ganz aktuelles Kapitel zu ASP.NET Blazor ergänzt diesen Buchteil. Auch wenn ASP.NET Blazor noch in einem früheren Entwicklungsstadium steckt, weckt es dennoch bei vielen .NET-Entwicklern die Hoffnung, zukünftig mit C# statt mit JavaScript/TypeScript SPAs im Browser programmieren zu können.
Buchteil E behandelt den Betrieb (das »Hosting«) von Webanwendungen in den Internet Information Services (IIS) von Windows, in Docker-Containern und in Microsoft Azure.
Das Buch beschließt den Buchteil F mit einem größeren Fallbeispiel: MiracleList ist eine moderne, auf Webtechniken basierende Cross-Platform-Anwendung zur Aufgabenverwaltung (in Anlehnung an www.wunderlist.com, für das Microsoft im Jahr 2015 einen dreistelligen Millionenbetrag bezahlt hat). Der Server basiert auf ASP.NET Core und läuft auf Windows, Linux oder macOS. Der Client basiert unter anderem auf HTML, CSS, JavaScript, Angular, Electron und Cordova. Er läuft daher sowohl im Browser als auch in Desktop-Anwendungen auf Windows, Linux oder macOS sowie als mobile App in iOS, Android und Windows Mobile.
Das Buch richtet sich an Softwareentwickler, die bereits grundlegende Erfahrung mit .NET und C# besitzen und nun moderne Webanwendungen entwickeln wollen. Das Buch beinhaltet keine Einführung in .NET und C#, aber es führt in alle notwendigen Webtechniken ein.
Wenn Sie die Programmiersprache C# noch nicht oder noch nicht gut beherrschen, sollten Sie vorab dieses Buch lesen:
Holger Schwichtenberg:
C# 7.2 Crashkurs: Die Syntax der Programmiersprache C# für die Softwareentwicklung in .NET Framework, .NET Core und Xamarin.
www.IT-Visions.de, 2018
1. Auflage 2018167 Seiten, 15,00 €
ISBN: 978-3-93427-930-8
Zielsetzung dieses Buchs ist es, dem Leser zu zeigen, wie die Techniken eingesetzt werden können, um moderne Webanwendungen zu schaffen. Der Fokus liegt dabei auf den Konzepten, die hinter diesen Techniken stehen. Dazu spielt dieses Buch eine Vielzahl an Beispielen durch.
Es ist nicht Ziel dieses Buchs, ein Nachschlagewerk für die Vielzahl der Sprach- und Syntaxelemente sowie Klassen zu sein. Ein Nachschlagewerk zu all diesen Techniken würde viele Tausend Seiten dick sein. Schon bei der hier vorliegenden Seitenzahl mussten Inhalte gekürzt werden. Auf einige Fakten und Praxisbeispiele, die wir gerne präsentiert hätten, mussten wir daher leider verzichten.
Für eine erschöpfende Auflistung sämtlicher Befehle wird, gerade bei den clientseitigen Technologien, auf die umfangreichen frei verfügbaren Online-Referenzen verwiesen.
Darüber hinaus gehen wir auch davon aus, dass der Leser mit wenig Aufwand herausfinden kann, in welchem Namensraum beziehungsweise in welcher Assembly sich eine erwähnte Klasse befindet, sofern diese nicht ohnehin durch die in Visual Studio verwendeten Vorlagen eingebunden wurde.
Außerdem werden in diesem Buch keine Datenbankzugriffe besprochen. Hierzu sei auf das folgende Buch verwiesen:
Holger Schwichtenberg:
Effizienter Datenzugriff mit Entity Framework Core: Datenbankprogrammierung mit C# für .NET Framework, .NET Core und Xamarin.
Carl Hanser Verlag, 2018
468 Seiten, 42,00 €
ISBN: 978-3-446-44898-8
Das Buch behandelt die zum Redaktionsschluss des Buchs aktuellen stabilen Versionen. Dies sind unter anderem:
Visual Studio 2017 Version 15.6 und 15.7
Visual Studio Code 1.22
.NET Framework 4.7.2
.NET Core 2.0.2 (mit Ausblick auf die Version 2.1)
ASP.NET MVC 5.2.4
ASP.NET Web API 5.2.4
ASP.NET Core 2.0.2 (mit Ausblick auf die Version 2.1)
Bootstrap 4.0.0
TypeScript 2.8.1
Angular 5.2.9
React 16.2.0
Internet Information Services 10.0
Docker 18.05.0
Electron 1.8.3
Cordova 8.0
Das vorliegende Buch verwendet serverseitig die Programmiersprache C# sowie clientseitig JavaScript und TypeScript.
Alle Leser, die serverseitig lieber mit Visual Basic .NET arbeiten, können die abgedruckten Beispiele sehr einfach mit kostenlosen Werkzeugen nach Visual Basic .NET konvertieren. Informationen dazu findet man unter http://www.dotnetframework.de/tools.aspx.
Dieses Buch bezieht sich primär auf die Programmierung mit der integrierten Entwicklungsumgebung Visual Studio. Von Visual Studio kann man eine kostenfreie Community Edition nur in kleineren Firmen und bei Open-Source-Projekten kostenfrei einsetzen (www.visualstudio.com/vs/community). Für die Webclient-Programmierung kommt auch Visual Studio Code (https://code.visualstudio.com) zum Einsatz. Zudem sollten Sie node.js (nodejs.org) installieren, um den Node Package Manager (NPM) zur Verfügung zu haben. Für das Testen von Web APIs wird Postman (www.getpostman.com) und Fiddler (www.telerik.com/download/fiddler) verwendet. Auf weitere Werkzeuge wird in den einzelnen Kapiteln hingewiesen.
Dieses Buch beschreibt die englische Version von Visual Studio, weil inzwischen viele deutsche Entwickler (einschließlich der Autoren) die englische Version der Software bevorzugen, denn die Übersetzungen ins Deutsche sind oft holprig und die Fehlermeldungen nur schwer verständlich. Visual-Studio-Anwender können über den Befehl Tools/Options/Environment/International Settings weitere Sprachpakete herunterladen und einrichten. Weiterhin sei noch darauf hingewiesen, dass die Anordnung der Menüs und auch einige Tastaturkürzel von den gewählten Einstellungen in Visual Studio abhängen. Alle Ausführungen in diesem Buch beziehen sich auf die Umgebungseinstellung Common Settings, die bei der Installation des Produkts ausgewählt werden kann.
Die Code-Beispiele zu diesem Buch erhalten Sie auf oreilly.de auf der Webseite zum Buch Moderne Webanwendungen für .NET-Entwickler unter »Zusatzmaterial«.
Hier finden Sie außerdem drei zusätzliche Kapitel als PDF zum Download, die dieses Buch inhaltlich abrunden: Kapitel 28 »Open Web Interface for .NET (OWIN) und Katana«, Kapitel 29 »Sicherheit in ASP.NET« sowie Kapitel 30 »React«.
Die Autoren bieten den Leserinnen und Lesern dieses Buchs darüber hinaus im Rahmen einer zugangsbeschränkten Website folgende Serviceleistungen:
Bonuskapitel
Ergänzend erhalten Sie auch hier die drei zusätzlichen Kapitel als PDF zum Download: Kapitel 28 »Open Web Interface for .NET (OWIN) und Katana«, Kapitel 29 »Sicherheit in ASP.NET« sowie Kapitel 30 »React«.
Downloads
Sie können alle in diesem Buch vorgestellten Code-Beispiele hier herunterladen.
Spickzettel (Cheat Sheets)
Ergänzend erhalten Sie hier drei Spickzettel in PDF-Form mit den wichtigsten Befehlen von ASP.NET (Core) MVC und Web API, TypeScript und Angular – zum Ausdrucken und »Spicken« beim Programmieren.
Diskussionsrunde
Ein webbasiertes Forum bietet die Möglichkeit, Fragen an die Autoren zu stellen. Bitte beachten Sie jedoch, dass dies eine freiwillige Leistung der Autoren ist und kein Anspruch auf eine kostenlose Betreuung besteht.
Newsletter
Alle registrierten Leser erhalten zwei- bis viermal jährlich einen Newsletter mit aktuellen Terminen und Publikationshinweisen.
Leserbewertung
Vergeben Sie Noten für dieses Buch und lesen Sie nach, was andere Leser von diesem Buch halten.
Errata
Trotz eines jahrelang erprobten Vorgehensmodells und der dreifachen Qualitätskontrolle (Co-Autor, Fachlektor, Verlag) ist es möglich, dass sich einzelne Fehler in dieses Buch eingeschlichen haben. Im Webportal können Sie nachlesen, welche Fehler gefunden wurden. Sie können hier auch selbst Fehler, die Ihnen auffallen, melden.
Abbildung V.1: Der Spickzettel zu ASP.NET (Core) MVC und Web API
Zugang zu der ehrenamtlich betriebenen Leser-Website erhalten Sie unter www.IT-Visions.de/Leser. Dort müssen Sie sich einmalig registrieren. Bei der Registrierung wird ein Losungswort abgefragt, das Sie als Käufer dieses Buchs ausweist. Bitte geben Sie dort Beyond ein. Durch die Registrierung erhalten Sie ein persönliches Kennwort per E-Mail zugesendet, das Sie dann für die Anmeldung nutzen können.
Dieses Symbol weist auf eine Warnung oder ein Problem hin.
Dieses Symbol markiert einen allgemeinen Hinweis oder Tipp.
Für ihre Mitwirkung an diesem Buch möchte ich danken:
meinem Co-Autor Jörg Krause, der den Großteil des Texts im Buchteil »Web-Basiswissen« sowie die Kapitel zu JavaScript, Bootstrap und React geschrieben hat.
meinem ehemaligen Co-Autor Manfred Steyer, der sich nun leider nicht mehr mit den Themen dieses Buchs beschäftigt, von dem wir aber einige Texte zum klassischen ASP.NET MVC und Web API in die neue Auflage übernehmen durften.
Dr. Joachim Fuchs für das Kapitel »ASP.NET Core SignalR«.
Sebastian Kleinschmager für die Kapitel zu ASP.NET Core Web APIs und Microservices.
der O’Reilly-Lektorin Ariane Hesse.
der Korrektorin Claudia Lötschert, die das Buch sprachlich verbessert hat.
Essen im Herzen des Ruhrgebiets, im April 2018
Holger Schwichtenberg
Alle Autoren dieses Buchs arbeiten bei der Firma www.IT-Visions.de als Softwarearchitekten, Softwareentwickler, Trainer und Berater für .NET-Techniken. www.IT-Visions.de ist ein Verbund der deutschen Top-Experten im Bereich der Microsoft-Produkte und -Technologien insbesondere .NET. Unter Leitung und Mitwirkung von Dr. Holger Schwichtenberg bietet www.IT-Visions.de:
Strategische und technische Beratung
Konzepte, Machbarkeitsstudien und Reviews
Coaching bei Entwicklungsprojekten
Technischen Support vor Ort und via Telefon, E-Mail oder Web-Konferenz
Individuell zugeschnittene technische Vor-Ort-Schulungen und anforderungsorientierte Workshops
Öffentliche Seminare, siehe
www.dotnet-akademie.de
Die Schwestergesellschaft 5Minds IT-Solutions GmbH & Co. KG bietet Softwareentwicklung (Prototypen und komplette Lösungen) sowie den Verleih von Softwareentwicklern.
Zu den Kunden gehören neben vielen mittelständischen Unternehmen auch Großunternehmen wie z.B. Siemens, Bayer, RWE, Bertelsmann, BASF, Bosch, Thyssen-Krupp, Merkle, Festo, Lufthansa, AIRBUS, REWE, EnBW, DEA, PwC, Deutsche Telekom, Deutsche Post, Karstadt, eurofins, Roche, OSRAM, Jenoptik, Continental, Carl Zeiss, Haufe-Lexware, TÜV, Sartorius, Fraunhofer, diverse Banken und Versicherungen sowie mehrere Landesregierungen.
Firmenwebsites:
http://www.IT-Visions.de
und
http://www.5minds.de
Kontakt zu allen Autoren: E-Mail
sowie Telefon
0201-64 95 90-0
Studienabschluss Diplom-Wirtschaftsinformatik an der Universität Essen
Promotion an der Universität Essen im Gebiet komponentenbasierter Softwareentwicklung
Seit 1996 selbstständig als unabhängiger Berater, Dozent, Softwarearchitekt und Fachjournalist
Leiter des Berater- und Dozententeams bei
www.IT-Visions.de
Softwareentwicklungsprojektleitung im Bereich Microsoft/.NET bei der 5minds IT-Solutions GmbH & Co. KG (
www.5minds.de
)
Über 65 Fachbücher beim Carl Hanser Verlag, bei O’Reilly, Microsoft Press und Addison-Wesley sowie mehr als 1000 Beiträge in Fachzeitschriften
Gutachter in den Wettbewerbsverfahren der EU gegen Microsoft (2006–2009)
Ständiger Mitarbeiter der Zeitschriften iX (seit 1999), dotnetpro (seit 2000) und Windows Developer (seit 2010) sowie beim Onlineportal heise.de (seit 2008)
Regelmäßiger Sprecher auf nationalen und internationalen Fachkonferenzen (zum Beispiel Microsoft TechEd, Microsoft Summit, Microsoft IT Forum, BASTA, BASTA-on-Tour, .NET Architecture Camp, Advanced Developers Conference, Developer Week, OOP, DOTNET Cologne, MD DevDays, Community in Motion, DOTNET-Konferenz, VS One, NRW.Conf, Net.Object Days, Windows Forum, Container Conf)
Zertifikate und Auszeichnungen von Microsoft:
– Microsoft Most Valuable Professional (MVP)
– Microsoft Certified Solution Developer (MCSD)
Thematische Schwerpunkte:
– Softwarearchitektur, mehrschichtige Softwareentwicklung, Softwarekomponenten, SOA
– Microsoft .NET Framework, Visual Studio, C#, Visual Basic
– .NET-Architektur/Auswahl von .NET-Technologien
– Einführung von .NET Framework und Visual Studio/Migration auf .NET
– Webanwendungsentwicklung und Cross-Plattform-Anwendungen mit HTML, ASP.NET, JavaScript/TypeScript und Webframeworks wie Angular
– Enterprise .NET, verteilte Systeme/Webservices mit .NET, insbesondere Windows Communication Foundation und Web API
– Relationale Datenbanken, XML, Datenzugriffsstrategien
– Objektrelationales Mapping (ORM), insbesondere ADO.NET Entity Framework und EF Core
– Windows PowerShell, PowerShell Core und Windows Management Instrumentation (WMI)
Jörg Krause arbeitet seit vielen Jahren als Autor, Trainer, Berater und Softwareentwickler für große Unternehmen weltweit. Bauen Sie auf die Erfahrung aus mehr als 25 Jahren Arbeit mit Webumgebungen und sehr vielen großen und kleinen Projekten. Schwerpunkte der Arbeit sind Webtechnologien und damit verwandte Bereiche. Dies umfasste sowohl den Frontend- als auch den Backend-Bereich sowie Nutzung von Windows und auch von Linux mit der Wahl der jeweils optimalen Plattform.
Er hat über 40 Titel bei renommierten Fachverlagen in Deutsch und Englisch veröffentlicht, darunter auch einige Bestseller. Weitere Titel sind im Eigenverlag erschienen, ebenso wie zahlreiche Zeitschriftenartikel. Sein Wissen gibt er in Seminaren und Schulungen und gelegentlich auf Fachkonferenzen weiter. Zu den Grundlagenthemen gehören HTML, CSS, JavaScript und TypeScript, aktuelle Anwendungs-Rahmenwerke wie React und Angular sowie Backend-Technologien wie beispielsweise SQL Server, Node.js, ASP.NET und Docker.
Jörg sind vor allem solide Grundlagen wichtig. Statt immer dem neuesten Framework hinterherzurennen wären viele Entwickler besser beraten, sich eine robuste Grundlage zu schaffen. Wer dies kompakt und schnell lernen will, ist bei ihm richtig. Deshalb wird der didaktischen Aufbereitung in seinen Schulungen und Veröffentlichungen besondere Aufmerksamkeit zuteil.
Dr.-Ing. Joachim Fuchs ist ein bekannter Experte für .NET mit Schwerpunkt auf UI-Techniken (insbesondere WPF, ASP.NET MVC und Angular). Er arbeitet für www.IT-Visions.de als Trainer und Softwareentwickler. Durch seine Fachbücher und Artikel in Fachzeitschriften ist er in der .NET-Szene bestens bekannt.
Sebastian Kleinschmager ist freiberuflicher Softwareentwickler und Trainer. Seine technologischen Schwerpunkte liegen im Bereich .NET/C# und Webtechnologien, vor allem ASP.NET Core und Angular. Zudem beschäftigt er sich stark mit den Themen Clean Code, Qualitätssicherung und Architektur, dort insbesondere Microservices und ähnlichen Ansätzen. Sein Wissen zu diesen Themen bringt er mit viel Leidenschaft bei seinen Kunden in Projekte ein und vermittelt es genauso motiviert als Dozent und Teil des www.IT-Visions.de-Expertenteams.
Manfred Steyer ist Trainer und Berater bei www.IT-Visions.de sowie verantwortlich für den Fachbereich Software Engineering der Studienrichtung IT und Wirtschaftsinformatik an der FH CAMPUS 02 in Graz.
Er schreibt für das windows.developer magazin (vormals dot.net magazin) sowie Heise Developer und ist Buchautor bei O’Reilly, Microsoft Press sowie Carl Hanser. Manfred hat berufsbegleitend IT und IT-Marketing in Graz sowie Computer Science in Hagen studiert und kann auf mehr als 15 Jahre an Erfahrung in der Planung und Umsetzung von großen Applikationen zurückblicken. Er ist ausgebildeter Trainer für den Bereich der Erwachsenenbildung und spricht regelmäßig auf Fachkonferenzen.
In der Vergangenheit war Manfred Steyer mehrere Jahre für ein großes österreichisches Systemhaus tätig. In der Rolle als Bereichsleiter hat er gemeinsam mit seinem Team Geschäftsanwendungen konzipiert und umgesetzt.
Kapitel 1Protokolle, Standards und Konzepte
Kapitel 2Hypertext Markup Language (HTML)
Kapitel 3Cascading Style Sheets (CSS)
Kapitel 4Bootstrap
Dieses Buchkapitel vermittelt Basiswissen im Bereich der Webtechniken, die die Grundlage sowohl für die Server- als auch Clientprogrammierung bilden. Zudem wird in diesem Buchteil auch Bootstrap besprochen, das von CSS abstrahiert. Wir besprechen Bootstrap bereits in diesem Teil, weil Microsoft es in den Projektvorlagen für ASP.NET und ASP.NET Core einsetzt.
Dieses Kapitel bietet einen sehr kompakten Überblick über die Protokolle, die Sie kennen sollten, wenn Sie aktiv Webanwendungen entwickeln möchten.
Dieses Kapitel erwähnt kurz die drei wichtigsten Standardisierungsgremien für die Webprogrammierung.
Wenn Sie sich mit Protokollen und konkreten Implementierungen technischer Verfahren rund um das Internet beschäftigen, werden Sie immer wieder mit RFCs (Request for Comments) (www.elektronik-kompendium.de/sites/net/0904121.htm) konfrontiert. Die RFCs dienen als öffentliches Diskussionsforum für technische und organisatorische Fragen des Internets. Sie wurden mit dem ARPA-NET im Jahre 1969 ins Leben gerufen. Die RFC 0001 wurde am 7. April 1969 veröffentlicht, noch während der laufenden Entwicklung des ARPANET (de.wikipedia.org/wiki/Arpanet).
RFCs werden fortlaufend nummeriert und können verschiedene Stufen durchlaufen. Es gibt keine Versionsnummern. Wird ein RFC umfassend weiterentwickelt, erscheint ein neues Dokument mit einer neuen Nummer. Das alte wird als obsolet gekennzeichnet. Werden aus RFCs Standards verabschiedet, so erscheinen diese in einer zweiten Dokumentform, die durch STD gekennzeichnet ist. Der Zusammenhang zwischen RFCs und STDs ist in RFC 2500 geregelt. Der Standardisierungsprozess wird in RFC 2026 erläutert.
Als gute Informationsquelle für RFCs ist die Webseite www.rfc-editor.org zu empfehlen. Hier können Sie in der RFC- und STD-Datenbank komfortabel stöbern. Wenn Sie nach tiefer gehenden Informationen zu bestimmten Protokollen wie beispielsweise ICMP oder DNS suchen, tragen Sie diese in die Suchmaske ein.
Abbildung 1-1: Eine gute Informationsquelle ist der RFC-Editor.
Amüsant kann das Studium von RFCs mit dem Erscheinungsdatum vom 1. April und dem Status INFORMATIONAL sein. Zu empfehlen ist hier beispielsweise RFC 2550, in dem die Jahr-10.000-Problematik erörtert wird.
Neben den RFCs sind die Standards des seit dem Jahr 1994 tätigen World Wide Web Consortium (W3C) die wichtigsten Standards im Web. Das W3C hat unter anderem HTML, XHTML und XML standardisiert.
Die ECMA standardisiert JavaScript unter seinem offiziellen Namen ECMAScript. Auch die Programmiersprachen C# und C++/CLI sind hier standardisiert.
In diesem Abschnitt erfahren Sie das Wichtigste über HTTP, das in der Webserver-Programmierung eine herausragende Rolle spielt.
HTTP dient der Kommunikation mit Webservern. Es gibt die Versionen 1.0 (1996, RFC 1945), 1.1 (1999, RFC 2616) und 2.0 (2015, RFC 7540). Aufseiten der Browser wird von HTTP 1.1 gesprochen, einige neuere (Chrome, Edge) kennen bereits HTTP 2.0. Die Version 2.0 befindet sich heute (2017) in der Einführungsphase. Dazu kommt eine Reihe von Sub-Standards, die teilweise implizit benutzt werden:
RFC 7541 Header Compression (2, 2015)
RFC 7230 Message Syntax and Routing (1.1, 2014)
RFC 7231 Semantics and Content (1.1, 2014)
RFC 7232 Conditional Requests (1.1, 2014)
RFC 7233 Range Requests (1.1, 2014)
RFC 7234 Caching (1.1, 2014)
RFC 7235 Authentication (1.1, 2014)
Bei HTTP handelt es sich um ein verbindungs- oder statusloses Protokoll. Server und Client nehmen also nie einen besonderen Zustand ein, sondern beenden nach jedem Kommando den Prozess vollständig, entweder mit Erfolg oder mit einer Fehlermeldung. Es obliegt dem Kommunikationspartner, darauf in angemessener Weise zu reagieren.
Einer der großen Vorteile von HTTP als dem Protokoll der Wahl für die Kommunikation im Web und auch für Inter-Service-Kommunikation ist seine Einfachheit. HTTP setzt auf TCP/IP als etabliertes Transportprotokoll auf und kommt ohne eigenen schwergewichtigen Protokollrahmen und Metadaten aus. Egal ob auf mobilen Geräten, in Webbrowsern oder bei Cloud-Services, egal ob auf der Java-Plattform, unter PHP oder .NET: HTTP wird überall unterstützt. Dies ist auch der Grund dafür, dass REST-Web-API-Services (alias »HTTP Services«) auf dem Vormarsch sind, die direkt auf HTTP basieren und auf aufwendige aus der Welt der verteilten Programmierung bekannte Protokolle wie SOAP verzichten.
HTTP-Kommandos werden als ASCII-Text übertragen und können aus mehreren Zeilen bestehen. Die erste Zeile ist immer die Kommandozeile. Daran angehängt kann ein Message-Header (Nachrichtenkopf) folgen. Der Nachrichtenkopf enthält weitere Kopffelder, die das Kommando näher beschreiben. So ist in der Regel immer ein Content-Length-Kopffeld enthalten. Steht dort ein Wert größer als 0, folgen dem Nachrichtenkopf Daten. Die Daten werden also gleich zusammen mit dem Kommando gesendet, man spricht dann vom Body (Körper) der Nachricht. HTTP versteht im Gegensatz zu anderen Protokollen den Umgang mit 8-Bit-Werten. Binärdaten, wie Bilder oder Sounds, müssen nicht konvertiert werden. Folgen dem HTTP-Kommando und den Nachrichtenkopf-Zeilen zwei Leerzeilen (Zeilenwechsel), so gilt das Kommando als beendet. Kommandos mit Nachrichtenkörper haben kein spezielles Ende-Zeichen. Das Content-Length-Kopffeld bestimmt, wie viele Bytes als Inhalt der Nachricht betrachtet werden.
Ein HTTP-Kommando hat immer folgenden Aufbau:
1 METHODE ID VERSION
Als METHODE wird das Kommando selbst bezeichnet.
In der Literatur wird die HTTP-Methode manchmal als »Verb« bezeichnet. Der Begriff Verb kommt jedoch in der RFC und allen Standardisierungsdokumenten nicht vor. Die Ursache liegt in der Bezeichnung einiger Klassen und Datentypen in den Entwicklungsumgebungen von Microsoft (technet.microsoft.com/de-de/library/dd569062.aspx), wo Methoden als HTTP-Verben bezeichnet werden (siehe technet.microsoft.com/de-de/library/dd569062.aspx).
Die folgende Tabelle zeigt die wichtigsten HTTP-Methoden auf einen Blick.
Tabelle 1-1: Auswahl HTTP-Methoden
Methode
Bedeutung
CONNECT
Verbindung zu einer TLS-Ressource aufbauen
DELETE
Ressource löschen (siehe Kapitel zu REST)
GET
Ressource anfordern
HEAD
Header der Ressource anfordern
LINK
Verknüpfung zweier Ressourcen beantragen
OPTIONS
Merkmale des Webservers erfragen, Auth-Preflight
POST
Formulardaten an einen Serverprozess senden
PUT
Ressource auf dem Webserver ablegen (siehe Kapitel zu REST)
TRACE
Kommando zurückschicken lassen
UNLINK
Verknüpfung zwischen Ressourcen löschen
Beachten Sie hier, dass die Methode unbedingt in Großbuchstaben geschrieben werden muss, exakt wie in der Tabelle oben gezeigt.
Die Standardmethoden verwenden Großbuchstaben, was bei anderen Methoden für spezielle Zwecke nicht zwingend so ist. Deshalb ist die Unterscheidung wichtig, weil »Delete« eben etwas völlig anderes bedeuten kann als »DELETE«.
Als Ressource werden all die Objekte bezeichnet, die übertragen werden können – in erster Linie also HTML-Dateien, Daten und Bilder.
Die ID einer Ressource kann beispielsweise eine Adresse oder ein Dateiname sein:
1 GET index.html HTTP/1.0
Dieses Kommando fordert die Datei index.html an.
Die Antwort auf ein Kommando besteht im Senden der Daten – wenn dies gefordert wurde – und einem Statuscode. Dem Statuscode folgen optionale Felder und, bei der Übertragung von Ressourcen, die Daten. Die Statuszeile hat folgenden Aufbau:
1 VERSION STATUSCODE STATUSTEXT
Der Statuscode ist eine dreistellige Zahl, von der die erste Ziffer (Hunderterstelle) die Zuordnung zu einer bestimmten Gruppe anzeigt.
Tabelle 1-2: HTTP-Antwortcodes (Auswahl)
Sicher kennen Sie den Fehler 404. Man geht davon aus, dass der Fehler beim Client liegt (Gruppe 4), also schlicht die falsche Ressource angefordert wurde. Sie werden schnell den Fehler 500 kennenlernen, der erzeugt wird, wenn ein Programm nicht funktioniert. Das Programm läuft auf dem Server, und deshalb ist es ein Fehler der Gruppe 5.
Der grundsätzliche Ablauf einer HTTP-Kommunikation besteht aus zwei Teilen, nämlich Anfrage (request) und Antwort (response). Dies sieht beispielsweise folgendermaßen aus:
Listing 1-1: Anfrage
1 GET http://www.it-visions.de/ HTTP/1.1
2 Accept: text/html, application/xhtml+xml, image/jxr, */*
3 Accept-Language: de-DE,de;q=0.8,en-US;q=0.5,en;q=0.3
4 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; LCJB; \
5 rv:11.0) like Gecko
6 Accept-Encoding: gzip, deflate
7 Host: www.it-visions.de
8 Connection: Keep-Alive
Listing 1-2: Antwort (nur Kopffelder, ohne Daten)
1 HTTP/1.1 200 OK
2 Date: Sun, 17 Jan 2016 10:59:09 GMT
3 Server: Apache
4 X-Powered-By: PHP/5.5.30
5 Expires: Thu, 19 Nov 1981 08:52:00 GMT
6 Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pr\
7 e-check=0
8 Pragma: no-cache
9 X-Pingback: http://www.it-visions.de/xmlrpc.php
10 Link: <http://wp.me/P6sMv6-12>; rel=shortlink
11 Set-Cookie: PHPSESSID=4744597c154b01a61e245292b8f1a897; path=/
12 Keep-Alive: timeout=2, max=200
13 Connection: Keep-Alive
14 Content-Type: text/html; charset=UTF-8
15 Content-Length: 27465
An ein Kommando oder an die Statuszeile können weitere Felder angehängt werden, sogenannte Kopffelder (manchmal auch Kopfzeilen genannt, weil jedes Feld auf einer Zeile steht) oder kurz Header:
Feldname: Wert; Wert
Die Nachrichtenkopffelder können in drei Hauptgruppen aufgeteilt werden:
F: Fragefelder (Request-Header-Fields), die nur in Kommandos erlaubt sind.
A: Antwortfelder (Response-Header-Fields), die Statusnachrichten vorbehalten sind.
I: Informationsfelder (General-Header-Fields), sie dienen der Übertragung aller anderen Nachrichten in die eine oder andere Richtung.
Eine typische Anwendung, die bei der Webprogrammierung auftreten kann, ist die Übergabe eines Nachrichtenkopffelds, das einen besonderen Dateityp für das Herunterladen einer Datei angibt:
Content-Type: application/pdf; name=aspnet.pdf
Im Gegensatz zu anderen Protokollen ist die Länge eines Datenblocks im Content-Length-Kopffeld festgelegt, irgendwelche Begrenzungszeichen gibt es nicht. Wichtig ist auch, dass der Server nach dem Verbindungsaufbau keine Antwort sendet. Nur das erste eintreffende Kommando löst eine Reaktion aus. Darin ist die Ursache zu sehen, wenn der Browser nach der Anforderung eines unerreichbaren Servers lange Zeit nicht reagiert. Als »Totsignal« wird einfach eine vorgegebene Zeitspanne gewartet, in der der Server auf das erste Kommando reagieren sollte.
Die aktuelle Version von HTTP ist HTTP 2.0 (im Header als HTTP/2 bezeichnet), die als RFC 7540 am 15. Mai 2015 veröffentlicht wurde.
Der Standard ist heute in den RFC 7540 und 7541 spezifiziert. Die Entwicklung war maßgeblich von Google (SPDY, spricht man aus wie »speedy«) und Microsoft (HTTP Speed+Mobility) mit jeweils eigenen Vorschlägen vorangetrieben worden. Ein erster Entwurf, der sich weitgehend an SPDY anlehnte, war im November 2012 publiziert und seither in mehreren Schritten angepasst worden.
Mit HTTP/2 soll die Übertragung beschleunigt und optimiert werden. Der neue Standard ist vollständig abwärtskompatibel zu HTTP/1.1.
Wichtige neue Möglichkeiten sind:
das Zusammenfassen mehrerer Anfragen
bessere Kompressionsmöglichkeiten
binär codierte Übertragung von Inhalten
Server-initiierte Datenübertragungen (Push-Verfahren)
Eine Beschleunigung ergibt sich hauptsächlich aus der neuen Möglichkeit des Zusammenfassens (Multiplex) mehrerer Anfragen, um sie über eine Verbindung abwickeln zu können. Die Datenkompression kann nun auch Kopfdaten mit einschließen. Statt des bisher benutzten Gzip oder Deflate erreicht man dies mit dem neuem Spezialalgorithmus namens HPACK (tools.ietf.org/html/rfc7541) (RFC 7541).
Inhalte können binär codiert übertragen werden. Um nicht auf serverseitig vorhersehbare Folgeanforderungen vom Client warten zu müssen, können Datenübertragungen teilweise vom Server initiiert werden (Push-Verfahren).
Die ursprünglich geplante Option, dass HTTP/2 standardmäßig TLS (Transport Layer Security, früher SSL genannt, dient der Verschlüsselung) nutzt, wurde nicht umgesetzt. Allerdings kündigten Google und Mozilla für ihre Browser an, dass diese HTTP/2 nicht ohne Verschlüsselung unterstützen werden (siehe Application-Layer Protocol Negotiation (de.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation)). Aufgrund der Marktmacht muss man davon ausgehen, dass damit alle HTTP/2-Server zwingend TLS anbieten müssen.
Die verbreiteten modernen Browser unterstützen inzwischen HTTP/2. Darunter Google Chrome (auch unter iOS und Android) ab Version 41, Mozilla Firefox ab Version 36, Internet Explorer 11 und Edge unter Windows 10, Opera ab Version 28 (auch Opera Mobile ab Version 24) und Safari ab Version 8.
Flankiert wird HTTP durch weitere Standards, die entweder darauf aufsetzen oder ergänzend benutzt werden.
Das Web-Socket-Protokoll (de.wikipedia.org/wiki/Web-Socket) ist ein auf TCP basierendes Netzwerkprotokoll, das entworfen wurde, um eine bidirektionale Verbindung zwischen einer Webanwendung und einem Web-Socket-Server beziehungsweise einem Webserver, der auch Web-Sockets unterstützt, herzustellen. Es entfallen bei Web-Sockets die durch die HTTP-Kopffelder verursachten zusätzlichen Daten.
Während bei einer reinen HTTP-Verbindung jede Aktion des Servers eine vorhergehende Anfrage des Clients erfordert, muss beim Web-Socket-Protokoll der Client die Verbindung nur eröffnen. Der Server kann dann diese offene Verbindung aktiv verwenden und weitere Informationen an den Client senden, ohne auf eine neue Verbindung des Clients zu warten.
Die Anfrage wird mit einem speziellen Kopffeld aus HTTP heraus initiiert:
1 GET /chat HTTP/1.1
2 Host: server.example.com
3 Upgrade: websocket
4 Connection: Upgrade
6 Origin: http://example.com
7 Sec-Web-Socket-Protocol: chat, superchat
8 Sec-Web-Socket-Version: 13
Die Antwort sollte dann den Statuscode 101 enthalten:
1 HTTP/1.1 101 Switching Protocols
2 Upgrade: websocket
3 Connection: Upgrade
5 Sec-Web-Socket-Protocol: chat
Durch den HTTP-Statuscode 101 und die folgenden zwei Zeilen erklärt der Server, dass er mit dem Wechsel des Protokolls einverstanden ist.
Technisch betrachtet startet bei Web-Socket, wie bei HTTP, der Client eine Anfrage, mit dem Unterschied, dass nach der Übertragung der Daten zum Verbindungsaufbau die zugrunde liegende TCP-Verbindung bestehen bleibt und Übertragungen in beide Richtungen ermöglicht.
WebDAV (de.wikipedia.org/wiki/WebDAV) (Web-based Distributed Authoring and Versioning) ist ein offener Standard zur Bereitstellung von Dateien im Internet. Dabei können Benutzer auf ihre Daten transparent zugreifen, also schreibend und lesend.
Technisch gesehen ist WebDAV eine Erweiterung des Protokolls HTTP/1.1, die bestimmte Einschränkungen von HTTP aufhebt. Mit WebDAV können Dateien und auch ganze Verzeichnisse übertragen werden. Zudem ist eine Versionskontrolle spezifiziert.
Da der schreibende Zugriff auf Webserver ziemlich riskant ist, hat WebDAV keine massive Verbreitung gefunden. Es wird, wenn überhaupt, zum Veröffentlichen von Anwendungen aus einer lokalen Entwicklungsumgebung heraus benutzt. Einige Webhoster und Provider bieten dies als leistungsfähige Alternative zu FTP an.
SMTP kommt in Clientsystemen für das Versenden sowie bei Mailservern zum Senden und Weiterleiten von E-Mails zum Einsatz. Inzwischen hat sich der ESMTP-Standard durchgesetzt. Dieser ist in RFC 2821 spezifiziert und bietet erweiterte Funktionen zur Kommunikation zwischen SMTP-Client und -Server.
Wie viele Protokolle im Webumfeld ist auch dieses Protokoll ASCII-Text-basiert. Alle Nachrichten, die vom Client zum Server gesendet werden, können dabei sowohl vom Menschen als auch von der Software interpretiert werden.
Neben HTTP ist FTP das wichtigste Protokoll beim tagtäglichen Einsatz im Internet. Es dient dem Datenaustausch zwischen FTP-Server und -Client, wobei der Client auf eine genau definierte Art und Weise Zugriff auf das Dateisystem des Servers erhalten kann.
Für den Zugriff auf einen FTP-Server bieten alle modernen Betriebssysteme verschiedene Arten von Clients. Dazu kommen viele grafische FTP-Clients.
REST steht für REpresentational State Transfer und bezeichnet einen Architekturstil (oder auch ein »Programmierparadigma für verteilte Systeme«, siehe dazu auch de.wikipedia.org/wiki/Representational_State_Transfer), der bereits häufig benutzte Techniken und Protokolle zusammenfasst und für die Datenübertragung nutzt. Dies umfasst:
URI für die Adressierung von Ressourcen
HTTP für Übertragung von Kommandos
MIME für die Codierung der Ressourcen
JSON oder XML für die Formatierung
REST ist eine spezielle Form eines Webdiensts (Webservice). Man spricht deshalb auch von einem REST-Dienst.
Die technischen Merkmale eines REST-Diensts sind:
Adressierbarkeit
Repräsentationsvariabilität
Zustandslosigkeit
Skalierbarkeit
Allgemeingültigkeit
Erweiterbarkeit
Jeder REST-konforme Dienst hat eine eindeutige Adresse, den Uniform Resource Locator (URL). Zusätzlich zum URL, der den Dienst selbst adressiert, verwendet REST auch Uniform Resource Identifier (URI), um einzelne Ressourcen zu bezeichnen.
Die unter einer Adresse zugänglichen Dienste können unterschiedliche Darstellungsformen (Repräsentationen) haben. Ein REST-konformer Server kann beispielsweise HTML, JSON oder XML liefern. Dies können Daten oder Beschreibungen von Daten sein (Metadaten).
Jede REST-Nachricht enthält alle Informationen, die für den Server beziehungsweise Client notwendig sind, um die Nachricht zu verstehen. Weder der Server noch die Anwendung soll Zustandsinformationen zwischen zwei Nachrichten speichern. Man spricht daher von einem zustandslosen (stateless) Protokoll. Jede Anfrage eines Clients beinhaltet sämtliche Informationen über den Anwendungszustand, die vom Server benötigt werden.
Die Zustandslosigkeit begünstigt die Skalierbarkeit eines Diensts. Da jede Anfrage zu einer definierten Reaktion führt und keine Voraussetzungen auf einer bestimmten Maschine vorhanden sein müssen, können Lastverteiler Anfragen auf mehrere Maschinen verteilen, ohne dass dies Änderungen an der serverseitigen Verarbeitung nach sich zieht.
HTTP schreibt vor, dass GET »sicher« (safe) sein muss. Dies bedeutet, dass diese Methode nur Informationen beschafft und keine Nebeneffekte hat. Die Methoden GET, HEAD, PUT und DELETE müssen idempotent (nebeneffektfrei) sein, was bedeutet, dass sich das mehrfache Absenden der gleichen Anforderung nicht anders auswirkt als ein einzelner Aufruf.
Erweiterbarkeit heißt, dass sich später erfolgende Erweiterungen der Ressourcenbasis, zusätzliche Funktionen, mehr Daten, anderen Repräsentationen oder Skalierungsmaßnahmen nicht auf die bestehenden Clients auswirken dürfen.
Ein Merkmal von REST ist die Beschreibung von Ressourcen. Dazu gehören Links zu weiterführenden Elementen. Bestehen zwischen Daten Beziehungen, so ist dies in der Antwort zu erkennen. Eine einfache Abfrage nutzt das Kommando GET, also zum Beispiel GET /book/2605.
1 HTTP/1.1 200 OK Content-Type: text/xml
2 <?xml version="1.0"?>
3 <book xmlns:xlink="http://www.w3.org/1999/xlink">
4 <cat xlink:href="http://shop.meinefirma.de/cat/122">122</cat>
5 <author xlink:href="http://shop.meinefirma.de/author/1">1</author>
6 <author xlink:href="http://shop.meinefirma.de/author/2">2</author>
7 <title>JADE</title>
8 <desc>Die Template-Engine JADE</desc>
9 <price>2,99</price>
10 <type>Paperback</type>
11 </book>
Hier verweisen die URIs einiger Elemente auf abhängige Ressourcen. Der Client kann dies nutzen, um einen Teil der Benutzeroberfläche dynamisch zu erstellen.
URI steht für Uniform Resource Identifier und ist das Verfahren zum Konstruieren der Adressen. Im Zusammenhang mit REST ist oft der Begriff RESTful zu sehen. Es ist wichtig zu verstehen, dass damit die korrekte Implementierung von REST gemeint ist. Das heißt nicht, dass lediglich HTTP benutzt wird, sondern auch, dass die Routen, die zum Abruf von Daten und zum Auslösen von Aktionen benutzt werden, bestimmten Kriterien folgen.
URI wird oft mit URL (Uniform Resource Locater) verwechselt. URL ist eine Spezialform des URI. URLs dienen der Adressierung von Webseiten im Browser. URIs können dies und noch anderes adressieren. In URLs werden zum Anhängen von Daten Parameter benutzt, die durch ein ?-Zeichen abgetrennt sind. Diesen Teil nennt man Querystring. Folgendes sind typische Anwendungsfälle:
/admin/updatebook.aspx?book=2605
/bookview.html?book=2605
/bookreviews.py?book=2605
Der Teil book=2605 ist der Querystring. Dies ist nicht RESTful. RESTful verlangt, dass der Datenteil als Teil des URL erfasst wird. Routen – das sind Adressierungsschemata auf Basis von URIs – haben definierte Abschnitte, denen eine Bedeutung zugewiesen wird. Diese Zuweisung ist willkürlich (Sache des Entwicklers), läuft aber häufig nach einem einfachen Prinzip:
/ressource/id
Oder etwas komplexer:
/ressource/id/aktion
RESTful würden die Beispiele oben wie folgt aussehen:
/admin/book/2605
/book/2605
/book/2605/view
Freilich sind hier immer noch viele Optionen vorhanden. Deshalb ein paar Regeln:
Kurz
: Je kürzer die URI, desto besser.
Baumstruktur:
Die URI sollte die Baumstruktur des Objekt-/Datengraphen repräsentieren.
Lesbar:
Klartext hilft anderen, die Route intuitiv zu verstehen.
Voraussagbar:
Die Reaktion des Servers entspricht der Intuition beim Lesen des URI.
Substantive und Verben:
URIs adressieren
etwas
, also ist das Wort eine Sache, keine Aktion. Dazu nutzt man ein Substantiv. Wird eine Aktion gebraucht, hängt diese hinten dran, idealerweise dann als Verb.
QueryString I:
Ja, darf man benutzen, aber nur für genau dies:
query
(engl. abfragen/suchen), beispielsweise:
/books/search?filter=title&value=JADE
.
QueryString II:
Nein, nicht zu benutzten, wenn Parameter benötigt werden. Dann schreibt man beispielsweise Folgendes:
/books/select/quarter=2;year=2016
.
Deterministisch:
Die gleiche URI ergibt immer dieselbe Ressource.
Statuslos:
Kein Zustand auf dem Server hat Einfluss auf die Reaktion.
Kanonisch:
Wenn zwei URIs zur selben Ressource führen, muss die Alternative in der Antwort benannt werden.
Weniger wichtig, aber für guten Stil sinnvoll, sind folgende Regeln:
Nur Kleinschreibung benutzen:
Camel-Case und Ähnliches ist hier eher störend.
Bindestriche statt Unterstriche:
book-review
ist besser als
book_review
für Suchmaschinen.
Plural nutzen, wenn es der Kontext erwartet:
books
, wenn es sich um mehrere handelt.
Wenn Abrufe aus Kollektionen (Listen) erfolgen, sollte dies sichtbar sein:
/books/book/3
. Dann muss aber der Abruf
/books
technisch möglich sein und alle Bücher liefern. Wenn aber die Kollektion nicht geliefert werden kann, reicht
/book/3
.
Keine Leerzeichen verwenden:
%20-Fragmente machen URLs unübersichtlich.
In REST werden spezifische HTTP-Methoden benutzt, um Aktionen auf dem Server auszulösen. Konkret eingesetzt werden:
GET:
Abrufen einer Ressource
POST:
Ändern oder Auslösen einer Aktion
PUT:
Erzeugen einer Ressource
DELETE:
Löschen einer Ressource
PATCH:
Ändern eines Teils einer Ressource
HEAD:
Metadaten anfordern
OPTIONS:
Erlaubte Aktionen auf einer Ressource
Es ist nicht zwingend notwendig, dies mit SQL zu vergleichen, ein einfaches Mapping kann REST aber durchaus darstellen:
Tabelle 1-3: Mapping von REST auf SQL
HTTP (REST)
SQL
GET
SELECT
POST
INSERT
PUT
UPDATE
DELETE
DELETE
In HTTP sieht das beispielhaft folgendermaßen aus (… steht für typische Kopffelder):
1 POST /basket/2605
2 ...
3 name=Neuer Artikelname
Hierbei ist die URI ein relativer Pfad zur Ressource. basket bezeichnet die Route zu einem Controller, der sich um den Warenkorb kümmert. Die Route erwartet eine ID, die hier 2605 enthält. Damit ist im Warenkorb ein Element mit dem Primärschlüssel 2605 gemeint. Dieses Element hat eine Eigenschaft name, der der neue Text »Neuer Artikelname» zugewiesen wird.
Mittels PUT wird eine Ressource wie folgt geändert:
1 PUT /basket
2
3 <book>
4 <title>Pug</title>
5 <desc>
6 Die Template-Engine Pug
7 </desc>
8 <price>2,99</price>
9 <type>Paperback</type>
10 </book>
Da eines der Merkmale von REST die Selbstbeschreibung ist, gibt PUT einen Link zur geänderten Ressource zurück:
1 HTTP/1.1 201 OK
2 Content-Type: text/xml;
3 Content-Length: 34
4
5 http://shop.meinefirma.de/basket/2605
Das Löschen der Ressource erfolgt ähnlich:
1 DELETE /basket/2605
MIME steht für Multipurpose Internet Mail Extensions und wurde ursprünglich dazu entwickelt, Dokumente in E-Mails einzubetten. Dabei wird eine beschreibende Kopfzeile (Header) benutzt, um das ursprüngliche Format anzuzeigen. Der Client kann dies dann wiederherstellen. Typisch ist die Zweiteilung des Formats und die Benutzung der Kopfzeile Content-Type:
gruppe/detail
Für ein Bild sieht das nun folgendermaßen aus:
Content-Type: image/jpeg
Eine genaue Beschreibung, die über das hier für REST benötigte hinausgeht, finden Sie unter de.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions.
Für REST wird Folgendes benutzt:
text/xml
application/json
In REST wird zur Kommunikation zwischen Client und Server meist JSON eingesetzt. JSON (JavaScript Object Notation) ist ein kompaktes Format in lesbarer Textform zum Zweck des Datenaustauschs zwischen Anwendungen. Obwohl der Name auf eine alleinige Verwendung in JavaScript hindeutet, ist JSON ein unabhängiges Format, das theoretisch in jeder Programmierumgebung eingesetzt werden kann.
Der am meisten betonte Unterschied von JSON zu XML ist die etwas kompaktere Codierung von Datenstrukturen, wodurch im Unterschied zu XML weniger Verwaltungsdaten produziert werden. Außerdem kann JSON beispielsweise in JavaScript direkt in ein JavaScript-Objekt umgesetzt werden. XML ist hingegen vielseitiger als JSON einsetzbar, das keine Auszeichnungssprache, sondern nur ein Datenaustauschformat ist. XML genießt weiterhin eine weite Verbreitung. Beide Formate sind nicht unbedingt zum Repräsentieren von großen Binärdaten geeignet.
JSON kennt Objekte, Arrays, Zeichenketten, Zahlen, boolesche Werte und null. Daten können beliebig verschachtelt werden, beispielsweise ist ein Array von Objekten möglich. Als Zeichencodierung benutzt JSON UTF-8.
Ein Objekt wird mit geschweiften Klammern umschlossen { }. Es kann eine durch Kommata geteilte, ungeordnete Liste von Eigenschaften enthalten.
JSON darf keine Kommentare enthalten, wie sie beispielsweise in JavaScript erlaubt wären.
Eine Eigenschaft besteht aus einem Schlüssel und einem Wert, getrennt durch einen Doppelpunkt. Der Schlüssel ist eine Zeichenkette. Der Wert ist ein Objekt, ein Array, eine Zeichenkette, eine Zahl oder einer der Ausdrücke true, false oder null. Ein Array beginnt und endet mit eckigen Klammern [ ]. Es kann eine durch Kommata geteilte, geordnete Liste von Werten enthalten. Eine Zeichenkette beginnt und endet mit Anführungszeichen ("). Sie kann Unicode-Zeichen und Escape-Sequenzen enthalten. Ein boolescher Wert wird durch die Ausdrücke true beziehungsweise false dargestellt – ohne Anführungszeichen. Eine Zahl ist eine Folge der Ziffern 0−9. Diese Folge kann durch ein negatives Vorzeichen eingeleitet und durch einen Dezimalpunkt unterbrochen sein. Die Zahl kann durch die Angabe eines Exponenten e oder E ergänzt werden, dem ein Vorzeichen »+« oder »–« und eine Folge der Ziffern 0–9 folgt. Leerraumzeichen sind beliebig verwendbar.
Listing 1-3: Beispiel eines JSON-Blocks
1 {
2 "CreditCard" : "Visa",
3 "Number" : "1234-5678-9012-3456",
4 "Owner" :
5 {
6 "LastName" : "Krause",
7 "Firstname" : "Jörg",
8 "Gender" : "\"male\"",
9 "Preferences" : [
10 "Golf",
11 "Reading",
12 "Badminton"
13 ],
14 "Age" : null
15 },
16 "Deckung" : 10000,
17 "Währung" : "EURO"
18 }
Wenn Sie mehr über JSON lesen möchten, könnten folgende Quellen interessant sein:
json.org
bietet eine deutsche Einführung auf der offiziellen JSON-Seite.
Die RFC 4627 definiert mit
application/json
einen weiteren MIME-Typ.
ATOM steht für Atom Syndication Format, ein plattformunabhängiges Format zum Austausch von Feeds. Es hat damit denselben Zweck wie das bekanntere RSS, das in der neuesten Version 2.0 für Really Simple Syndication steht. ATOM gilt als designierter Nachfolger von RSS 2.0. ATOM selbst ist für verschiedene Zwecke definiert, wobei hier auf ASF (ATOM Syndication Format) Bezug genommen wird. Neben der reinen Feed-Verteilung kann ATOM für Newsletter und ähnliche Zwecke eingesetzt werden. ATOM wurde in der RFC 4278 veröffentlicht. Der MIME-Typ ist application/atom+xml.
Listing 1-4: Typischer ATOM-Block
1 <?xml version="1.0" encoding="utf-8"?>
2 <feed xmlns="http://www.w3.org/2005/Atom">
3 <author>
4 <name>Jörg Krause</name>
5 </author>
6 <id>urn:uuid:60a76c80-9926-9905-1964-0003939e0af6</id>
7
8 <entry>
9 <title>Neues aus der Webwelt</title>
10 <link href="http://hanser.de/2010/08/08/atom-wcf"/>
11 <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-01723243189a</id>
12 <updated>2016-12-08T12:50:07Z</updated>
13 <summary>Alles über Web</summary>
14 <content>Hier steht der gesamte Text</content>
15 </entry>
16 </feed>
In Webanwendungen wird man ATOM nur einsetzen, wenn Clients dies explizit fordern. Der Einsatz von JSON ist deutlich einfacher und schneller.
REST ist für kleine und mittlere Umgebungen perfekt. Es ist ausreichend, wenn die Komplexität der Abfragen überschaubar ist. Da jedoch alles eine Ressource ist, wird es mit zunehmender Anzahl dieser Ressourcen schnell unübersichtlich. An dieser Stelle sind komplexere Abfragesprachen gefragt, die Mehrfachzugriffe und Abhängigkeiten durch entsprechende Syntaxkonstrukte vereinfachen.
Etabliert haben sich hier zwei Standards:
GraphQL (siehe
graphql.org
)
Open Data Protocol (OData) (siehe
www.odata.org
)
GraphQL basiert auf JSON-Paketen, in denen eine Abfrage formuliert wird. Entsprechend muss fast immer mit POST gearbeitet werden, weil auch bei Abfragen Daten zum Server übermittelt werden. GraphQL erlaubt komplexe Konstrukte und erfordert eine explizite serverseitige Unterstützung. GraphQL ist sehr auf die Webwelt zugeschnitten und hat in reinen Webapplikationen Vorteile.
OData ist dagegen bei Abfragen URL-basiert und kann GET benutzen. Die Abfragen sind einfacher, vielfältige Filter sind aber auch hier möglich. OData ist breiter aufgestellt, wenn es um Umgebungen außerhalb der Webwelt geht.
Eine Single Page Application (SPA) (alias Single Page Web Application) ist eine Webanwendung, die keinen Seitenwechsel (Roundtrip) durchführt, sondern die Anzeige nur durch Austausch von Seitenelementen via JavaScript/DOM verändert. Es gibt dabei also keine serverseitige Seitennavigation. Die URL ändert sich nicht. Initial wird eine komplette HTML-Seite oder zumindest das Grundgerüst einer Webseite in einem HTML-Dokument von dem Server geladen. Die Seite lädt anschließend Daten über Webservices (meist REST-basierte Dienste, alias Web APIs) nach und erzeugt die Darstellung clientseitig (clientseitiges Rendern). Eine SPA wirkt damit wie eine Desktop-Anwendung.
Abbildung 1-2: Klassisches serverseitiges Rendering vs. clientseitiges Rendering moderner Webanwendungen
Basis für Single Page Applications (SPAs) ist die Technologie Asynchronous JavaScript and XML (AJAX), die abseits der üblichen HTTP-Rundgänge (Roundtrips) Aufrufe des Webservers vom Browser ermöglicht. Der Browser löst einen AJAX-Aufruf aus gegen eine HTTP-URL. Von der URL erhält er Daten, die er zur Aktualisierung der Webseite per Document Object Model (DOM) verwendet. AJAX-Aufrufe transportieren heutzutage aber meist nicht mehr XML-Dokumente, sondern JSON-Daten.
Der Begriff AJAX wurde erstmals im Februar 2005 von Jesse James Garrett verwendet (siehe adaptivepath.org/ideas/ajax-new-approach-web-applications). Wirklich neu an AJAX war aber nur der Name; die Idee des entfernten Prozeduraufrufs aus dem Browser heraus wurde erstmals im Jahr 1998 von Microsoft im Internet Explorer 4.0 in Form des Microsoft Remote Scripting (MSRS) verwendet. MSRS basierte auf einem Java Applet. Im Internet Explorer 5.0 ist später das XmlHttpRequest-Objekt erschienen, das noch heute Basis in dieser Form im Internet Explorer und anderen Browsern existiert und jetzt den Kern von AJAX bildet. Moderne Browser verwenden aber nicht mehr das XmlHttpRequest-Objekt, sondern das Fetch API (fetch.spec.whatwg.org).
In der Regel wird weder das XmlHttpRequest-Objekt noch das Fetch API direkt verwendet, sondern Webentwickler setzen Frameworks ein, die davon abstrahieren (zum Beispiel Angular oder React).
Responsive Web Design (Aliase: Reactive Design, Adaptive Design, Receptive Design) bezeichnet ein Konzept im Rahmen der Gestaltung von Webseiten, das ein komfortables Lesen der Webseiten auf jeder Bildschirmgröße (auch kleinen Smartphones) ohne Scrolling erlaubt. Responsive Web Design realisiert man mit Box- beziehungsweise Flexbox-Modell in Cascading Style Sheets (CSS) direkt oder oft leichter mit darauf aufbauenden Frameworks wie Bootstrap.
Die folgenden drei Bildschirmabbildungen zeigen Responsive Web Design von drei verschiedenen Bildschirmgrößen: Bei großem Bildschirm sieht man alle drei Spalten. Bei mittlerem Bildschirm verschwindet die erste Spalte, und es erscheint ein Pfeil, um zurück zur Ansicht der Kategorien zu kommen. Bei sehr kleinem Bildschirm sieht man schließlich nur noch eine Spalte mit Pfeil.
Abbildung 1-3: Responsive Web Design bei großem Bildschirm
Abbildung 1-4: Responsive Web Design bei mittelgroßem Bildschirm
Abbildung 1-5: Responsive Web Design bei sehr kleinem Bildschirm
Die Grundlage jeder HTML-Seite ist die Beschreibungssprache HTML – die HyperText Markup Language. Sie dient der Strukturierung der Seiten. In der aktuellen Version 5 ist außerdem der Zugriff auf das hierarchische Objektmodell der Seite geregelt, also die Zugriffe via JavaScript. CSS – Cascading Style Sheets – dienen der Gestaltung und grafischen Aufbereitung der Inhalte. CSS wird im nächsten Kapitel behandelt.
Beide Sprachen sind sehr alt und genügen heutigen Anforderungen nur unzureichend. HTML5 ist deshalb zu einem Konvolut verschiedener Standards geworden, die alle Arten von Funktionen ergänzen. Eine Übersicht wird in diesem Kapitel beschrieben. Außerdem haben sich verschiedene Template-Systeme etabliert, die die Nachteile von HTML auszugleichen versuchen. So versucht Angular nach Intention der Entwickler so etwas wie eine dynamische Erweiterung zu sein, wie sie aussehen würde, wenn sie zusammen mit HTML erfunden worden wäre.
Auch CSS ist nicht mehr sehr neu. Hier stellen komplexere Style-Systeme hohe Anforderungen. Darauf gibt es zwei Antworten. Zum einen entwickeln sich Präprozessoren wie LESS oder SASS, die dynamisches CSS definieren und dann für den Browser aufbereitet werden. Zum anderen entstehen kompexe CSS-Frameworks wie beispielsweise Bootstrap.
In diesem Abschnitt geht es um die Grundlagen zu HTML und einen sehr kurzen geschichtlichen Überblick.
Der Standard HTML ist eine Kooperation von W3C (World Wide Web Consortium) und WHATWG (Web Hypertext Application Technology Working Group). Die Prinzipien der Arbeitsgruppen sind:
Standard ist HTML + CSS + DOM + JavaScript
Keine Plug-ins (kein Java, kein Flash, kein Silverlight etc.!)
Mehr Markup; »unobtrusive«, weniger direktes Scripting
Geräteunabhängig
Eigene Implementierungen sollten diesen Prinzipien folgen!
Abbildung 2-1: Das offizielle HTML5-Logo
Tabelle 2-1: Geschichte der HTML-Versionen
Version
Jahr
HTML
1991
HTML+
1993
HTML2
1995
HTML3.2
1997
HTML4.01
1999
XHTML1.1
2001
WHATWG
2004
WHATWG und W3C Kooperation
2006
HTML5
2012
XHTML5
2013
HTML5.1
2016
HTML5.2
2017
HTML5.3
in Arbeit
Auch wenn das Thema dieses Kapitels HTML ist, sollten Sie sich über den grundsätzlichen Aufbau eines XML-Dokuments (Extensible Markup Language) im Klaren sein. Beide Standards gehen auf denselben Stamm zurück und sind sogenannte Markup-Sprachen – Markup Languages. Dieser Begriff ist für das »ML« in den Namen verantwortlich. Im Gegensatz zu Programmiersprachen dienen Markup-Sprachen dazu, Inhalte zu beschreiben. An dieser Stelle werden nur die notwendigsten Eigenschaften vermittelt.
Als Markup bezeichnet man alle Zeichengruppen, die eine Struktur in XML definieren:
Start-Tags:
<startTag>
End-Tags:
</endTag>
Leerelemente:
<Leerelement />
Entitätsreferenzen:
&
Zeichenreferenzen:
&x0f;
Kommentare:
<!-- Kommentar -->
CDATA-Bereichsbegrenzer:
<![CDATA[ kein XML ]]>
Dokumententypdeklarationen:
<!DOCTYPE HTML>
Verarbeitungsanweisungen:
<? include ("datei.php") ?>
Die XML-Deklaration:
<?xml version="1.0"?>
Textdeklarationen:
<?xml encoding="utf-8" ?>
Alles andere ist Text. Dabei sind drei Sonderzeichen zu beachten, die das oben genannten Markup steuern:
> steht für
<
< steht für
>
& steht für
&
Für Attributwerte, die Anführungszeichen enthalten, kommen noch zwei Entitäten hinzu:
" steht für
"
' steht für
'
Eine Besonderheit stellen CDATA-Bereiche dar. In diesen sind die üblichen Regeln außer Kraft gesetzt, und eine Codierung der speziellen Zeichen muss nicht stattfinden:
<![CDATA[ hier & hier ist "kein" <XML> ]]>
XML-Dokumente gehorchen in ihrem Aufbau festen Regeln. Erst durch diese Regeln kann eine automatisierte Verarbeitung in derart umfassender Form stattfinden, wie sie erforderlich ist. Auf der anderen Seite sollte der Einsatz so universell wie möglich sein, wie der Name »eXtensible Markup Language« suggeriert.
Die Regeln erlauben die Prüfung der Wohlgeformtheit von Dokumenten durch das verarbeitende Programm ohne Kenntnis der Grammatik der von Ihnen konkret eingesetzten Sprache. Der Begriff Wohlgeformtheit, im englischen »well formed« genannt, ist ein Basismerkmal von Markup-Sprachen. Als wohlgeformt gilt ein Dokument, wenn folgende Merkmale zutreffen:
1. Alle Tags sind syntaktisch korrekt. Dazu gehört, dass Anfangs- und Endtag übereinstimmen, wobei Groß- und Kleinschreibung zu beachten ist (
<tag></Tag>
wäre unzulässig). Zu jedem öffnenden Tag muss ein schließendes existieren (
<tag></tag>
). Alternativ kann ein Tag direkt geschlossen werden (
<tag/>
).
2. Alle Attribute sind syntaktisch korrekt. Parameter der Attribute müssen immer in Anführungszeichen stehen (
<tag attr="param">