uio--WebPageMain-Module

JAVA-C3 Network-Programming Network Basics Grundlagen TCP UDP Datagram IP-Adressen Port listen DNS Domain-Name DNS A- und AAAA-Records CNAME-Record Reverse-DNS / PTR-Record TTL Windows: DNS und Host Windows: Firewalls und Ports HTTPS.SYS Nginx als Reverse-Proxy Binding Lokale Netzwerke und NET URI scheme host port path/file Query Fragment / Anchor (01) Hierarchischer URI (02) Opaque URI (03) URI mit Sonderzeichen (04) Normalisierung von URI (04) Normalisierung von URI Prüfen auf Gleichheit a.compare(b) a.equals(b) (05) Relative in absolute URIs übersetzen URL Encoding/Decoding URL-Encoding ASCII Unicode Codepage UTF-8 UTF-16 UTF-32 ISO-8859-1 UTF-32 URLDecoder StandardChartsets.UTF_8

Blocking-I/O Non-Blocking-I/O

network-java-sockets @! network-java-nio FEHLT

Client-Server mit Sockets Unabhängige Java-Programme in Kommunikation über Sockets Client Server @! com.stuelken.java.c1.networking.basics.sockets Version prüfen! @! com.stuelken.java.***.a7.e50200_clientserver_keyvalue.client KeyValueClientResilient class @! Das müssten 3 verschiedene Beispiele/Pages sein! @! Erfordert com.stuelken..ArgumentInterpreter! @! Sprungmarken für Client, Server, .. ergänzen

Overview

Network | java.net.URI

In diesem Themenblock gehen wir auf die Bedeutung von URI für Webadressen, Files, den Sonderfall von data-URIs, das entsprechende Arbeiten mit java.net.uri, eine Reihe von Begriffen wie Scheme, Fragment, Query, Authority sowie die Konvertierung von relativen in absolute URIs ein.

Mit praktischen Code-Beispielen zeigen wir neben des Parsens von Strings in URIs auch einen Ansatz, wie mitunter Text- und andere Daten-Files als Teil eines Java-Programms im Package über Data-URIs gespeichert werden können.

Syntax

Network | URI Syntax

Das Literal, welches als Zeichenfolge einen URI definiert, hat eine klar bestimmte Syntax. Die Syntax von URIs ist unabhängig von Java und gilt damit weltweit im Internet und damit auch in anderen Programmiersprachen. Die Begrifflichkeiten in Java weichen allerdings zuweilen etwas ab.

http://example.com:80/de/buch/abschnitt/kapitel/seite.html#zusammenfassung

Hierarchische UR

URIExample01 URIs erzeugen und verarbeiten

Die in diesem Beispiel programmierte Klasse deckt mit mehreren Methoden eine Reihe von typischen Verfahren ab, wie man mit URIs arbeiten kann.

https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview

Beispiel

Das nachfolgende Programm wertet den folgenden URI aus. Dieser beinhaltet einen typischen URI mit dessen Hilfe man eine Webseite adressieren und innerhalb dieser an die Position #overview springen kann.

https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * 
 * @author t2m
 */
public class URIExample01 {

	/**
	 * Eine hierarchische Struktur von {@link URI} kennen wir von Internetseiten und Webseiten.
	 * 
	 * {@code https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview}
	 * 
	 * @throws URISyntaxException
	 * 
	 */
	public static void hiearchicalURI() throws URISyntaxException {

		System.out.println("(1) Hierarchische URIs interpretieren\n");

		URI uri = new URI("https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview");

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //
		
		System.out.println("getAuthority() : " + uri.getAuthority()); //
		
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //

		System.out.println();

	}
	
	public static void main(String[] args) throws URISyntaxException {
		hiearchicalURI(); // 1
	}
	

}


 
(1) Hierarchische URIs interpretieren

toASCIIString() : https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview
getScheme() : https
getHost() : example.com
getPort() : 443
getPath() : /de/buch/abschnitt/kapitel/seite04
getQuery() : lang=de
getFragment() : overview
getAuthority() : example.com:443
getSchemeSpecificPart() : //example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de

Erläuterungen

Scheme oder Protocol

Der erste Bestandteil eines URI, «Uniform Ressource Locator(s)», ist das Schema beziehungweise das Protokoll.

http, https, ftp, sftp, telnet, mailto, tel


 
http://example.com Webseiten
https://example.com Webseiten, SSL
ftp://example.com File Transfer
ftps://example.com File Transfer, SSL

mailto:a@example.com E-Mail-Adresse
tel:+49123456789 Telefonnummer

...

Über die bekannten Schemata und Protokolle hinaus kann man als Entwickler auch ein eigenes Schema schaffen.

Host, IP, Domain

Der zweite Bestandteil eines URI beinhaltet den sogenannten Host. Der Wert ist ein String-Literal in Form einer IP-Adresse oder aber eines Domainnamens.


 
example.com
www.example.com
localhost

127.0.0.1
0.0.0.0

Die eigentliche Auflösung von Domain-Namen in IP-Adressen wurde im Themenblock DNS erläutert.

Port

Der dritte Bestandteil eines URI ist der Port. Da viele Ports sich aus dem Schema bzw. Protokoll ergeben, fehlt dieser Wert oftmals.

Der Port für HTTP ist gewohnt 80, der für HTTPS ist 443. Man kann bei der Adressierung also für HTTP und HTTPS die Ports im URI weglassen, wenn es sich um die typischen Adressen handelt.

Im Zuge der Programmierung von Services ist es allerdings so, dass man mehrere über HTTP oder HTTPS basierende Services hat, so dass man hierfür auch verschiedene Ports wird angeben müssen.


 
:443


http://example.com:80 
https://example.com:443 

http://example.com:8080
http://localhost:6000

