- Overview
- Network | URI Syntax
- Network | Hierarchische URI (01)
- Network | Opaque URI (02)
- Network | URIs mit Sonderzeichen (03)
- Network | Normalisierung von URIs (04)
- Network | Absolute/Relative URIs (05)
- Network | URIs vergleichen/sortieren (06)
- Network | URIs vergleichen/sortieren (07)
- Network | URIs vergleichen/sortieren (08)
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ärtskompatibel 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
UIO3 Es ist einfacher als Du denkst.
Stelle noch heute Deine Anfrage.
