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的UriBuilderspring-web来添加查询参数。这些方法确保URL结构的完整性,同时允许我们动态构建它们。

选择哪种方法取决于我们的应用已有的包和依赖,以及我们已经使用的库。每个库都带来了一定的功能,因此我们也应该考虑是否能在项目中同时满足其他需求。

如往常一样,所有示例的完整代码可以在GitHub上查看:https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-networking-4