Für HTTPS brauchen wir den Port 443 nicht angeben, der wird automatisch angenommen. Dsa gilt auch für HTTP mit Port 80 und ein paar weitere Standardports für FTP, FTPS udn dergleichen.

Haben Anwendungen eigene Ports, sind die Ports zwingend mit anzugeben.

Path und/oder File

Der vierte Teil eines URI ist der URI-Pfad bzw. eine Sequenz aus Pfad-Segmenten wie beispielsweise /de/buch/abschnitt/kapitel/seite.html.

Üblicherweise ist es so, dass man den letzten Bestandteil, nach welchem kein / mehr folgt, oftmals als «File» bzw. Dateiname interpretiert, was in früheren Zeiten zu Beginn des Internets dann seite.html hätte sein können.


 
de/buch/abschnitt/kapitel/seite.html

Pfade und File-Bezeichnungen in einem URI sind case-sensitive bei Browsern, dh. ein typisches Beispiel ist das Problem, wie man im Web eine Ressource für die Erläuterung einer Abkürzung wie URI beschreibt: uri.html wäre die typische Kleinschreibung, was es Anwendern erleichtert; URI.html aber wäre die besser lesbar.

Da die Verarbeitung von Requests an einen Server dem jeweiligen Service obliegt, kann es ich bei der Adressierung über einen Pfad durchaus zuweilen um Ordner auf dem Server handeln, muss es aber nicht: So kann beispielsweise im Beispiel das erste Pfadsegmente /de als Sprachauswahl interpretiert werden, so dass der eigentliche Pfad möglicherweise erst mit /buch/.. beginnt.

Query

Der fünfte Teil ist das Query. Hierbei handelt es sich um Parameter, welche zusätzlich als Teil des URI übergeben wurden, auch mitunter bei HTTP als HTTP GET-Parameter bezeichnet.

Gefolgt von ? können Key-Value-Paare wie ?a=10 folgen, wobei als Separator für weitere Paare dann das & Zeichen verwendet wird.

?a=10&b=20&c=30 sind also 3 Paare.


 
?lang=de Beispiel für Sprachauswahl
?a=10&b=20&c=30 Beispiel für Werte
?lat=...&lng=.... Beispiel für Koordinaten

Das Primärziel besteht hierbei darin, dass man für eine adressierte Ressource zusätzliche Werte mit übergeben kann. Wie der Empfängerserver darauf reagieren wird entscheidet dessen Entwickler.

Parameter sind URL-kodiert oder engl. urlencoded zu übertragen.

Sprungmarken als Anchor in Dokumenten

Der sechste Teil bei java.util.URI ist der Fragment Parameter, zuweilen auch als Anchor bezeichnet.

Das Fragment beginnt ab dem # Hashtag zeigen und könnte beispielsweise #sprungmarke heißen. Im Falle von webbasierten Frontends im HTML Code ist es über diese Adressierung möglich, eine Stelle im HTML Code anzuspringen, sofern diese eine entsprechende ID bekommen hat.


 
#sprungmarke
#zusammenfassung
#top

Host und Port

Der authority-Wert bündelt als Literal den Host mit dem Port als host:port, wobei der host-Wert dann eine IP oder ein Domain-Name und der Port ein Zahlenwert zwischen 0 und grob 65000 ist.

Zusammenfassung

Das Prinzip dieser Bezeichnungen ist bei diversen Java-Klassen wie URI, URL, File etc. ähnlich.

Für einige Schema gibt es wie für z. B. für HTTP ein bestimmtes Protokoll, dh. Datenpakete haben eines bestimmte Standard-Struktur.

Der Port darf fehlen, wenn er dem Standardport für ein Schema entspricht.

Path und File: Diese Angaben sind case-sensitive.

Fragment und Anchor: Auch diese Angaben sind case-sensitive.

Opaque URI

Network | URIExample02

Über die hierarchischen URIs hinaus gibt es auch sogenannte (engl.) Opaque URI wie mailto:a@example.com oder tel:+49123456789 im Falle von E-Mail und Telefon. Es gibt aber noch mehr.

Beispiel



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * Beispiele für Opaque URIs.
 * 
 * Ein URI ist dann "opaque" wenn er NICHT mit einem / beginnt. 
 * 
 * @author t2m
 */
public class URIExample02 {

	public static void main(String[] args) throws URISyntaxException {
		opaqueURI();
	}

	/**
	 * @throws URISyntaxException
	 * 
	 */
	public static void opaqueURI() throws URISyntaxException {
		System.out.println("(2) Opaque URI wie mailto:\n");

		URI uri = new URI("mailto:dev@beispiel.com");
		
		System.out.println("uri.isOpaque() : " + uri.isOpaque()); //
		
		
		

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}

}

 
(2) Opaque URI wie mailto:

uri.isOpaque() : true
toASCIIString() : mailto:dev@beispiel.com
getScheme() : mailto
getSchemeSpecificPart() : dev@beispiel.com
getHost() : null
getPort() : -1
getPath() : null
getQuery() : null
getFragment() : null

Erläuterungen

Den eigentlichen Wert ermitteln

Da das Scheme nur das Schema bietet, es aber hierbei keinen Pfad gibt, kann man nur mit Hilfe von getSchemeSpecificPart() auf beispielsweise die Mail-Adresse, Telefon-Nummer etc. zugreifen.


Hinweis: Dieses Prinzip macht es für Spammer sehr, sehr leicht, Webseiten im Internet nach Telefonnummern und E-Mail-Adressen zu durchforsten.

Das Mappen auf einen anderen Typ

Erzeugt wird hier eine zweite Collection für Integer-Werte, dh. für jedes Element im Stream wird automatisch ein Element im zweiten Stream angelegt.

Die Besonderheit hierbei besteht darin, dass die Runtime selbst entscheidet, in welcher Reihenfolge die Elemente verarbeitet werden.

Wenn vermutlich ein double-Wert kommen wird

