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
380 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!

source:php.cn
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