Search code examples
javaurl

How can I append a query parameter to an existing URL?


I'd like to append key-value pair as a query parameter to an existing URL. While I could do this by checking for the existence of whether the URL has a query part or a fragment part and doing the append by jumping though a bunch of if-clauses but I was wondering if there was clean way if doing this through the Apache Commons libraries or something equivalent.

http://example.com would be http://example.com?name=John

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

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

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

I've run this scenario many times before and I'd like to do this without breaking the URL in any way.


Solution

  • java.net.URI

    This can be done by using the java.net.URI class to construct a new instance using the parts from an existing one, this should ensure it conforms to URI syntax.

    The query part will either be null or an existing string, so you can decide to append another parameter with & or start a new query.

    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"));
        }
    }
    

    Shorter alternative

    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());
    }
    

    Output

        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