Die average() Methode von IntStream ist eine Aggregate-Operation und sorgt dafür, dass wir letztendlich unsere Collection, die wir da im Stream verarbeiten, schlussendlich wieder auf einen einzigen Wert zusammenfassen können.

Nun kann es aber passieren, dass die Collection keinen einzigen Wert hat; wir wissen also nicht, ob ein double-Wert herauskommt oder doch eher gar nichts. Hierfür ist OptionalDouble gedacht.

JAVADOC, Eclipse

Diese Anweisung dient nur der Formatierung des Quellcodes in Eclipse.

Zusammenfassung

Um auf den eigentlichen Wert eines Opaque URI gelangen zu können, wird in Java die getSchemeSpecificPart() Methode verwendet.

URIs mit Sonderzeichen 03

URIExample03

Die Syntax von URIs basiert üblicherweise auf dem ASCII Zeichensatz, wobei auch bei diesen Zeichen einige Zeichen von Beginn an URL-kodiert werden müssen. Typische Fälle für diese Problemstellung sind das Leerzeichen sowie das + und & Zeichen beispielsweise in Namen.

Die URI Klasse ist in der Lage, diese URIs dennoch korrekt zu verarbeiten. Um aber dennoch später an den eigentlichen ASCII Code des URI zu kommen, gilt es die entsprechende Methode zu kennen.

Beispiel



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * Beispiel mit URI welche Sonderzeichen beinhalten. 
 * 
 * @author t2m
 */
public class URIExample03 {

	/**
	 * Pfade mit Sonderzeichen wie Leerzeichen
	 * 
	 * @throws URISyntaxException
	 */
	public static void rawAskii() throws URISyntaxException {
		System.out.println("(3) Reagieren auf Sonderzeichen\n");

		// Ein String für den URI mit Sonderzeichen
		String uriString = "/pfad mit leerzeichen + sonderzeichen.doc/";
		URI uri = new URI("http", "host", uriString, null);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}

	/**
	 * Durchführung {@link URIExample03}
	 * 
	 * @param args Keine Argumente
	 * @throws URISyntaxException Im Falle von URI-Syntax-Fehlern
	 */
	public static void main(String[] args) throws URISyntaxException {
		rawAskii(); // 3
	}

}


 

//@formatter:off
/*
(3) Reagieren auf Sonderzeichen

uriString : /pfad mit leerzeichen + sonderzeichen /
toASCIIString() : http://host/pfad%20mit%20leerzeichen%20+%20sonderzeichen%20/
getScheme() : http
getSchemeSpecificPart() : //host/pfad mit leerzeichen + sonderzeichen /
getHost() : host
getPort() : -1
getPath() : /pfad mit leerzeichen + sonderzeichen /
getQuery() : null
getFragment() : null
*/

//@formatter:on

Erläuterungen

URL-kodierte UTF-8 Unicode Darstellung des Leerzeichens

UTF-8 kodiert Unicode-Zeichen variabel von 1 bis 4 Bytes, Rückwärts­kompatibel zu ASCII.

UTF-16 nutzt 2 oder 4 Bytes pro Zeichen. Java-Strings sind intern UTF-16.

Konvertierung in Java:

 
byte[] utf8 = str.getBytes(StandardCharsets.UTF_8); 
String fromUtf8 = new String(utf8, StandardCharsets.UTF_8); 
byte[] utf16 = str.getBytes(StandardCharsets.UTF_16); 
String fromUtf16 = new String(utf16, StandardCharsets.UTF_16); 

Für Interoperabilität im Netzwerk empfiehlt sich UTF-8 als gemeinsamer Standard.

UTF-8 als kleinster gemeinsamer Nenner

Java-Strings intern UTF-16, Web/JS nutzen UTF-8, C# .NET bevorzugt UTF-16.

Um Daten zwischen Systemen zu übertragen, empfiehlt sich UTF-8: - Kompakt und ASCII-kompatibel - Weit verbreitet in HTTP-Headern, JSON, XML

In Datenbanken besser UTF-8-Spalte definieren statt URL-Encoding in Textspalten.

Unicode-Syntax: - Java: \u1234 - HTML-Entities: Ӓ

Zuammenfasssung

URIs dürfen Leerzeichen beinhalten. Für die Kommunikation und den Datenaustausch über Netzwerkverbindungen müssen diese allerdings URL-kodiert werden.

Normalisierung von URIs

Network | URIExample04

Die Syntax eines URI erlaubt grundsätzlich die Verwendung .. als Notation, um ähnlich wie bei der Verzeichnisnavigation unter Windows und Linux zu navigieren. Diese Option bei der Formulierung von URIs führt dazu, dass ein Vergleich zweier eigentlich gleicher URIs nicht erkannt wird.

Erst der normalisierte URI bewirkt, dass solche Varianten in der Adressierung auflöst werden und ein Treffer bei zwei URIs überhaupt erzielt werden kann.

Beispiel



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * Beispiel für die Normalisierung von URIs.
 * 
 * {@index "URI: Normalisierung von URIs"}
 * 
 * {@index "URI: Vergleichen nicht normalisierter URIs" }
 * 
 * @author t2m
 */
public class URIExample04 {

	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void normalize() throws URISyntaxException {
		System.out.println("(4a) Normalisieren von URIs mit ., .. :\n");

		String uriString = "http://host/ordner/../datei.html";
		URI rawURI = new URI(uriString);

		URI uri = rawURI.normalize();

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

		System.out.println("(4b) Normalisieren von URIs mit ., .. :\n");

		uriString = "http://host/ordner/../../datei.html";
		rawURI = new URI(uriString);
		uri = rawURI.normalize();

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

		/*
		 * Prüfen, ob ein Match erzeugt werden kann.
		 */
		System.out.println("(4c) Vergleichen ohne Normalisierung :\n");

		String stringAnfrage = "http://host/ordner/unterordner/../../datei.html";
		String stringZiel = "http://host/datei.html";

		URI uriAnfrage = new URI(stringAnfrage);
		URI uriZiel = new URI(stringZiel);

		URI uriAnfrageNormalisiert = uriAnfrage.normalize();
		URI uriZielNormalisiert = uriZiel.normalize();

		System.out.println("uriAnfrageNormalisiert : " + uriAnfrageNormalisiert.normalize()); //
		System.out.println("uriZielNormalisiert : " + uriZielNormalisiert.normalize()); //

		// Objekte sind nicht die selben.
		System.out.println("uriAnfrage.equals(uriZiel) : " + uriAnfrage.equals(uriZiel)); //
		System.out.println(
		 "uriAnfrageNormalisiert.equals(uriZielNormalisiert) : " + uriAnfrageNormalisiert.equals(uriZielNormalisiert)); //

		System.out.println();

		System.out.println("uriAnfrage.compareTo(uriZiel) : " + uriAnfrage.compareTo(uriZiel)); //
		System.out.println("uriAnfrageN**.compareTo(uriZielN**) : "
		 + uriAnfrageNormalisiert.compareTo(uriZielNormalisiert)); //

		System.out.println();

		System.out.println("Die nicht normalisierte Anfrage:\n");
		uri = uriAnfrage;

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

		System.out.println("Die normalisierte Anfrage:\n");
		uri = uriAnfrageNormalisiert;

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

	}

	public static void main(String[] args) throws URISyntaxException {
		normalize(); // 4
	}

}

 
//@formatter:off
/*
 
(4a) Normalisieren von URIs mit ., .. :

uriString : http://host/ordner/../datei.html
toASCIIString() : http://host/datei.html
getScheme() : http
getSchemeSpecificPart() : //host/datei.html
getHost() : host
getPort() : -1
getPath() : /datei.html
getQuery() : null
getFragment() : null

(4b) Normalisieren von URIs mit ., .. :

uriString : http://host/ordner/../../datei.html
toASCIIString() : http://host/../datei.html
getScheme() : http
getSchemeSpecificPart() : //host/../datei.html
getHost() : host
getPort() : -1
getPath() : /../datei.html
getQuery() : null
getFragment() : null

(4c) Vergleichen ohne Normalisierung :

uriAnfrageNormalisiert : http://host/datei.html
uriZielNormalisiert : http://host/datei.html
uriAnfrage.equals(uriZiel) : false
uriAnfrageNormalisiert.equals(uriZielNormalisiert) : true

uriAnfrage.compareTo(uriZiel) : 11
uriAnfrageN**.compareTo(uriZielN**) : 0

Die nicht normalisierte Anfrage:

toASCIIString() : http://host/ordner/unterordner/../../datei.html
getScheme() : http
getSchemeSpecificPart() : //host/ordner/unterordner/../../datei.html
getHost() : host
getPort() : -1
getPath() : /ordner/unterordner/../../datei.html
getQuery() : null
getFragment() : null

Die normalisierte Anfrage:

toASCIIString() : http://host/datei.html
getScheme() : http
getSchemeSpecificPart() : //host/datei.html
getHost() : host
getPort() : -1
getPath() : /datei.html
getQuery() : null
getFragment() : null



*/
//@formatter:on

Erläuterungen

Das aktuelle Verzeichnis

Das aktuelle Verzeichnis lässt sich mit einem einzelnen . adressieren, so dass man mit ./a/b/c/d.html im Grunde genommen auch gleich a/b/c/d.html schreiben könnte.

Übergeordnetes Verzeichnis

Mit .. wird in der Verzeichnis-Hierarchie in das übergeordnete Verzeichnis gesprungen, so dass hierbei mit a/b/../c/d.html letztendlich eigentlich a/c/d.html gemeint ist.

WICHTIG: Ein normaler Zeichenvergleich bei URIs reicht also NICHT aus.

Compare ermittelt den «Abstand» zweiter Werte.

Dieser Vergleich wird lexikalisch durchgeführt, entspricht also einer Sortierung. Ist der Abstand 0 so sind die Zeichenfolgen gleich.

Das gilt aber oftmals erst nach einer Normalisierung.

.equals(..) prüft auf den Wert, aber Treffer erst nach Normalisierung.

Ohne die Normalisierung lassen sich URIs mit .. im path/file-Wert oftmals nicht matchen.

Zusammenfassend

Mit Hilfe der URI Klasse lassen sich URIs normalisieren.

Ein einfacher String-Vergleich führt bei URIs NICHT zu einem Treffer.

Eine Prüfung auf Gleichheit mit .equals führt bei zwei URIs NICHT zu einem Treffer.

Nur der Vergleich mit .compare() zweiter normalisierter URIs ermöglichen einen Treffer.

Absolute/Relative URIs

Network | URIExample05

URIs können sowohl absolut als auch relativ zu anderen URLs wie beispielsweise der base-URL definiert werden, wie man es mitunter bei HTML-Seiten angeben kann. Wir zeigen im Beispiel, wie man für einen relativen URI den absoluten URI gewinnen kann und wie man für zwei absolute URIs den relativen URI erhält.



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Relative URLs
 * 
 * @author t2m
 */
public class URIExample05 {

