[java] Android에서 쿼리 문자열 구문 분석

Java EE에는 ServletRequest.getParameterValues ​​()가 있습니다.

비 EE 플랫폼에서 URL.getQuery ()는 단순히 문자열을 반환합니다.

Java EE에 있지 않을 때 URL에서 쿼리 문자열을 올바르게 구문 분석하는 일반적인 방법은 무엇입니까 ?


< 랜트 >

자신의 파서를 시도하고 만드는 대답에서 인기가 있습니다. 이것은 매우 재미 있고 흥미 진진한 마이크로 코딩 프로젝트이지만, 나는 그것이 좋은 생각이라고 말할 수 없습니다 🙁

아래 코드 스 니펫은 일반적으로 결함이 있거나 끊어집니다 (btw). 그것들을 깨는 것은 독자에게 흥미로운 연습입니다. 그리고 해커들은이를 사용하는 웹 사이트를 공격합니다 .

쿼리 문자열 구문 분석은 잘 정의 된 문제이지만 사양을 읽고 뉘앙스를 이해하는 것은 쉽지 않습니다. 일부 플랫폼 라이브러리 코더가 열심히 작업하고 수정 작업을 수행하는 것이 훨씬 좋습니다!

< / rant >



답변

Android M 이후 더 복잡해졌습니다. android.net.URI .getQueryParameter () 의 대답은 JellyBean 앞의 공백을 깨는 버그가 있습니다.
Apache URLEncodedUtils.parse () 는 작동했지만 L 에서는 더 이상 사용되지 않으며 M 에서는 제거되었습니다 .

따라서 가장 좋은 대답은 UrlQuerySanitizer 입니다. API 레벨 1부터 존재했지만 여전히 존재합니다. 또한 특수 문자 또는 반복되는 값을 처리하는 방법과 같은 까다로운 문제에 대해 생각하게합니다.

가장 간단한 코드는

UrlQuerySanitizer.ValueSanitizer sanitizer = UrlQuerySanitizer.getAllButNullLegal();
// remember to decide if you want the first or last parameter with the same name
// If you want the first call setPreferFirstRepeatedParameter(true);
sanitizer.parseUrl(url);
String value = sanitizer.getValue("paramName"); // get your value

기본 구문 분석 동작에 만족하면 다음을 수행 할 수 있습니다.

new UrlQuerySanitizer(url).getValue("paramName")

그러나 기본 구문 분석 동작이 무엇인지 이해해야합니다. 원하는 동작이 아닐 수도 있습니다.


답변

안드로이드 :

import android.net.Uri;

[...]

Uri uri=Uri.parse(url_string);
uri.getQueryParameter("para1");


답변


답변

다음은 BalusC의 답변 이지만 컴파일하고 결과를 반환합니다.

public static Map<String, List<String>> getUrlParameters(String url)
        throws UnsupportedEncodingException {
    Map<String, List<String>> params = new HashMap<String, List<String>>();
    String[] urlParts = url.split("\\?");
    if (urlParts.length > 1) {
        String query = urlParts[1];
        for (String param : query.split("&")) {
            String pair[] = param.split("=");
            String key = URLDecoder.decode(pair[0], "UTF-8");
            String value = "";
            if (pair.length > 1) {
                value = URLDecoder.decode(pair[1], "UTF-8");
            }
            List<String> values = params.get(key);
            if (values == null) {
                values = new ArrayList<String>();
                params.put(key, values);
            }
            values.add(value);
        }
    }
    return params;
}


답변

클래스 경로에 jetty (서버 또는 클라이언트) 라이브러리가있는 경우 jetty util 클래스 ( javadoc 참조 )를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

import org.eclipse.jetty.util.*;
URL url = new URL("www.example.com/index.php?foo=bar&bla=blub");
MultiMap<String> params = new MultiMap<String>();
UrlEncoded.decodeTo(url.getQuery(), params, "UTF-8");

assert params.getString("foo").equals("bar");
assert params.getString("bla").equals("blub");


답변

Spring 3.1 이상을 사용하는 경우 (좋아요, 지원이 더 나아지기를 바랐습니다) UriComponentsand UriComponentsBuilder:

UriComponents components = UriComponentsBuilder.fromUri(uri).build();
List<String> myParam = components.getQueryParams().get("myParam");

components.getQueryParams() 를 반환 MultiValueMap<String, String>

더 많은 문서가 있습니다.


답변

서블릿 또는 JSP 페이지의 경우 request.getParameter ( “paramname”)을 사용하여 쿼리 문자열 키 / 값 쌍을 얻을 수 있습니다.

String name = request.getParameter("name");

다른 방법이 있지만 내가 만든 모든 서블릿 및 jsp 페이지에서 수행하는 방식입니다.