HttpURLConnection reading response content on 403 error [duplicate]
Asked Answered
A

5

47

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

Arielle answered 8/1, 2011 at 8:7 Comment(0)
P
78

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.

Prober answered 8/1, 2011 at 8:14 Comment(5)
No, it won't, for the code of the function contains only 'return null;' line. (Java 6,7)Tobietobin
@Tobietobin 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.Panada
@MiljenMikic The difference between code and Javadoc means only that the last one is erroneous.Tobietobin
@Tobietobin HttpURLConnection is abstract class. Concrete implementation works exactly as explained in Javadoc.Panada
@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.Tobietobin
A
23

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();
}
Allow answered 30/11, 2011 at 16:47 Comment(2)
I thought it had to be (code >= 200) && (code < 300)Amandy
@Amandy 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.Allow
P
15

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();
}
Perfectionism answered 8/1, 2011 at 10:19 Comment(0)
S
5

try this:

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

source https://mcmap.net/q/372234/-how-to-parse-json-response-from-401-status-code-android

Subplot answered 30/11, 2015 at 6:27 Comment(0)
R
0

I got the same error even after adding agent string. Finally after a days investigation figured out the issue. It is really weired if the url scheme start with "HTTPS" it results in error 403. It should be in lowercase ("https"). So make sure you call "url.toLowercase()" before opening the connection

Reprisal answered 29/4, 2016 at 21:18 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.