HttpURLConnection reading response content on 403 error

65,711

Solution 1

The HttpURLConnection.getErrorStream method will return an InputStream which can be used to retrieve data from error conditions (such as a 404), according to the javadocs.

Solution 2

Usage example of HttpURLConnection :

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();
}

Solution 3

try something like this:

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();
}

Solution 4

try this:

BufferedReader reader = new BufferedReader(new InputStreamReader(con.getResponseCode() / 100 == 2 ? con.getInputStream() : con.getErrorStream()));

source https://stackoverflow.com/a/30712213/505623

Share:
65,711

Related videos on Youtube

yava
Author by

yava

Updated on April 30, 2020

Comments

  • yava
    yava about 4 years

    When I fetch data from an URL with a 403 response

    is = conn.getInputStream();
    

    It throws an IOException and I can't get the response data.

    But when I use firefox and access that url directly, The ResponseCode is still 403, but I can get the html content

  • Dunith Dhanushka
    Dunith Dhanushka almost 11 years
    This worked like a charm!
  • Gangnus
    Gangnus about 10 years
    No, it won't, for the code of the function contains only 'return null;' line. (Java 6,7)
  • Miljen Mikic
    Miljen Mikic almost 10 years
    @Gangnus Read the Javadoc carefully: "If the connection was not connected, or if the server did not have an error while connecting or if the server had an error but no error data was sent, this method will return null. This is the default." Otherwise (errors 4xx), you will get the stream to read from.
  • Gangnus
    Gangnus almost 10 years
    @MiljenMikic The difference between code and Javadoc means only that the last one is erroneous.
  • Miljen Mikic
    Miljen Mikic almost 10 years
    @Gangnus HttpURLConnection is abstract class. Concrete implementation works exactly as explained in Javadoc.
  • Gangnus
    Gangnus almost 10 years
    @MiljenMikic It is abstract. But this function already IS there as I say. There is no "missing implement exception". And concrete implementation works as you write it. You CAN override the parent's function, but you needn't. The Javadoc is erroneous and helps to make more errors.
  • slf
    slf over 9 years
    I thought it had to be (code >= 200) && (code < 300)
  • qwertzguy
    qwertzguy over 9 years
    @slf You're right. It actually depends on the implementation and the only "official" way is to check if getErrorStream returns null, but that only works after forcing the request to be executed. I update my code to reflect this.