2012-10-01 6 views
-1

URI의 쿼리 문자열 부분에 공백 (')이있을 때 URLConnection.getInputStream()에 관한 정말 기괴한 문제가 있습니다. 구체적으로 말하자면, 작동하는 URL 하나와 그렇지 않은 URL이 있습니다.URLConnection.getInputStream()의 URL을 이스케이프 처리하는 적절한 방법은 무엇입니까?

작업 URL : http://minneapolis.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss 실패 URL (아래 제외) : http://winnipeg.en.craigslist.ca/search/sss?catAbb=sss&query=iPhone 질주 두 & 종류 = 날짜 & srchType = 인덱스 67에서 쿼리에 "잘못된 문자 : http://winnipeg.craigslist.ca/search/sss?catAbb=sss&query=iPhone+sprint&sort=date&srchType=A&format=rss

conn.getInputStream()는 IO 예외가 발생합니다 A & format = rss "

openConnection은 'URL'이 있어야 할 것으로 기대 했으므로 '+'로 이미 대체 된 공간을 확보 할 수 없습니다. '% 20'은 (는) 같은 결과를 나타냅니다.

또한 URL.toString()은 위에서 인쇄 한대로 URL을보고합니다. '+'는 공백이 아닙니다.

코드는 다음과 같습니다. searchUrl은 'URL'인스턴스입니다.

 URLConnection conn = null; 
     conn = searchUrl.openConnection(); 
     conn.setConnectTimeout(CONNECT_TIMEOUT); 
     conn.setUseCaches(true); 
     conn.setAllowUserInteraction(false); 

     ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 
     InputStream istream = conn.getInputStream(); 
     int numBytesRead, numBytesWritten = 0; 
     byte[] buffer = new byte[8 * 1024]; 
     while ((numBytesRead = istream.read(buffer, 0, 8 * 1024)) > 0) { 
      oStream.write(buffer, numBytesWritten, numBytesRead); 
      numBytesWritten += numBytesRead; 
     } 

어디에서이 문제를 해결할 계획이 있습니까? URLConnection을 투구하고 다른 경로로 이동하려고합니다. ...

감사합니다. Kenny.

+0

나는 당신이 당신의 질문에 실수를했다고 생각합니다. URL은 모두 "iPhone Sprint"를 검색하지만 오류 메시지는 URL이 "iPhone sprint two"라고 표시합니다. ** 실제 ** URL 및 ** 실제 ** 오류 메시지로 질문을 수정하십시오. –

+0

""이 원래 인코딩 된 URL이 아닌 리디렉션 URL에있는 문제가 숨겨졌습니다. 리디렉션을 가로 채고 결과에 매개 변수를 인코딩했습니다. 그래서 본질적으로 문제는 내가 부적절한 리다이렉션을 만드는 것에 접근하고있는 웹 사이트에 있었다. – Kenny

답변

-1

당신이

다음 URLEncoder.encode(string, "UTF-8")을 시도 했는 예입니다

교체 귀하의 질문에 문제가 있습니다

String url = "http://somesite.com/page?user=" + user; 

String url = "http://somesite.com/page?user=" 
+ URLEncoder.encode(user, "UTF-8"); 
-1
String url= URLEncoder.encode("your URL without http or your query string part here"); 
URL searchUrl = new URL("http://" + url); 
URLConnection conn = null; 
conn = searchUrl.openConnection(); 
1

(SE 내 의견).

그러나 근본적인 문제는 쿼리 부분에 공백 문자가있는 URL이 합법적 인 URL이 아니며 일반적인 웹 브라우저가이를 받아들이지 않는다는 것입니다. 따라서 예외는 정확합니다.

URL의 예는 공간이 '+'로 이스케이프 처리 된 것으로 보입니다. 이것은 적절한 URL 이스케이프가 아닌 HTML 형식입니다. 당신은 똑같은 결과를 얻는다는 말을하는 것 같습니다. %20 ... 정확한 이스케이프가 될 것입니다.

제 이론은 실제로이 URL을 이스케이프를 제거하는 경로를 통해 코드에 전달한다는 것입니다. 여러분의 흔적이 여러분에게 말하는 것처럼 보이지 않습니다. 제안 다른 답변의 일부로서 UrlEncoder.encode를 호출하여 문제를 해결,


FWIW (내가 SSCE을 볼 수 있다면 우리는 ...이 이론을 테스트 할 수있을 거라고하는) 나쁜 생각입니다. 문제는 인코딩해서는 안되는 다른 문자를 "인코딩"할 가능성이 높다는 것입니다.

0

URL 자체는 새로운 URI (null, url, null) .toASCIIString()으로 인코딩하는 것이 가장 좋습니다.

쿼리 문자열의 각 키와 값은 URLEncoder.encode()를 사용하여 개별적으로 인코딩 할 수 있습니다. RFC 2936에 따르면 이것은 올바르지 않으며 모든 것이 URL 자체로 인코딩되어야하지만 실패한 것을 본 적이 없습니다.

관련 문제