Зачем мне нужно использовать HttpURLConnection в этом примере Java?

89
9

Я читаю книгу, написанную на Java Programming Interviews Exposed. Они предлагают этот образец кода, который я не понимаю:

@Test
public void makeBareHttpRequest() throws IOException {

final URL url = new URL("http", "en.wikipedia.org", "/");

final HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("GET");

final InputStream responseInputStream = connection.getInputStream();

final int responseCode = connection.getResponseCode();

final String response = IOUtils.toString(responseInputStream);

responseInputStream.close();

assertEquals(200, responseCode);

System.out.printf("Response received: [%s]%n", response);

}

Есть ли общее правило о том, когда нужно изменить переменную (с правой стороны)? Почему HttpURLConnection приведен на правой стороне здесь:

  final HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

но responseInputStream не нужно отличать с правой стороны здесь:

  final InputStream responseInputStream = connection.getInputStream();

Как программист Java знает, когда делать этот вид кастинга, а когда нет?

спросил(а) 2021-01-28T00:47:10+03:00 4 месяца, 3 недели назад
1
Решение
64

URL может быть любым типом схемы, например ftp, http, https, file и т.д.

Поэтому, если вы намереваетесь выполнить операцию HTTP, вам нужно HttpURLConnection ее в HttpURLConnection


См. Следующую строку, задан метод запроса: connection.setRequestMethod("GET"); Это специфично для HTTP-запросов

Вам не нужно бросать responseInputStream потому что IOUtils может работать с экземпляром абстрактного класса InputStream.

ответил(а) 2021-01-28T00:47:10+03:00 4 месяца, 3 недели назад
45

В этой программе вы HttpURLConnection в HttpURLConnection потому что вам нужно использовать метод, доступный в HttpURLConnection, и недоступный в его родительских классах метод setRequestMethod().

Вы можете сделать это, потому что знаете, что ваш URL является URL-адресом HTTP, и поэтому объект URLConnection который будет возвращен из него, будет HttpURLConnection.

Вы не передаете результат connection.getInputStream() потому что он возвращает InputStream и вам не нужны никакие методы, которые не определены в InputStream.

В общем, вы используете класс, который дает вам необходимые операции, - если вы знаете, что результат, который вы получаете, разрешен для использования в этом классе.

ответил(а) 2021-01-28T00:47:10+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема