Maison > Java > javaDidacticiel > Comment analyser une chaîne de requête URI dans une collection nom-valeur en Java ?

Comment analyser une chaîne de requête URI dans une collection nom-valeur en Java ?

DDD
Libérer: 2024-12-26 19:25:10
original
445 Les gens l'ont consulté

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

Analyser une chaîne URI dans une collection nom-valeur

Vue d'ensemble

Lorsque vous traitez des URI (Uniform Resource Identifiers), il est souvent utile d'analyser le chaîne de requête dans une collection de paires nom-valeur. En Java, il n'existe pas de méthode intégrée équivalente à la méthode C#/.NET HttpUtility.ParseQueryString. Cependant, il existe différentes manières d'y parvenir à l'aide d'un code personnalisé.

Utilisation d'une méthode personnalisée

Une façon d'analyser une chaîne URI dans une carte consiste à créer une méthode personnalisée. Voici une version simplifiée :

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;
}
Copier après la connexion

Méthode améliorée avec décodage d'URL et gestion de plusieurs paramètres

La méthode ci-dessus a été mise à jour pour gérer plusieurs paramètres avec la même clé et des paramètres sans valeur. Voici la version améliorée :

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;
}
Copier après la connexion

Version Java 8

Voici une version Java 8 de la méthode :

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));
}
Copier après la connexion

Exemple d'utilisation

Pour utilisez la méthode splitQuery, transmettez simplement un objet URL et il renverra une carte contenant la chaîne de requête analysée paramètres :

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);
Copier après la connexion

L'accès aux valeurs de la carte est simple :

String clientId = queryParameters.get("client_id"); // SS
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal