2011-09-09 2 views
8

나는 쿼리 문자열을 조작하기 위해 java.net.URI를 사용하려고 시도했지만 한 URL에서 쿼리 문자열을 가져 와서 다른 쿼리 문자열에 배치하는 것과 같은 매우 간단한 작업에도 실패했습니다. java.net.URI 사용 방법

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
      "http", 
      "domain", 
      "/a-path", 
      sample.getRawQuery(), 
      sample.getFragment()); 

전화 uri2.toASCIIString()에 반환해야 작업 아래에이 코드를 만드는 방법을 알고 수행 http://domain/a-path?param1=x%3D1 을하지만 반환 http://domain/a-path?param1=x%253D1 (이중 인코딩)

내가 getQuery를 (사용하는 경우) 대신 getRawQuery() 쿼리 문자열은 전혀 인코딩되지 않으며 URL은 다음과 같이 보입니다. http://domain/a-path?param1=x=1

답변

1

문제는 두 번째 생성자가 qu ery 및 fragment는 URL 인코딩을 사용합니다. 그러나 =은 합법적 인 URI 문자이므로 인코딩 할 수 없습니다. %은 유효한 URI 문자가 아니므로 으로 인코딩됩니다. 이것은 정확히 당신이 원하는 것과 반대입니다.

따라서 두 번째 생성자를 사용할 수 없습니다. 문자열의 일부를 직접 연결하여 첫 번째 문자열을 사용하십시오.

+0

좋은 설명. 따라서 URI 인터페이스는 제대로 설계되지 않았습니다 (두 번째 생성자에 대한 이유는 거의 없습니다). 더 나은 URI 클래스를 알고 계십니까? 날짜/캘린더 클래스를 대체하는 joda-time과 같은가? –

+0

아니요, 저는 아닙니다 ... 그리고'URI'는 이미 이전의'java.net.URL' 클래스의 재 작성이었습니다. – Jesper

0

java.net.URLEncoder.encode(String)으로 전화를 걸어 getQuery()으로 전화를 걸 수 있습니까?

URI sample = new URI("test?param1=x%3D1"); 
URI uri2 = new URI(
     "http", 
     "domain", 
     "/a-path", 
     URLEncoder.encode(sample.getQuery(), "UTF-8"), 
     sample.getFragment()); 
+0

확인해 보셨습니까? 'URLEncoder.encode (sample.getQuery())'는'sample.getRawQuery()'와 다소 동일하므로 여러분은 내가 가지고있는 것과 같은 문제로 끝날 것입니다 –