Table of Contents
ToggleJava URI Methods
統一資源識別碼 (Uniform Resource Identifier) 用於標識特定資源的字元序列,允許使用特定協定在網路上進行資源互動, URI Java Methods 本篇增加了範例,並透過單元測試來驗證產出結果。
基本結構:
<scheme>:<scheme-specific-part>
scheme-specific-part 並無特定固定的結構或規範,取決於 scheme 。
例如:https://www.ruoxue.org
scheme=https
scheme-specific-part=//www.ruoxue.org
一般結構:
<scheme>:<authority><path>?<query>#<fragment>
scheme 是必須的,其他是選項。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- net
| +- uri
| +- URIMethodsTest.java
單元測試
URI Methods Java 提供建立、取得等操作 URI 。
constructor
URI Methods Java 建立一個 URI ,提供相關資訊。
@Test
public void constructor() {
try {
String value = "https://username:password@www.ruoxue.org:443/java-learn/java-net?amount=101#top";
URI uri = new URI(value);
System.out.println(uri);
System.out.println("Scheme: " + uri.getScheme());
System.out.println("SchemeSpecificPart: " + uri.getSchemeSpecificPart());
System.out.println("Authority: " + uri.getAuthority());
System.out.println("UserInfo: " + uri.getUserInfo());
System.out.println("Host: " + uri.getHost());
System.out.println("Port: " + uri.getPort());
System.out.println("Path: " + uri.getPath());
System.out.println("Query: " + uri.getQuery());
System.out.println("Fragment: " + uri.getFragment());
URI uri2 = new URI("https", "username:password", "www.ruoxue.org", 443, "/java-learn/java-net",
"amount=101", "top");
System.out.println(uri2);
assertThat(uri.getScheme()).isEqualTo(uri2.getScheme());
assertThat(uri.getAuthority()).isEqualTo(uri2.getAuthority());
assertThat(uri.getUserInfo()).isEqualTo(uri2.getUserInfo());
assertThat(uri.getHost()).isEqualTo(uri2.getHost());
assertThat(uri.getPort()).isEqualTo(uri2.getPort());
assertThat(uri.getPath()).isEqualTo(uri2.getPath());
assertThat(uri.getQuery()).isEqualTo(uri2.getQuery());
assertThat(uri.getFragment()).isEqualTo(uri2.getFragment());
} catch (URISyntaxException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
https://username:password@www.ruoxue.org:443/java-learn/java-net?amount=101#top
Scheme: https
SchemeSpecificPart: //username:password@www.ruoxue.org:443/java-learn/java-net?amount=101
Authority: username:password@www.ruoxue.org:443
UserInfo: username:password
Host: www.ruoxue.org
Port: 443
Path: /java-learn/java-net
Query: amount=101
Fragment: top
https://username:password@www.ruoxue.org:443/java-learn/java-net?amount=101#top
constructorThrowException
URI Methods Java 建立一個 URI ,傳入無法辨識的字串,會拋出例外。
@Test
public void constructorThrowException() {
assertThatCode(() -> {
String value = "https://www.ruoxue.org^^^";
URI uri = new URI(value);
System.out.println(uri);
}).isInstanceOf(URISyntaxException.class);
}
06:01:04-05:00
06:01:04-05:00
resolve
URI Methods Java 建立兩個 URI ,解析成為絕對 URI。
@Test
public void resolve() {
URI absoluteUri = URI.create("https://www.ruoxue.org/unit-testing");
URI relativeUri = URI.create("/java-learn/java-net");
System.out.println(relativeUri);
URI uri = absoluteUri.resolve(relativeUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("https://www.ruoxue.org/java-learn/java-net");
absoluteUri = URI.create("https://www.ruoxue.org/");
relativeUri = URI.create("/java-learn");
System.out.println(relativeUri);
uri = absoluteUri.resolve(relativeUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("https://www.ruoxue.org/java-learn");
}
/java-learn/java-net
https://www.ruoxue.org/java-learn/java-net
/java-learn
https://www.ruoxue.org/java-learn
relativize
URI Methods Java 建立兩個 URI ,解析成為相對 URI。
@Test
public void relativize() {
URI absoluteUri = URI.create("https://www.ruoxue.org/java-learn/java-net");
System.out.println(absoluteUri);
URI relativeUri = URI.create("https://www.ruoxue.org");
URI uri = relativeUri.relativize(absoluteUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("java-learn/java-net");
absoluteUri = URI.create("https://www.ruoxue.org/java-learn");
System.out.println(absoluteUri);
relativeUri = URI.create("https://www.ruoxue.org/");
uri = relativeUri.relativize(absoluteUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("java-learn");
}
6
1
4
normalize
URI Methods Java 建立一個 URI ,規範化該 URI 的路徑。
@Test
public void normalize() {
URI uri = URI.create("https://www.ruoxue.org/a/b/../c/./d");
URI result = uri.normalize();
System.out.println(result);
assertThat(result.toString()).isEqualTo("https://www.ruoxue.org/a/c/d");
uri = URI.create("https://www.ruoxue.org/java-learn/../java-net");
result = uri.normalize();
System.out.println(result);
assertThat(result.toString()).isEqualTo("https://www.ruoxue.org/java-net");
}
https://www.ruoxue.org/a/c/d
https://www.ruoxue.org/java-net
isOpaque
URI Methods in Java 建立一個 URI ,判斷是否不透明。
@Test
public void isOpaque() {
URI uri = URI.create("https:www.ruoxue.org");
System.out.println(uri);
boolean result = uri.isOpaque();
System.out.println(result + ", getPath: " + uri.getPath());
assertThat(result).isTrue();
uri = URI.create("https://www.ruoxue.org");
System.out.println(uri);
result = uri.isOpaque();
System.out.println(result + ", getPath: " + uri.getPath());
assertThat(result).isFalse();
}
https:www.ruoxue.org
true, getPath: null
https://www.ruoxue.org
false, getPath:
URIMethodsTest.java
URI Methods in Java 新增單元測試,驗證 URI Functions in Java 是否符合預期。
package org.ruoxue.java_147.net.uri;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThat;
import java.net.URI;
import java.net.URISyntaxException;
import org.junit.Test;
public class URIMethodsTest {
@Test
public void constructor() {
try {
String value = "https://username:password@www.ruoxue.org:443/java-learn/java-net?amount=101#top";
URI uri = new URI(value);
System.out.println(uri);
System.out.println("Scheme: " + uri.getScheme());
System.out.println("SchemeSpecificPart: " + uri.getSchemeSpecificPart());
System.out.println("Authority: " + uri.getAuthority());
System.out.println("UserInfo: " + uri.getUserInfo());
System.out.println("Host: " + uri.getHost());
System.out.println("Port: " + uri.getPort());
System.out.println("Path: " + uri.getPath());
System.out.println("Query: " + uri.getQuery());
System.out.println("Fragment: " + uri.getFragment());
URI uri2 = new URI("https", "username:password", "www.ruoxue.org", 443, "/java-learn/java-net",
"amount=101", "top");
System.out.println(uri2);
assertThat(uri.getScheme()).isEqualTo(uri2.getScheme());
assertThat(uri.getAuthority()).isEqualTo(uri2.getAuthority());
assertThat(uri.getUserInfo()).isEqualTo(uri2.getUserInfo());
assertThat(uri.getHost()).isEqualTo(uri2.getHost());
assertThat(uri.getPort()).isEqualTo(uri2.getPort());
assertThat(uri.getPath()).isEqualTo(uri2.getPath());
assertThat(uri.getQuery()).isEqualTo(uri2.getQuery());
assertThat(uri.getFragment()).isEqualTo(uri2.getFragment());
} catch (URISyntaxException ex) {
throw new RuntimeException(ex.getMessage(), ex);
}
}
@Test
public void constructorThrowException() {
assertThatCode(() -> {
String value = "https://www.ruoxue.org^^^";
URI uri = new URI(value);
System.out.println(uri);
}).isInstanceOf(URISyntaxException.class);
}
@Test
public void resolve() {
URI absoluteUri = URI.create("https://www.ruoxue.org/unit-testing");
URI relativeUri = URI.create("/java-learn/java-net");
System.out.println(relativeUri);
URI uri = absoluteUri.resolve(relativeUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("https://www.ruoxue.org/java-learn/java-net");
absoluteUri = URI.create("https://www.ruoxue.org/");
relativeUri = URI.create("/java-learn");
System.out.println(relativeUri);
uri = absoluteUri.resolve(relativeUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("https://www.ruoxue.org/java-learn");
}
@Test
public void relativize() {
URI absoluteUri = URI.create("https://www.ruoxue.org/java-learn/java-net");
System.out.println(absoluteUri);
URI relativeUri = URI.create("https://www.ruoxue.org");
URI uri = relativeUri.relativize(absoluteUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("java-learn/java-net");
absoluteUri = URI.create("https://www.ruoxue.org/java-learn");
System.out.println(absoluteUri);
relativeUri = URI.create("https://www.ruoxue.org/");
uri = relativeUri.relativize(absoluteUri);
System.out.println(uri);
assertThat(uri.toString()).isEqualTo("java-learn");
}
@Test
public void normalize() {
URI uri = URI.create("https://www.ruoxue.org/a/b/../c/./d");
URI result = uri.normalize();
System.out.println(result);
assertThat(result.toString()).isEqualTo("https://www.ruoxue.org/a/c/d");
uri = URI.create("https://www.ruoxue.org/java-learn/../java-net");
result = uri.normalize();
System.out.println(result);
assertThat(result.toString()).isEqualTo("https://www.ruoxue.org/java-net");
}
@Test
public void isOpaque() {
URI uri = URI.create("https:www.ruoxue.org");
System.out.println(uri);
boolean result = uri.isOpaque();
System.out.println(result + ", getPath: " + uri.getPath());
assertThat(result).isTrue();
uri = URI.create("https://www.ruoxue.org");
System.out.println(uri);
result = uri.isOpaque();
System.out.println(result + ", getPath: " + uri.getPath());
assertThat(result).isFalse();
}
}
心得分享
URI Functions in Java 形式統一 ( Uniform ) 對於各種不同的資源,都能有相同的表現,因此可以使用相同的語義進行解釋和理解,在不影響現存的資源的情況下,出現新的資源,而資源 ( Resource ) 任何事情都可以成為資源,可以被標示,及識別碼( Indentifier ) 即是一個對資源的引用,熟悉 URI Methods in Java 這些方法的操作,如:建構子、 resolve 、 relativize 、 isOpaque 等方法,提供範例參考。