2011-04-29 2 views
1

이 동작은 고의적입니까?Java URI 클래스 : 생성자는 쿼리가 인코딩되는지 여부를 결정합니다.

//create the same URI using two different constructors 

URI foo = null, bar = null; 
try { 
    //constructor: URI(uri string) 
    foo = new URI("http://localhost/index.php?token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB"); 
} catch (URISyntaxException e) {} 
try { 
    //constructor: URI(scheme, authority, path, query, fragment) 
    bar = new URI("http", "localhost", "/index.php", "token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB", null); 
} catch (URISyntaxException e) {} 

//the output: 
//foo.getQuery() = token=4/4EzdsSBg_4vX6D5pzvdsMLDoyItB 
//bar.getQuery() = token=4%2F4EzdsSBg_4vX6D5pzvdsMLDoyItB 

URI (string uri) 생성자가 URI의 쿼리 부분을 디코딩하는 것으로 보입니다. 쿼리 부분을 인코딩해야한다고 생각 했나요? 왜 다른 생성자가 쿼리 부분을 디코딩하지 않습니까? URI JavaDoc에서

+0

당신은 당신의 형식 게시물 읽기 쉽도록 수정하시기 바랍니다 수 있을까요? – Thomas

답변

1

:

단일 인자 생성자는 인용되는 인수에 불법 문자를 필요로하고 어떤 진수와 현재의 다른 문자를 탈출 유지합니다.

다중 인수 구성자는 나타나는 구성 요소에서 요구하는대로 잘못된 문자를 인용합니다. 백분율 문자 ('%')는 항상 이러한 생성자에 의해 인용됩니다. 다른 문자는 보존됩니다.

는 따라서 URI (String)를 올바르게 모든 인코딩 할 것으로 예상하고 %2F는 가정 같은 / 디코딩 될 octed 인코딩.

다른 생성자 (입력 %2F에 대한 %252F 결과)를 % 문자를 ENDCODE 때문에 당신을 디코딩 한 후 여전히 %2F를 얻을 것입니다.

new URI(otherUri.toString())toString()이 완전히 인코딩 된 URI를 반환하는 것을 허용하는 것이 생성자 간의 편차의 목적이라고 가정합니다.

+0

이것은 흥미 롭습니다. 고맙습니다. 오라클의 JavaDoc을 기억해야합니다. 안드로이드 참조의 문서는 비교할 때 훨씬 더 희소합니다. – mihakase

0

빠른 분석 :

foo를

생성자는 URI를 입력 분석하고 /에 문자를 %2F unquotes. 이것은 우리가 기대하는 것입니다.

바 바 실시 예에 사용 된 생성자

가 상기 단편 일부 잘못된 문자 및 로 날 문자열로 간주된다 %2F%252F로 변환된다는 효과, 먼저 인코딩. 그러면이 구문 분석되고 이제 인용되지 않은 쿼리 부분은 (다시) %2F이됩니다.

교훈 : 첫 번째 생성자를 사용하여 RFC 2396 호환 URI를 전달합니다. 다른 생성자는 이 보통 문자열 (따옴표로 묶인 불법 문자)이고 URI은 RFC 2396 호환 표현을 생성합니다.

Here's a working example on IDEONE (with extra supporting output)

+0

(실생활에'InterruptedException'을 받았기 때문에 대답이 조금 늦었지만 토마스의 답변도 지원하는 이데one 링크 때문에 떠나기로했다) –

관련 문제