	public static void main(String[] args) throws URISyntaxException {
		resolveRelativeURI(); // 5
	}

	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void resolveRelativeURI() throws URISyntaxException {
		System.out.println("(5) resolve und relativize: Relative Adressierung \n");

		// Der Ordner in welchem wir uns aktuell befinden.
		URI base = new URI("https://beispiel.com/ordner/seite.html");

		// Relative Adressierung für welche wir die absolute Adressierung suchen.
		URI rel = new URI("../bild.png");

		URI resolved = base.resolve(rel); // https://beispiel.com/bild.png
		URI relativized = base.relativize(base); // Leer, identisch

		System.out.println("base : " + base); //
		System.out.println("rel : " + rel); //
		System.out.println();

		System.out.println("base.isAbsolute() : " + base.isAbsolute()); //
		System.out.println("rel.isAbsolute() : " + rel.isAbsolute()); //
		System.out.println();

		System.out.println("resolved = base.resolve(rel) : " + resolved); //
		System.out.println("relativized = base.relativize(base) : " + relativized); //
		System.out.println(" Der Wert muss leer sein");
		System.out.println();

		System.out.println("toASCIIString() : " + rel.toASCIIString()); //
		System.out.println("getScheme() : " + rel.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + rel.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + rel.getHost()); //
		System.out.println("getPort() : " + rel.getPort()); //
		System.out.println("getPath() : " + rel.getPath()); //
		System.out.println("getQuery() : " + rel.getQuery()); //
		System.out.println("getFragment() : " + rel.getFragment()); //

		System.out.println();
		System.out.println();

		/*
		 * 
		 */
		URI uriSeite = new URI("https://beispiel.com/basispfad/ordner/seite.html");
		URI uriBase = new URI("https://beispiel.com/basispfad");

		System.out.println("uriSeite.toASCIIString() : " + uriSeite.toASCIIString()); //
		System.out.println("uriBase.toASCIIString() : " + uriBase.toASCIIString()); //
		System.out.println();

		URI uriSeiteRelativ = uriBase.relativize(uriSeite);

		System.out.println("uriSeiteRelativ : " + uriSeiteRelativ.toASCIIString()); //
		System.out.println();

		rel = uriSeiteRelativ;

		System.out.println("toASCIIString() : " + rel.toASCIIString()); //
		System.out.println("getScheme() : " + rel.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + rel.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + rel.getHost()); //
		System.out.println("getPort() : " + rel.getPort()); //
		System.out.println("getPath() : " + rel.getPath()); //
		System.out.println("getQuery() : " + rel.getQuery()); //
		System.out.println("getFragment() : " + rel.getFragment()); //
		System.out.println();

	}

}


 
//@formatter:off
/*
(5) resolve und relativize: Relative Adressierung 

base : https://beispiel.com/ordner/seite.html
rel : ../bild.png

base.isAbsolute() : true
rel.isAbsolute() : false

resolved = base.resolve(rel) : https://beispiel.com/bild.png
relativized = base.relativize(base) : 
 Der Wert muss leer sein

toASCIIString() : ../bild.png
getScheme() : null
getSchemeSpecificPart() : ../bild.png
getHost() : null
getPort() : -1
getPath() : ../bild.png
getQuery() : null
getFragment() : null


uriSeite.toASCIIString() : https://beispiel.com/basispfad/ordner/seite.html
uriBase.toASCIIString() : https://beispiel.com/basispfad

uriSeiteRelativ : ordner/seite.html

toASCIIString() : ordner/seite.html
getScheme() : null
getSchemeSpecificPart() : ordner/seite.html
getHost() : null
getPort() : -1
getPath() : ordner/seite.html
getQuery() : null
getFragment() : null


*/
//@formatter:on

Absoluten Pfad für relativen Pfad ermitteln

Die Methode URI.resolve(relativ) des URI-Objekts ist in der Lage, für relative Adresse eine absolute Adresse zu ermitteln, ohne dass hierbei der eigentliche URI verändert wird.


TIPP: Viele Webseiten verwenden in HMTL Code relative Adressen, so dass man für die eigentliche absolute Adresse, auf welche sich die Links beziehen, das HTML base-Tag auslesen muss.

Fehlt das base-Tag, wird relativ zum aktuellen URI der Seite gearbeitet, die man gerade adressiert bzw. gelesen hat.

Relativen URI für absoluten URI finden

Über den Vergleich zweier absoluter URI ist das URI-Objekt über die Methode .relativize(absolute) in der Lage, den relativen Pfad zu ermitteln


HINWEIS: Versucht den eigenen absoluten Pfad zu relativieren, ist das Ergebnis ein leer String.


HINWEIS: Obwohl der base-URI ohne abschließenden Slash angegeben wurde und damit der verbleibende relative Pfad nun eigentlich /ordner/seite.html hätte hießen müssen, wird nur ordner/seite.html.

Dieses entspricht ./ordner/seite.html für die eigentliche relative Adressierung, so dass man den Ursprung (hier base-URI) als . angeben kann, um von dort dann den Pfad mit / fortzusetzen.

Zusammenfassend

Ein absolute URI wie https://example.com/de/buch/kapitel/seite-1.html lässt sich auch in Java über die Methode uri.isAbsolute() prüfen, ob er denn absolut ist.

Absolute Links sind immer dann dringend zu empfehlen, wenn zu befürchten ist, dass dem Empfänger des Links die Information zum Basis-URI entweder fehlt oder aber die Auswertung nicht möglich ist.

Relative URIs haben den großen Nutzen, dass man damit URIs ohne Domain und auch ohne Angabe eines Basispfads angeben kann, so dass man später alle URIs verändern kann, indem der Basispfad-Anteil am URI-Path kürzer oder länger wird, weil die relative Adressierung noch immer funktioniert.

URIs vergleichen/sortieren

Network | URIExample06

Man kann URIs sortieren und in eine Reihenfolge bringen und auf diesem Wege auch feststellen, ob zwei ermittelte URIs eigentlich identisch sind.

Die grundlegende Voraussetzung ist das Arbeiten mit normalisieren URIs.



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Vergleichen und Sortieren von URIs
 * 
 * @author t2m
 */
public class URIExample06 {

