首頁 >Java >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(統一資源標識符)時,解析查詢字串轉換為名稱-值對的集合。在 Java 中,沒有與 C#/.NET HttpUtility.ParseQueryString 方法等效的內建方法。但是,有多種方法可以使用自訂程式碼來實現此目的。

使用自訂方法

將 URI 字串解析為 Map 的一種方法是建立自訂方法。這是一個簡化版本:

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

使用範例

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
至使用範例至至使用範例至至使用範例至至至使用splitQuery 方法,只需傳入一個URL 對象,它將傳回一個包含解析後的查詢字串的Map參數:從地圖存取值很簡單:

以上是如何在 Java 中將 URI 查詢字串解析為名稱-值集合?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn