Ответ 1
Метод HttpURLConnection.getErrorStream
вернет InputStream
, который может использоваться для извлечения данных из условий ошибки (например, 404), согласно javadocs.
Когда я извлекаю данные из URL с ответом 403
is = conn.getInputStream();
Он генерирует исключение IOException, и я не могу получить данные ответа.
Но когда я использую firefox и напрямую обращаюсь к этому URL-адресу, The ResponseCode все еще 403, но я могу получить html-контент
Метод HttpURLConnection.getErrorStream
вернет InputStream
, который может использоваться для извлечения данных из условий ошибки (например, 404), согласно javadocs.
Пример использования 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();
}
попробуйте что-то вроде этого:
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();
}
попробуйте следующее:
BufferedReader reader = new BufferedReader(new InputStreamReader(con.getResponseCode() / 100 == 2 ? con.getInputStream() : con.getErrorStream()));
Источник fooobar.com/questions/163192/...
Я получил ту же ошибку даже после добавления строки агента. Наконец, после нескольких дней расследования выяснилось, что проблема. Это действительно связано, если схема URL начинается с "HTTPS", это приводит к ошибке 403. Оно должно быть в нижнем регистре ( "https" ). Поэтому перед открытием соединения убедитесь, что вы вызываете "url.toLowercase()".