	/**
	 * URIs sind lexikalisch vergleichbar.
	 * 
	 * @throws URISyntaxException
	 */
	public static void vergleichenUndSortieren() throws URISyntaxException {
		System.out.println("6) vergleichenUndSortieren:\n");

		URI uriA = new URI("http://example.com/a");
		URI uriB = new URI("http://example.com/b");

		System.out.println("uriB.compareTo(uriA) : " + uriB.compareTo(uriB)); //
		System.out.println("uriA.compareTo(uriB) : " + uriA.compareTo(uriB)); //
		
		System.out.println();

		System.out.println("uriA.toASCIIString() : " + uriA.toASCIIString()); //
		System.out.println("uriB.toASCIIString() : " + uriB.toASCIIString()); //

		System.out.println();
	}

	
	public static void main(String[] args) throws URISyntaxException {
		vergleichenUndSortieren(); // 6
	}	

}




 
//@formatter:off
/*
6) vergleichenUndSortieren:

uriB.compareTo(uriA) : 0
uriA.compareTo(uriB) : -1

uriA.toASCIIString() : http://example.com/a
uriB.toASCIIString() : http://example.com/b

*/

//@formatter:on

Zusammenfassend

Vor jeder dieser Maßnahmen sollte man sich stets einen mit uriA=rawA.normalize() normalisieren URI beschaffen. Erst dann kann man mit int dif=uriA.compare(uriB) prüfen, ob uriA vor uriB ist oder danach. Ist der Wert 0, sind die zwei identisch.

HINWEIS: Dieser Ansatz macht mitunter immer dann einen Sinn, wenn man beispielsweise einen Crawler programmiert und die ermittelten URIs in irgendeine Reihenfolge bringen und zugleich doppelte Erfassungen verhindern möchte.

07

Network | URIExample07



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Beispiele für URIS
 * 
 * @author t2m
 */
public class URIExample07 {

	public static void main(String[] args) throws URISyntaxException {
		hiearchicalURI(); // 1
		opaqueURI(); // 2
		rawAskii(); // 3 
		normalize(); // 4
		resolveRelativeURI(); // 5
		vergleichenUndSortieren(); // 6
		dataFileURI(); // 7
		fileContentToDataURI(); // 8
	}

	/**
	 * Eine hierarchische Struktur von {@link URI} kennen wir von Internetseiten und Webseiten.
	 * 
	 * {@code https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview}
	 * 
	 * @throws URISyntaxException
	 * 
	 */
	public static void hiearchicalURI() throws URISyntaxException {

		System.out.println("(1) Hierarchische URIs interpretieren\n");

		URI uri = new URI("https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview");

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

	}

	/**
	 * @throws URISyntaxException
	 * 
	 */
	public static void opaqueURI() throws URISyntaxException {
		System.out.println("(2) Opaque URI wie mailto:\n");

		URI uri = new URI("mailto:dev@beispiel.com");

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}

	/**
	 * Pfade mit Sonderzeichen wie Leerzeichen
	 * 
	 * @throws URISyntaxException
	 */
	public static void rawAskii() throws URISyntaxException {
		System.out.println("(3) Normalisieren von URIs mit ., .. :\n");

		String uriString = "/pfad mit leerzeichen/";
		URI uri = new URI("http", "host", uriString, null);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}

	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void normalize() throws URISyntaxException {
		System.out.println("(4a) Normalisieren von URIs mit ., .. :\n");

		String uriString = "http://host/ordner/../datei.html";
		URI uri = new URI(uriString);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

		System.out.println("(4b) Normalisieren von URIs mit ., .. :\n");

		uriString = "http://host/ordner/../../datei.html";
		uri = new URI(uriString);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

	}

	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void resolveRelativeURI() throws URISyntaxException {
		System.out.println("(5) resolve und relativize: Relative Adressierung \n");

		URI base = new URI("https://beispiel.com/ordner/seite.html");
		URI rel = new URI("../bild.png");

		URI resolved = base.resolve(rel); // https://beispiel.com/bild.png
		URI relativized = base.relativize(base); // Leer, identisch

		System.out.println("base : " + base); //
		System.out.println("rel : " + rel); //

		System.out.println("toASCIIString() : " + rel.toASCIIString()); //
		System.out.println("getScheme() : " + rel.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + rel.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + rel.getHost()); //
		System.out.println("getPort() : " + rel.getPort()); //
		System.out.println("getPath() : " + rel.getPath()); //
		System.out.println("getQuery() : " + rel.getQuery()); //
		System.out.println("getFragment() : " + rel.getFragment()); //

		System.out.println();
	}

	/**
	 * URIs sind lexikalisch vergleichbar.
	 * 
	 * @throws URISyntaxException
	 */
	public static void vergleichenUndSortieren() throws URISyntaxException {
		System.out.println("6) vergleichenUndSortieren:\n");

		URI uriA = new URI("http://example.com/a");
		URI uriB = new URI("http://example.com/b");

		System.out.println("uriB.compareTo(uriA) : " + uriB.compareTo(uriB)); //
		System.out.println("uriA.compareTo(uriB) : " + uriA.compareTo(uriB)); //

		System.out.println("uriA.toASCIIString() : " + uriA.toASCIIString()); //
		System.out.println("uriB.toASCIIString() : " + uriA.toASCIIString()); //

		System.out.println();
	}

