1. 简介
统一资源定位符(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对象。此外,我们使用Matcher将原始URL与此给定模式进行匹配。
此外,我们利用matcher.find()方法查找输入序列中与regex定义的模式匹配的下一个子序列,如果matcher.find()方法返回true,则matcher.group(1)取出与regex匹配的子字符串。在这种情况下,它专门捕获regex中第一个捕获组的内容(用括号表示),该组被认为是规范化的URL。
6. 总结
总之,我们探索了几种方法,例如手动规范化、Apache Commons Validator库、Java的URI类以及Java中用于URL规范化的正则表达式。
Post Directory
