2014-12-04 5 views
1

우리 도서관에 전달 된 모든 URL을 처리해야합니다. 처음에는 그래서 내가 그랬어 : URL을 http://www.stackoverflow.com?title = Člen8FO를 들어왜 url encode =가 필요합니까?

 URL url = new URL(filename); 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
     url = new URL(uri.toASCIIString()); 
     URLConnection conn = url.openConnection(); 

를이 나에게 http://www.stackoverflow.com?title=%C4%8Clen8FO

의 URL을 준 내가 요청을했을 때 그 403를 반환했습니다. 그럼 내가 그랬어 :

 URL url = new URL(filename); 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), URLEncoder.encode(url.getQuery(), "UTF-8"), url.getRef()); 
     url = new URL(uri.toASCIIString()); 

를 왜 명시 적 =에 실패하는 나에게 http://www.stackoverflow.com?title%3D%C4%8Clen8FO

의 URL을 제공 무엇입니까? 나는 이것이 완전히 유효하다고 생각했다.

업데이트 : 이것은 매우 이상합니다. 아래 코드는 실패했습니다. 이제 성공합니다. 물론 =이 인코딩되고, 그래서

import java.io.InputStream; 
import java.net.*; 

public class UriIssue { 

    public static void main(String[] args) { 

     try { 
      openUriWithEncode("http://www.google.com/?q=\u010clen8FO"); 
      System.out.println("completed successfully"); 
     } catch (Exception ex) { 
      System.out.println("exception = " + ex); 
     } 

     try { 
      openUriNoEncode("http://www.google.com/?q=\u010clen8FO"); 
      System.out.println("completed successfully"); 
     } catch (Exception ex) { 
      System.out.println("exception = " + ex); 
     } 

    } 

    public static void openUriWithEncode(String fullUrl) throws Exception { 

     System.out.println("openUriWithEncode(" + fullUrl + ")"); 
     URL url = new URL(fullUrl); 
     String query = url.getQuery() != null ? URLEncoder.encode(url.getQuery(), "UTF-8") : null; 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), query, url.getRef()); 
     System.out.println("uri = " + uri.toASCIIString()); 
     url = new URL(uri.toASCIIString()); 
     URLConnection conn = url.openConnection(); 
     InputStream stream = conn.getInputStream(); 
     stream.close(); 
    } 

    public static void openUriNoEncode(String fullUrl) throws Exception { 

     System.out.println("openUriNoEncode(" + fullUrl + ")"); 
     URL url = new URL(fullUrl); 
     URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
     System.out.println("uri = " + uri.toASCIIString()); 
     url = new URL(uri.toASCIIString()); 
     URLConnection conn = url.openConnection(); 
     InputStream stream = conn.getInputStream(); 
     stream.close(); 
    } 
} 
+0

이 예에서 url.getQuery()는 무엇을 반환합니까? – JamesB

+0

두 URL 모두 저에게 효과적 이었으므로 다시 확인하십시오. 그러나 URLEncoder.encode는 매개 변수의 값으로 사용해야합니다. URI 호출은 검색어를 URL 인코딩해야합니다. –

답변

1

당신은 = 포함한 전체 쿼리를 인코딩하고 있습니다. 키와 값만 인코딩하면됩니다 (예 :

URLEncoder.encode(key)+"="+URLEncoder.encode(value) 
+0

문제는 내가 =를 인코딩하지 않으면 실패한 것입니다. 그것은해서는 안됩니다. 그러나 이제는 모두 예상대로 작동합니다. 엄청 이상해. –

+0

@DavidThielen 나는 당신이 원래의 문제를 잘못 파악한 것을 제안한다. – EJP

+0

일 수 있습니다. 하지만 그것은 내가 달린 코드이며 그 문제가 발생했습니다. 나는 처음으로 내 컴퓨터에서 뭔가 이상하게 여겨 질 수도 있다고 생각하고있다. –