Обычно я использую множество сканеров. Мой первый сканер был написан с использованием Java jsoup. Проще говоря, сканер отправляет запросы к различным веб-страницам, и для инициирования запроса вам необходимо использовать библиотеку инструментов HTTP. Сегодня давайте перечислим различные библиотеки инструментов, обычно используемые в Java, и проанализируем их преимущества и недостатки на уровне кода.
HttpURLConnection — это собственный HTTP-клиент, входящий в состав стандартной библиотеки Java java.net. Jsoup реализован на основе HttpURLConnection. Здесь мы используем HttpURLConnection для реализации простого запроса для изучения его использования.
String start_url = "http://www.baidu.com";
URL url = new URL(start_url);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
int status = con.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
System.out.println(content.toString());
} else {
System.out.println("Код состояния:" + status);
}
con.disconnect();
Выполнить код:
Как видите, HttpURLConnection относительно прост в использовании и позволяет пользователям лучше понимать процесс запроса и ответа. Однако пользователям необходимо вызывать базовые API, например создавать URL-адреса и получать данные ответа, что требует написания большого количества кода.
Введем зависимость HttpClient:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
Используйте HttpClient для реализации простого кода запроса.
String start_url = "http://www.baidu.com";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(start_url);
try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String result = EntityUtils.toString(entity, "utf-8");
System.out.println("Данные, возвращаемые сервером: " + result);
}
} catch (IOException e) {
e.printStackTrace();
}
При выполнении программы также выводится содержимое домашней страницы Baidu. В дополнение к этому простому использованию httpclient поддерживает настройки заголовка запроса:
// Установить заголовок запроса
httpGet.addHeader("Content-Type", "application/json");
// Установить соединение и прочитать таймауты
httpGet.setParams(RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(5000).build());
Вы также можете использовать пул соединений для повышения производительности:
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(100);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
Кроме того, он также предоставляет гибкие возможности конфигурации и различные функции настройки, подходящие для обработки сложной аутентификации HTTP-запросов, перенаправления, добавления прокси и других функций.
Но слишком большое количество параметров конфигурации может сбить с толку начинающих пользователей. Особенно новички. Когда я впервые использовал HttpClient в 2018 году, меня смущали различные конфигурации параметров.
В повседневной работе чаще используется OkHttp. С официального сайта я узнал, что oKHttp имеет следующие преимущества:
Затем я изучил API и увидел, как использовать OkHttp для инициации http-запроса.
String start_url = "http://www.baidu.com";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(start_url)
.build();
try {
Response response = client.newCall(request).execute();
ResponseBody responseBody = response.body();
if (responseBody != null) {
String result = responseBody.string();
System.out.println("Данные, возвращаемые сервером: " + result);
}
} catch (IOException e) {
e.printStackTrace();
}
Выполните запрос вывода кода:
Такое ощущение, что недостатков нет. .
Платформа Spring интегрирует RestTemplate. Поскольку HTTP-клиент использует платформу Spring, он может не подходить для приложений, отличных от Spring.
Выше приведена библиотека инструментов HTTP, с которой я сталкивался в повседневной разработке. Судя по вышесказанному, каждая HTTP-библиотека имеет свои преимущества и недостатки. Разработчики могут выбрать подходящую библиотеку HTTP в зависимости от конкретных потребностей проекта. Новички могут использовать HttpURLConnection, чтобы узнать и понять, что ответы на HTTP-запросы на самом деле являются операциями ввода-вывода.
Для сложных HTTP-запросов вы можете рассмотреть возможность использования Apache HttpClient или OkHttp, но OkHttp наиболее широко используется в реальных приложениях разработки, особенно в сценариях с высоким уровнем параллелизма.