룬아님의 취중코딩

getQueryParameter를 사용하면 encode url은 어떻게 될까? 본문

개발/안드로이드 개발

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;
}
반응형
Comments