使用Java规范化URL

2025/03/13

1. 简介

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

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

在本教程中,我们将研究在Java中规范化URL的不同技术

2. 手动规范化

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

https://www.example.com:8080/path/to/resource?param1=value1&param2=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&param2=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对象。此外,我们使用Matcher将原始URL与此给定模式进行匹配。

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

6. 总结

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

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章