2011-01-08 5 views
32

내가 403 응답HttpURLConnection의 403 오류에 응답 콘텐츠를 읽고

is = conn.getInputStream(); 

그것은 IOException를 슬로우 내가 응답 데이터를 얻을 수와 함께 URL에서 데이터를 가져올 때. 나는 파이어 폭스를 사용하고 직접 해당 URL을 액세스 할 때

는하지만, 응답 코드는 여전히 403입니다,하지만 난합니다 (HttpURLConnection.getErrorStream 방법은 오류 상태에서 데이터를 검색하는 데 사용할 수있는 InputStream를 반환합니다

답변

53

HTML 콘텐츠를 얻을 수 있습니다 (예 : 404), javadocs에 따라. 이 같은

+3

아니요, 함수의 코드에 'return null;'만 포함되어 있습니다. 선. (Java 6,7) – Gangnus

+2

@Gangnus Javadoc을주의 깊게 읽으십시오. "연결이 연결되지 않았거나 연결하는 동안 서버에 오류가 없거나 서버에 오류가 있지만 오류 데이터가 전송되지 않은 경우이 메서드는 null가 돌려 주어집니다. 이것이 디폴트입니다. 그렇지 않으면 (오류 4xx) 스트림을 읽을 수있게됩니다. –

+0

@MiljenMikic 코드와 Javadoc의 차이점은 마지막 코드가 잘못되었음을 의미합니다. – Gangnus

10

시도 뭔가 : HttpURLConnection

try { 
    String text = "url"; 
    URL url = new URL(text); 
    URLConnection conn = url.openConnection(); 
    // fake request coming from browser 
    conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;  rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 (.NET CLR 3.5.30729)"); 
    BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 
    String f = in.readLine(); 
    in.close(); 
    System.out.println(f); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 
+0

이것은 매력처럼 작동했습니다! –

16

사용 예 :

String response = null; 
try { 
    URL url = new URL("http://google.com/pagedoesnotexist"); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

    // Hack to force HttpURLConnection to run the request 
    // Otherwise getErrorStream always returns null 
    connection.getResponseCode(); 
    InputStream stream = connection.getErrorStream(); 
    if (stream == null) { 
     stream = connection.getInputStream(); 
    } 
    // This is a try with resources, Java 7+ only 
    // If you use Java 6 or less, use a finally block instead 
    try (Scanner scanner = new Scanner(stream)) { 
     scanner.useDelimiter("\\Z"); 
     response = scanner.next(); 
    } 
} catch (MalformedURLException e) { 
    // Replace this with your exception handling 
    e.printStackTrace(); 
} catch (IOException e) { 
    // Replace this with your exception handling 
    e.printStackTrace(); 
} 
+0

나는'(code> = 200) && (code <300)'이어야한다고 생각했다. – slf

+0

@slf 네 말이 맞아. 실제로는 구현에 의존하며, 유일한 "공식적인"방법은'getErrorStream'이 null을 반환하는지 확인하는 것입니다.하지만 이는 요청 실행을 강제 한 후에 만 ​​작동합니다. 이를 반영하도록 코드를 업데이트합니다. – qwertzguy

0

에이전트 문자열을 추가 한 후에도 동일한 오류가 발생합니다. 마지막으로 일간 조사가 문제를 알아 냈습니다. URL 체계가 "HTTPS"로 시작하면 오류 403이 발생하며 실제로는 소용이 없습니다. 소문자 ("https") 여야합니다. 따라서 연결을 열기 전에 "url.toLowercase()"를 호출하십시오.

관련 문제