	/**
	 * Auch in JAVA können URIs direkt Daten beinhalten, hier am Beispiel für MIME Type text/plain.
	 * 
	 * @throws URISyntaxException
	 */
	public static void dataFileURI() throws URISyntaxException {
		System.out.println("(7) Data- und File-URIs:\n");

		String dataFileString = "data:text/plain;charset=UTF-8,Hallo%20Welt";
		URI uri = new URI(dataFileString);

		System.out.println("dataFileString : " + dataFileString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}
	
	
	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void fileContentToDataURI() throws URISyntaxException {
		System.out.println("(8) Inhalt von Files lesen und als data:* URI erhalten:\n");
		
		File file = new File("/tmp/test.txt");
		URI uri = file.toURI();
		
		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //
		

		System.out.println();
	}

}


 

//@formatter:off
/*
(1) Hierarchische URIs interpretieren

toASCIIString() : https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview
getScheme() : https
getSchemeSpecificPart() : //example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de
getHost() : example.com
getPort() : 443
getPath() : /de/buch/abschnitt/kapitel/seite04
getQuery() : lang=de
getFragment() : overview

(2) Opaque URI wie mailto:

toASCIIString() : mailto:dev@beispiel.com
getScheme() : mailto
getSchemeSpecificPart() : dev@beispiel.com
getHost() : null
getPort() : -1
getPath() : null
getQuery() : null
getFragment() : null

(3) Normalisieren von URIs mit ., .. :

uriString : /pfad mit leerzeichen/
toASCIIString() : http://host/pfad%20mit%20leerzeichen/
getScheme() : http
getSchemeSpecificPart() : //host/pfad mit leerzeichen/
getHost() : host
getPort() : -1
getPath() : /pfad mit leerzeichen/
getQuery() : null
getFragment() : null

(4a) Normalisieren von URIs mit ., .. :

uriString : http://host/ordner/../datei.html
toASCIIString() : http://host/ordner/../datei.html
getScheme() : http
getSchemeSpecificPart() : //host/ordner/../datei.html
getHost() : host
getPort() : -1
getPath() : /ordner/../datei.html
getQuery() : null
getFragment() : null

(4b) Normalisieren von URIs mit ., .. :

uriString : http://host/ordner/../../datei.html
toASCIIString() : http://host/ordner/../../datei.html
getScheme() : http
getSchemeSpecificPart() : //host/ordner/../../datei.html
getHost() : host
getPort() : -1
getPath() : /ordner/../../datei.html
getQuery() : null
getFragment() : null

(5) resolve und relativize: Relative Adressierung 

base : https://beispiel.com/ordner/seite.html
rel : ../bild.png
toASCIIString() : ../bild.png
getScheme() : null
getSchemeSpecificPart() : ../bild.png
getHost() : null
getPort() : -1
getPath() : ../bild.png
getQuery() : null
getFragment() : null

6) vergleichenUndSortieren:

uriB.compareTo(uriA) : 0
uriA.compareTo(uriB) : -1
uriA.toASCIIString() : http://example.com/a
uriB.toASCIIString() : http://example.com/a

(7) Data- und File-URIs:

dataFileString : data:text/plain;charset=UTF-8,Hallo%20Welt
toASCIIString() : data:text/plain;charset=UTF-8,Hallo%20Welt
getScheme() : data
getSchemeSpecificPart() : text/plain;charset=UTF-8,Hallo Welt
getHost() : null
getPort() : -1
getPath() : null
getQuery() : null
getFragment() : null

(8) Inhalt von Files lesen und als data:* URI erhalten:

toASCIIString() : file:/C:/tmp/test.txt
getScheme() : file
getSchemeSpecificPart() : /C:/tmp/test.txt
getHost() : null
getPort() : -1
getPath() : /C:/tmp/test.txt
getQuery() : null
getFragment() : null
*/

//@formatter:on

..

...

Zusammenfassend

07

Network | URIExample08



package com.stuelken.java.c1.networking.basics.uris.e01;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * Beispiele für URIS
 * 
 * @author t2m
 */
public class URIExample07 {

	public static void main(String[] args) throws URISyntaxException {
		hiearchicalURI(); // 1
		opaqueURI(); // 2
		rawAskii(); // 3 
		normalize(); // 4
		resolveRelativeURI(); // 5
		vergleichenUndSortieren(); // 6
		dataFileURI(); // 7
		fileContentToDataURI(); // 8
	}

	/**
	 * Eine hierarchische Struktur von {@link URI} kennen wir von Internetseiten und Webseiten.
	 * 
	 * {@code https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview}
	 * 
	 * @throws URISyntaxException
	 * 
	 */
	public static void hiearchicalURI() throws URISyntaxException {

		System.out.println("(1) Hierarchische URIs interpretieren\n");

		URI uri = new URI("https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview");

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

	}

	/**
	 * @throws URISyntaxException
	 * 
	 */
	public static void opaqueURI() throws URISyntaxException {
		System.out.println("(2) Opaque URI wie mailto:\n");

		URI uri = new URI("mailto:dev@beispiel.com");

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}

