1. ホーム
  2. java

[解決済み] 既存のURLにクエリパラメータを追加するにはどうすればよいですか?

2023-06-04 22:11:39

質問

既存のURLにクエリパラメータとしてKey-Valueペアを追加したいです。URLにクエリ部分があるかフラグメント部分があるかをチェックし、if節をいくつも飛び越えて追加することでこれを行うことができますが、Apache Commonsライブラリまたは同等の何かを通してこれを行う場合、きれいな方法があるのではないかと思っていました。

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

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

http://[email protected]http://[email protected]&name=John

http://[email protected]#fragmenthttp://[email protected]&name=John#fragment

このシナリオはこれまでに何度も実行したことがあり、URLを何らかの方法で壊すことなくこれを行いたいと思います。

どのように解決するのですか?

これは 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://[email protected]", "name=John"));
        System.out.println(appendUri("http://[email protected]#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://[email protected]&name=John
http://[email protected]&name=John#fragment