Java URI Methods - Java 147

Java URI Methods – Java 147

Java 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 等方法,提供範例參考。

發佈留言