	/**
	 * Pfade mit Sonderzeichen wie Leerzeichen
	 * 
	 * @throws URISyntaxException
	 */
	public static void rawAskii() throws URISyntaxException {
		System.out.println("(3) Normalisieren von URIs mit ., .. :\n");

		String uriString = "/pfad mit leerzeichen/";
		URI uri = new URI("http", "host", uriString, null);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}

	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void normalize() throws URISyntaxException {
		System.out.println("(4a) Normalisieren von URIs mit ., .. :\n");

		String uriString = "http://host/ordner/../datei.html";
		URI uri = new URI(uriString);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

		System.out.println("(4b) Normalisieren von URIs mit ., .. :\n");

		uriString = "http://host/ordner/../../datei.html";
		uri = new URI(uriString);

		System.out.println("uriString : " + uriString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();

	}

	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void resolveRelativeURI() throws URISyntaxException {
		System.out.println("(5) resolve und relativize: Relative Adressierung \n");

		URI base = new URI("https://beispiel.com/ordner/seite.html");
		URI rel = new URI("../bild.png");

		URI resolved = base.resolve(rel); // https://beispiel.com/bild.png
		URI relativized = base.relativize(base); // Leer, identisch

		System.out.println("base : " + base); //
		System.out.println("rel : " + rel); //

		System.out.println("toASCIIString() : " + rel.toASCIIString()); //
		System.out.println("getScheme() : " + rel.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + rel.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + rel.getHost()); //
		System.out.println("getPort() : " + rel.getPort()); //
		System.out.println("getPath() : " + rel.getPath()); //
		System.out.println("getQuery() : " + rel.getQuery()); //
		System.out.println("getFragment() : " + rel.getFragment()); //

		System.out.println();
	}

	/**
	 * URIs sind lexikalisch vergleichbar.
	 * 
	 * @throws URISyntaxException
	 */
	public static void vergleichenUndSortieren() throws URISyntaxException {
		System.out.println("6) vergleichenUndSortieren:\n");

		URI uriA = new URI("http://example.com/a");
		URI uriB = new URI("http://example.com/b");

		System.out.println("uriB.compareTo(uriA) : " + uriB.compareTo(uriB)); //
		System.out.println("uriA.compareTo(uriB) : " + uriA.compareTo(uriB)); //

		System.out.println("uriA.toASCIIString() : " + uriA.toASCIIString()); //
		System.out.println("uriB.toASCIIString() : " + uriA.toASCIIString()); //

		System.out.println();
	}

	/**
	 * Auch in JAVA können URIs direkt Daten beinhalten, hier am Beispiel für MIME Type text/plain.
	 * 
	 * @throws URISyntaxException
	 */
	public static void dataFileURI() throws URISyntaxException {
		System.out.println("(7) Data- und File-URIs:\n");

		String dataFileString = "data:text/plain;charset=UTF-8,Hallo%20Welt";
		URI uri = new URI(dataFileString);

		System.out.println("dataFileString : " + dataFileString); //

		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //

		System.out.println();
	}
	
	
	/**
	 * 
	 * @throws URISyntaxException
	 */
	public static void fileContentToDataURI() throws URISyntaxException {
		System.out.println("(8) Inhalt von Files lesen und als data:* URI erhalten:\n");
		
		File file = new File("/tmp/test.txt");
		URI uri = file.toURI();
		
		System.out.println("toASCIIString() : " + uri.toASCIIString()); //
		System.out.println("getScheme() : " + uri.getScheme()); //
		System.out.println("getSchemeSpecificPart() : " + uri.getSchemeSpecificPart()); //
		System.out.println("getHost() : " + uri.getHost()); //
		System.out.println("getPort() : " + uri.getPort()); //
		System.out.println("getPath() : " + uri.getPath()); //
		System.out.println("getQuery() : " + uri.getQuery()); //
		System.out.println("getFragment() : " + uri.getFragment()); //
		

		System.out.println();
	}

}


 

//@formatter:off
/*
(1) Hierarchische URIs interpretieren

toASCIIString() : https://example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de#overview
getScheme() : https
getSchemeSpecificPart() : //example.com:443/de/buch/abschnitt/kapitel/seite04?lang=de
getHost() : example.com
getPort() : 443
getPath() : /de/buch/abschnitt/kapitel/seite04
getQuery() : lang=de
getFragment() : overview

(2) Opaque URI wie mailto:

toASCIIString() : mailto:dev@beispiel.com
getScheme() : mailto
getSchemeSpecificPart() : dev@beispiel.com
getHost() : null
getPort() : -1
getPath() : null
getQuery() : null
getFragment() : null

(3) Normalisieren von URIs mit ., .. :

uriString : /pfad mit leerzeichen/
toASCIIString() : http://host/pfad%20mit%20leerzeichen/
getScheme() : http
getSchemeSpecificPart() : //host/pfad mit leerzeichen/
getHost() : host
getPort() : -1
getPath() : /pfad mit leerzeichen/
getQuery() : null
getFragment() : null

(4a) Normalisieren von URIs mit ., .. :

uriString : http://host/ordner/../datei.html
toASCIIString() : http://host/ordner/../datei.html
getScheme() : http
getSchemeSpecificPart() : //host/ordner/../datei.html
getHost() : host
getPort() : -1
getPath() : /ordner/../datei.html
getQuery() : null
getFragment() : null

(4b) Normalisieren von URIs mit ., .. :

uriString : http://host/ordner/../../datei.html
toASCIIString() : http://host/ordner/../../datei.html
getScheme() : http
getSchemeSpecificPart() : //host/ordner/../../datei.html
getHost() : host
getPort() : -1
getPath() : /ordner/../../datei.html
getQuery() : null
getFragment() : null

(5) resolve und relativize: Relative Adressierung 

base : https://beispiel.com/ordner/seite.html
rel : ../bild.png
toASCIIString() : ../bild.png
getScheme() : null
getSchemeSpecificPart() : ../bild.png
getHost() : null
getPort() : -1
getPath() : ../bild.png
getQuery() : null
getFragment() : null

6) vergleichenUndSortieren:

uriB.compareTo(uriA) : 0
uriA.compareTo(uriB) : -1
uriA.toASCIIString() : http://example.com/a
uriB.toASCIIString() : http://example.com/a

(7) Data- und File-URIs:

dataFileString : data:text/plain;charset=UTF-8,Hallo%20Welt
toASCIIString() : data:text/plain;charset=UTF-8,Hallo%20Welt
getScheme() : data
getSchemeSpecificPart() : text/plain;charset=UTF-8,Hallo Welt
getHost() : null
getPort() : -1
getPath() : null
getQuery() : null
getFragment() : null

(8) Inhalt von Files lesen und als data:* URI erhalten:

toASCIIString() : file:/C:/tmp/test.txt
getScheme() : file
getSchemeSpecificPart() : /C:/tmp/test.txt
getHost() : null
getPort() : -1
getPath() : /C:/tmp/test.txt
getQuery() : null
getFragment() : null
*/

//@formatter:on

..

...

Zusammenfassend

Links

Quellen, Notes, Tags


    java.net.uri

    UI ORGANIZED.

    UIO3 Es ist einfacher als Du denkst.

    Stelle noch heute Deine Anfrage.

    uio--WebPageFooter-Module