Java中规范化URL三种方式

统一资源定位器 (URL)是 Web 开发的重要组成部分,因为它们有助于定位和获取Internet上的资源。然而,URL 可能不一致或格式不正确;这可能会导致加工和获取所需材料出现问题。

URL规范化将给定的数据转换为规范形式,确保一致性并促进可操作性。

在本教程中,我们将研究在 Java 中标准化 URL 的不同技术。

手动标准化
执行手动标准化涉及应用自定义逻辑来标准化 URL。 此过程包括删除无关元素,例如不必要的查询参数和片段标识符,以将 URL 提炼为其基本核心。假设我们有以下 URL:

https://www.example.com:8080/path/to/resource?param1=value1&m2=value2fragment

规范化的 URL 应如下所示:

https://www.example.com:8080/path/to/resource

1、使用 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&param2=value2fragment";
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的等价性。

2、利用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 。

3、使用正则表达式
正则表达式是 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对象。此外,我们使用Matcher将原始 URL 与给定模式进行匹配。

此外,我们利用matcher.find()方法来查找输入序列中与 regex 定义的模式匹配的下一个子序列。如果matcher.find()方法返回 true,则matcher.group(1)会取出与regex匹配的子字符串。在这种情况下,它专门捕获正则表达式中第一个捕获组的内容(用括号表示),这被认为是规范化的 URL。

结论
总之,我们探索了几种方法,例如手动规范化、Apache Commons Validator 库、Java 的 URI 类以及 Java 中 URL 规范化的正则表达式。