1. 概述
在Java中,我们可以通过多种库动态地向URL添加查询参数,同时保持URL的有效性。
本文将介绍如何使用其中三种方法。每种方法都能完成相同的任务,因此产生的URL会是一样的。
2. Java EE 7 中的 UriBuilder
**最接近内置Java解决方案的是javax.ws.rs-api
中的UriBuilder
**,我们需要将其导入到pom.xml
中:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.1.1</version>
</dependency>
最新的版本可以在Maven仓库中找到。为了运行应用,我们可能还需要导入jersey-commons
库:
@Test
void whenUsingJavaUriBuilder_thenParametersAreCorrectlyAdded() {
String url = "baeldung.com";
String key = "article";
String value = "beta";
URI uri = UriBuilder.fromUri(url)
.queryParam(key, value)
.build();
assertEquals("baeldung.com?article=beta", uri.toString());
}
UriBuilder
对象提供了fromUri()
方法来创建基URI,并通过queryParam()
方法添加查询参数。然后调用build()
方法返回一个URI
:
@Test
void whenUsingJavaUriBuilder_thenParametersAreCorrectlyAdded() {
String url = "baeldung.com";
String key = "article";
String value = "beta";
URI uri = UriBuilder.fromUri(url)
.queryParam(key, value)
.build();
assertEquals("baeldung.com?article=beta", uri.toString());
}
如上所示,URL如预期般附带了附加的查询参数。
3. Apache 的 UriBuilder
Apache 提供了自己的解决方案——UriBuilder,位于HttpClient
包中。要在应用中使用它,需要将其添加到pom.xml
中:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
最新的版本可以在Maven仓库中找到。
使用时,首先使用基础URL的String
构造URIBuilder
对象,然后使用addParameter()
方法添加参数,最后调用build()
:
@Test
void whenUsingApacheUriBuilder_thenParametersAreCorrectlyAdded() {
String url = "baeldung.com";
String key = "article";
String value = "alpha";
URI uri = new URIBuilder(url).addParameter(key, value)
.build();
assertEquals("baeldung.com?article=alpha", uri.toString());
}
4. Spring 的 UriComponentsBuilder
如果你的应用使用了Spring,使用Spring提供的UriComponentsBuilder
可能更合适。在pom.xml
中添加spring-web
依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.0.6</version>
</dependency>
最新的版本可在Maven仓库中找到。
我们可以使用UriComponentsBuilder
创建URI,通过fromUriString()
初始化,然后用queryParam()
添加查询参数:
@Test
void whenUsingSpringUriComponentsBuilder_thenParametersAreCorrectlyAdded() {
String url = "baeldung.com";
String key = "article";
String value = "charlie";
URI uri = UriComponentsBuilder.fromUriString(url)
.queryParam(key, value)
.build()
.toUri();
assertEquals("baeldung.com?article=charlie", uri.toString());
}
与前两者不同的是,build()
方法返回一个UriComponents
对象,为了得到一个URI
,还需要调用toURI()
。
5. 总结
在这篇文章中,我们了解了在Java中处理URL的三种方式。我们可以使用Java扩展包、Apache的UriBuilder
或spring-web
来添加查询参数。这些方法确保URL结构的完整性,同时允许我们动态构建它们。
选择哪种方法取决于我们的应用已有的包和依赖,以及我们已经使用的库。每个库都带来了一定的功能,因此我们也应该考虑是否能在项目中同时满足其他需求。
如往常一样,所有示例的完整代码可以在GitHub上查看:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-networking-4。