개발/안드로이드 개발
getQueryParameter를 사용하면 encode url은 어떻게 될까?
룬아님
2019. 9. 5. 15:48
외부 스킴을 사용하여 앱을 킬때에 encode되어있는 url을 포함하여 넘겨줄 때가 있다.
myScheme://info?url=%2fsomething
-> myScheme://info?url=/something
이때 받는 쪽에서 Uri객체의 getQueryParameter() 함수를 사용하면 encode되어있는 url이 자동으로 decode되기 때문에 따로 decode처리를 해줄 필요가 없다.
String url = uri.getQueryParameter("url");
//url = "/something"
아래는 getQueryParameter의 코드이다.
@Nullable
public String getQueryParameter(String key) {
if (isOpaque()) {
throw new UnsupportedOperationException(NOT_HIERARCHICAL);
}
if (key == null) {
throw new NullPointerException("key");
}
final String query = getEncodedQuery();
if (query == null) {
return null;
}
final String encodedKey = encode(key, null);
final int length = query.length();
int start = 0;
do {
int nextAmpersand = query.indexOf('&', start);
int end = nextAmpersand != -1 ? nextAmpersand : length;
int separator = query.indexOf('=', start);
if (separator > end || separator == -1) {
separator = end;
}
if (separator - start == encodedKey.length()
&& query.regionMatches(start, encodedKey, 0, encodedKey.length())) {
if (separator == end) {
return "";
} else {
String encodedValue = query.substring(separator + 1, end);
return UriCodec.decode(encodedValue, true, StandardCharsets.UTF_8, false);
}
}
// Move start to end of name.
if (nextAmpersand != -1) {
start = nextAmpersand + 1;
} else {
break;
}
} while (true);
return null;
}
반응형