[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");
답변
Android에서 Apache 라이브러리는 쿼리 파서를 제공합니다.
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html 및 http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ http / client / utils / URLEncodedUtils.html
답변
다음은 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 이상을 사용하는 경우 (좋아요, 지원이 더 나아지기를 바랐습니다) UriComponents
and 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 페이지에서 수행하는 방식입니다.