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()));
Related videos on Youtube
Author by
yava
Updated on April 30, 2020Comments
-
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 almost 11 yearsThis worked like a charm!
-
Gangnus about 10 yearsNo, it won't, for the code of the function contains only 'return null;' line. (Java 6,7)
-
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 almost 10 years@MiljenMikic The difference between code and Javadoc means only that the last one is erroneous.
-
Miljen Mikic almost 10 years@Gangnus HttpURLConnection is abstract class. Concrete implementation works exactly as explained in Javadoc.
-
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 over 9 yearsI thought it had to be
(code >= 200) && (code < 300)
-
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.