> Java > java지도 시간 > Java에서 URI 쿼리 문자열을 이름-값 컬렉션으로 구문 분석하는 방법은 무엇입니까?

Java에서 URI 쿼리 문자열을 이름-값 컬렉션으로 구문 분석하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-26 19:25:10
원래의
433명이 탐색했습니다.

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

URI 문자열을 이름-값 컬렉션으로 구문 분석

개요

URI(Uniform Resource Identifiers)를 처리할 때 이름-값 쌍 컬렉션에 문자열을 쿼리합니다. 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));
}
로그인 후 복사

사용 예

To SplitQuery 메소드를 사용하여 간단히 URL 객체를 전달하면 구문 분석된 쿼리 문자열이 포함된 맵이 반환됩니다. 매개변수:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