如何将查询参数追加到现有 URL?

2022-08-31 11:41:22

我想将键值对作为查询参数附加到现有URL。虽然我可以通过检查URL是否存在查询部分或片段部分来做到这一点,并通过跳过一堆if子句来进行追加,但我想知道如果通过Apache Commons库或等效的东西来做到这一点,是否有干净的方法。

http://example.comhttp://example.com?name=John

http://example.com#fragmenthttp://example.com?name=John#fragment

http://example.com?email=john.doe@email.comhttp://example.com?email=john.doe@email.com&name=John

http://example.com?email=john.doe@email.com#fragmenthttp://example.com?email=john.doe@email.com&name=John#fragment

我以前运行过很多次这个场景,我想这样做,而不会以任何方式破坏URL。


答案 1

有很多库可以帮助您构建URI(不要重新发明轮子)。以下是帮助您入门的三个:


Java EE 7

import javax.ws.rs.core.UriBuilder;
...
return UriBuilder.fromUri(url).queryParam(key, value).build();

org.apache.httpcomponents:httpclient:4.5.2

import org.apache.http.client.utils.URIBuilder;
...
return new URIBuilder(url).addParameter(key, value).build();

org.springframework:spring-web:4.2.5.RELEASE

import org.springframework.web.util.UriComponentsBuilder;
...
return UriComponentsBuilder.fromUriString(url).queryParam(key, value).build().toUri();

另请参见:GIST > URI 生成器测试


答案 2

这可以通过使用java.net.URI类使用现有实例中的部分构造新实例来完成,这应该确保它符合URI语法。

查询部分将为 null 或现有字符串,因此您可以决定附加另一个参数 &或启动新查询。

public class StackOverflow26177749 {

    public static URI appendUri(String uri, String appendQuery) throws URISyntaxException {
        URI oldUri = new URI(uri);

        String newQuery = oldUri.getQuery();
        if (newQuery == null) {
            newQuery = appendQuery;
        } else {
            newQuery += "&" + appendQuery;  
        }

        return new URI(oldUri.getScheme(), oldUri.getAuthority(),
                oldUri.getPath(), newQuery, oldUri.getFragment());
    }

    public static void main(String[] args) throws Exception {
        System.out.println(appendUri("http://example.com", "name=John"));
        System.out.println(appendUri("http://example.com#fragment", "name=John"));
        System.out.println(appendUri("http://example.com?email=john.doe@email.com", "name=John"));
        System.out.println(appendUri("http://example.com?email=john.doe@email.com#fragment", "name=John"));
    }
}

更短的替代方案

public static URI appendUri(String uri, String appendQuery) throws URISyntaxException {
    URI oldUri = new URI(uri);
    return new URI(oldUri.getScheme(), oldUri.getAuthority(), oldUri.getPath(),
            oldUri.getQuery() == null ? appendQuery : oldUri.getQuery() + "&" + appendQuery, oldUri.getFragment());
}

输出

http://example.com?name=John
http://example.com?name=John#fragment
http://example.com?email=john.doe@email.com&name=John
http://example.com?email=john.doe@email.com&name=John#fragment