ホームページ >Java >&#&チュートリアル >Java で URI クエリ文字列を解析して名前と値のコレクションを作成する方法

Java で URI クエリ文字列を解析して名前と値のコレクションを作成する方法

DDD
DDDオリジナル
2024-12-26 19:25:10383ブラウズ

How to Parse a URI Query String into a Name-Value Collection in Java?

URI 文字列を名前と値のコレクションに解析する

概要

URI (Uniform Resource Identifier) を扱う場合、多くの場合、クエリ文字列を名前と値のペアのコレクションに変換します。 Java には、C#/.NET の HttpUtility.ParseQueryString メソッドに相当する組み込みメソッドはありません。ただし、カスタム コードを使用してこれを実現するさまざまな方法があります。

カスタム メソッドの使用

URI 文字列を解析して Map にする 1 つの方法は、カスタム メソッドを作成することです。以下は簡略化されたバージョンです:

public static Map<String, String> splitQuery(URL url) throws UnsupportedEncodingException {
    Map<String, String> queryPairs = new LinkedHashMap<>();
    String query = url.getQuery();
    String[] pairs = query.split("&");
    for (String pair : pairs) {
        int idx = pair.indexOf("=");
        queryPairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
    }
    return queryPairs;
}

URL デコードと複数のパラメーターの処理による改良されたメソッド

上記のメソッドは、同じキーを持つ複数のパラメーターと値のないパラメーターを処理できるように更新されました。改良版は次のとおりです:

public static Map<String, List<String>> splitQuery(URL url) throws UnsupportedEncodingException {
    final Map<String, List<String>> queryPairs = new LinkedHashMap<>();
    final String[] pairs = url.getQuery().split("&");
    for (String pair : pairs) {
        final int idx = pair.indexOf("=");
        final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), "UTF-8") : pair;
        if (!queryPairs.containsKey(key)) {
            queryPairs.put(key, new LinkedList<>());
        }
        final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), "UTF-8") : null;
        queryPairs.get(key).add(value);
    }
    return queryPairs;
}

Java 8 バージョン

メソッドの Java 8 バージョンは次のとおりです:

public Map<String, List<String>> splitQuery(URL url) {
    if (Strings.isNullOrEmpty(url.getQuery())) {
        return Collections.emptyMap();
    }
    return Arrays.stream(url.getQuery().split("&"))
            .map(this::splitQueryParameter)
            .collect(Collectors.groupingBy(SimpleImmutableEntry::getKey, LinkedHashMap::new, mapping(Map.Entry::getValue, toList())));
}

public SimpleImmutableEntry<String, String> splitQueryParameter(String it) {
    final int idx = it.indexOf("=");
    final String key = idx > 0 ? it.substring(0, idx) : it;
    final String value = idx > 0 && it.length() > idx + 1 ? it.substring(idx + 1) : null;
    return new SimpleImmutableEntry<>(URLDecoder.decode(key, StandardCharsets.UTF_8), URLDecoder.decode(value, StandardCharsets.UTF_8));
}

使用例

SplitQuery メソッドを使用します。URL オブジェクトを渡すだけで、解析されたクエリ文字列を含む Map が返されます。パラメータ:

URL url = new URL("https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback");
Map<String, String> queryParameters = splitQuery(url);

マップからの値へのアクセスは簡単です:

String clientId = queryParameters.get("client_id"); // SS

以上がJava で URI クエリ文字列を解析して名前と値のコレクションを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。