372 Stimmen

Parsen einer URI-Zeichenkette in eine Name-Werte-Sammlung

Ich habe die URI so eingestellt:

https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback

Ich brauche eine Sammlung mit geparsten Elementen:

NAME               VALUE
------------------------
client_id          SS
response_type      code
scope              N_FULL
access_type        offline
redirect_uri       http://localhost/Callback

Um genau zu sein, brauche ich ein Java-Äquivalent für die C#/.NET HttpUtility.ParseQueryString Methode.

0voto

Aarish Ramesh Punkte 6125

Nur ein Update auf die Java 8 Version

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, **Collectors**.mapping(Map.Entry::getValue, **Collectors**.toList())));
}

mapping und toList()-Methoden müssen mit Collectors verwendet werden, was in der ersten Antwort nicht erwähnt wurde. Andernfalls würde es zu einem Kompilierungsfehler in der IDE kommen.

0voto

aimilin Punkte 11

En Hutool Framework unterstützt dies durch HttpUtil. Beispiel:

import cn.hutool.http.HttpUtil;

    String 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, List<String>> stringListMap = HttpUtil.decodeParams(url, "UTF-8");
    System.out.println("decodeParams" + stringListMap);

Sie werden bekommen:

decodeParams{client_id=[SS], response_type=[code], scope=[N_FULL], access_type=[offline], redirect_uri=[http://localhost/Callback]}

0voto

mancini0 Punkte 3635

Wenn Sie Spring verwenden, fügen Sie ein Argument vom Typ @RequestParam Map<String,String> zu Ihrer Controller-Methode hinzufügen, und Spring wird die Karte für Sie erstellen!

0voto

Adam Winter Punkte 1233

Einfaches Java, keine speziellen Bibliotheken, nichts Ausgefallenes

    // assumes you are parsing a line that looks like:
    // /path/resource?key=value&parameter=value
    // which you got from a request header line that looks like:
    // GET /path/resource?key=value&parameter=value HTTP/1.1

    public HashMap<String, String> parseQuery(String path){
        if(path == null || path.isEmpty()){         //basic sanity check
            return null;
        }
        int indexOfQ = path.indexOf("?");           //where the query string starts
        if(indexOfQ == -1){return  null;}           //check query exists
        String queryString = path.substring(indexOfQ + 1);
        String[] queryStringArray = queryString.split("&");
        Map<String, String> kvMap = new HashMap<>();
        for(String kvString : queryStringArray){
            int indexOfE = kvString.indexOf("=");      //check query is formed correctly
            if(indexOfE == -1 || indexOfE == 0){return  null;}
            String[] kvPairArray = kvString.split("=");
            kvMap.put(kvPairArray[0], kvPairArray[1]);
        }

        return kvMap;
    }

0voto

Sudhir N Punkte 3978

In groovy

    static Map parseQueryParams(String queryString) {
        if(!queryString) return [:]
        queryString.split("&")
            .collect({ it.split("=") })
            .collectEntries { String[] arr ->
                String k = arr.length > 0 ? arr[0] : ""
                String v = arr.length > 1 ? arr[1] : ""
                return [decode(k), decode(v)]
            }
    }

    private static String decode(String s) {
        URLDecoder.decode(s, StandardCharsets.UTF_8.toString())
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X