在 Java 中標準化 URL
一、簡介
統一資源定位器 (URL) 是 Web 開發的重要組成部分,因為它們有助於定位和取得 Internet 上的資源。然而,URL 可能不一致或格式不正確;這可能會導致加工和取得所需材料出現問題。
URL規範化將給定的資料轉換為規範形式,確保一致性並促進可操作性。
在本教程中,我們將研究在 Java 中標準化 URL 的不同技術。
2. 手動標準化
執行手動標準化涉及應用自訂邏輯來標準化 URL。此過程包括刪除無關元素,例如不必要的查詢參數和片段標識符,以將 URL 提煉為其基本核心。假設我們有以下 URL:
https://www.example.com:8080/path/to/resource?param1=value1¶m2=value2#fragment
規範化的 URL 應如下所示:
https://www.example.com:8080/path/to/resource
3. 使用 Apache Commons Validator
Apache Commons Validator 庫中的UrlValidator
類別是用於驗證和規範化 URL 的便捷驗證方法。首先,我們應該確保我們的專案包含 Apache Commons Validator依賴項,如下所示:
<dependency>
<groupId>commons-validator</groupId>
<artifactId>commons-validator</artifactId>
<version>1.8.0</version>
<scope>test</scope>
</dependency>
現在,我們準備實作一個簡單的 Java 程式碼範例:
String originalUrl = "https://www.example.com:8080/path/to/resource?param1=value1¶m2=value2#fragment";
String expectedNormalizedUrl = "https://www.example.com:8080/path/to/resource";
@Test
public void givenOriginalUrl_whenUsingApacheCommonsValidator_thenValidatedAndMaybeManuallyNormalized() {
UrlValidator urlValidator = new UrlValidator();
if (urlValidator.isValid(originalUrl)) {
String normalizedUrl = originalUrl.split("\\?")[0];
assertEquals(expectedNormalizedUrl, manuallyNormalizedUrl);
} else {
fail(originalUrl);
}
}
在這裡,我們首先從UrlValidator
實例化一個物件。稍後,我們使用isValid()
方法來確定原始 URL 是否符合前面提到的驗證規則。
如果 URL 被證明是合法的,我們會手動標準化並刪除查詢參數和片段,尤其是「?」之後的所有內容。最後,我們使用assertEquals()
方法來驗證expectedNormalizedUrl
和normalizedUrl.
4.利用Java的URI類
在 java.net 套件中建立 Java URI
類別提供了管理 URI 的其他功能,包括規範化。讓我們來看一個簡單的例子:
@Test
public void givenOriginalUrl_whenUsingJavaURIClass_thenNormalizedUrl() throws URISyntaxException {
URI uri = new URI(originalUrl);
URI normalizedUri = new URI(uri.getScheme(), uri.getAuthority(), uri.getPath(), null, null);
String normalizedUrl = normalizedUri.toString();
assertEquals(expectedNormalizedUrl, normalizedUrl);
}
在此測試中,我們將originalUrl
傳遞給URI
對象,並透過提取和重新組裝特定組件(例如方案、權限和路徑)來派生規範化的URI
。
5. 使用正規表示式
正規表示式是 Java 中 URL 規範化的一種非常有用的機制。它們使您能夠指定許多與 URL 相符的模式和轉換,並根據您的需求進行變更。這是一個簡單的程式碼範例:
@Test
public void givenOriginalUrl_whenUsingRegularExpression_thenNormalizedUrl() throws URISyntaxException, UnsupportedEncodingException {
String regex = "^(https?://[^/]+/[^?#]+)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(originalUrl);
if (matcher.find()) {
String normalizedUrl = matcher.group(1);
assertEquals(expectedNormalizedUrl, normalizedUrl);
} else {
fail(originalUrl);
}
}
在上面的程式碼範例中,我們首先建立一個與 URL 的方案、網域和路徑元件相符的正規表示式pattern
。然後,我們將此模式轉換為表示正規表示式的Pattern
物件。此外,我們使用Matcher
將原始 URL 與給定模式進行比對。
此外,我們利用matcher.find()
方法來找出輸入序列中與regex
定義的模式相符的下一個子序列。如果matcher.find()
方法傳回 true, matcher.group(1)
會取出與regex
相符的子字串。在這種情況下,它專門捕獲regex
中第一個捕獲組的內容(以括號表示),這被認為是規範化的 URL。
六,結論
總之,我們探索了幾種方法,例如手動規範化、Apache Commons Validator 函式庫、Java 的 URI 類別以及 Java 中 URL 規範化的正規表示式。
與往常一樣,隨附的源代碼可以 在 GitHub 上找到。