Учебники

Apache HttpClient — Краткое руководство

Apache HttpClient — Обзор

Протокол передачи гипертекста (HTTP) — это протокол прикладного уровня для распределенных, совместных, гипермедиа информационных систем. Это основа для обмена данными для Всемирной паутины (т.е. Интернета) с 1990 года. HTTP является универсальным протоколом и протоколом без сохранения состояния, который может использоваться для других целей, а также с использованием расширений его методов запроса, кодов ошибок и заголовков.

По сути, HTTP — это протокол связи на основе TCP / IP, который используется для доставки данных (файлы HTML, файлы изображений, результаты запросов и т. Д.) В World Wide Web. Порт по умолчанию — TCP 80, но можно использовать и другие порты. Он обеспечивает стандартизированный способ связи компьютеров друг с другом. Спецификация HTTP определяет, как данные запросов клиентов будут создаваться и отправляться на сервер, и как серверы отвечают на эти запросы.

Что такое Http-клиент

Http-клиент является библиотекой передачи, он находится на стороне клиента, отправляет и получает сообщения HTTP. Он обеспечивает современную, многофункциональную и эффективную реализацию, соответствующую современным стандартам HTTP.

В дополнение к этому, используя клиентскую библиотеку, можно создавать приложения на основе HTTP, такие как веб-браузеры, клиенты веб-служб и т. Д.

Особенности Http Client

Ниже приведены основные характеристики клиента Http —

  • Библиотека HttpClient реализует все доступные методы HTTP.

  • Библиотека HttpClient предоставляет API для защиты запросов с использованием протокола Secure Socket Layer.

  • Используя HttpClient, вы можете устанавливать соединения, используя прокси.

  • Вы можете аутентифицировать соединения, используя схемы аутентификации, такие как Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session и т. Д.

  • Библиотека HttpClient поддерживает отправку запросов через несколько потоков. Он управляет несколькими соединениями, установленными из разных потоков, используя ClientConnectionPoolManager .

  • Используя библиотеку Apache HttpClient, вы можете установить время ожидания подключения.

Библиотека HttpClient реализует все доступные методы HTTP.

Библиотека HttpClient предоставляет API для защиты запросов с использованием протокола Secure Socket Layer.

Используя HttpClient, вы можете устанавливать соединения, используя прокси.

Вы можете аутентифицировать соединения, используя схемы аутентификации, такие как Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session и т. Д.

Библиотека HttpClient поддерживает отправку запросов через несколько потоков. Он управляет несколькими соединениями, установленными из разных потоков, используя ClientConnectionPoolManager .

Используя библиотеку Apache HttpClient, вы можете установить время ожидания подключения.

Apache HttpClient — Настройка среды

В этой главе мы объясним, как настроить среду для HttpClient в Eclipse IDE. Прежде чем продолжить установку, убедитесь, что в вашей системе уже установлен Eclipse. Если нет, скачайте и установите Eclipse.

Для получения дополнительной информации об Eclipse, пожалуйста, обратитесь к нашему учебному пособию по Eclipse .

Шаг 1 — Загрузите JAR-файл зависимости

Откройте официальную домашнюю страницу сайта HttpClient (компоненты) и перейдите на страницу загрузки

HttpComponents Загрузки

Затем загрузите последнюю стабильную версию HttpClient . Здесь, на протяжении всего урока, мы используем версию 4.5.6, поэтому скачиваем файл 4.5.6.zip .

В загруженной папке вы найдете папку с именем lib, которая содержит необходимые файлы Jar, которые необходимо добавить в путь к классам вашего проекта для работы с HttpClient.

Шаг 2 — Создайте проект и установите путь сборки

Откройте затмение и создайте пример проекта. Щелкните правой кнопкой мыши по проекту и выберите опцию Build Path → Configure Build Path, как показано ниже.

Путь сборки

Во фрейме пути сборки Java на вкладке « Библиотеки » нажмите « Добавить внешние JAR-файлы» .

Добавить внешние банки

И выберите все файлы jar в папке lib и нажмите « Применить и закрыть» .

Jar Files

Все готово для работы с библиотекой HttpClient в eclipse.

Apache HttpClient — Http Получить запрос

Метод GET используется для получения информации с данного сервера с использованием заданного URI. Запросы с использованием GET должны только извлекать данные и не должны оказывать никакого другого влияния на данные.

HttpClient API предоставляет класс с именем HttpGet, который представляет метод запроса get.

Следуйте приведенным ниже инструкциям, чтобы отправить запрос на получение с помощью библиотеки HttpClient.

Шаг 1 — Создайте объект HttpClient

Метод createDefault () класса HttpClients возвращает объект CloseableHttpClient , который является базовой реализацией интерфейса HttpClient .

Используя этот метод, создайте объект HttpClient, как показано ниже —

CloseableHttpClient httpclient = HttpClients.createDefault();

Шаг 2. Создание объекта HttpGet.

Класс HttpGet представляет запрос HTTPGET, который получает информацию о заданном сервере, используя URI.

Создайте запрос HTTP GET, создав экземпляр этого класса. Конструктор этого класса принимает значение String, представляющее URI.

HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

Шаг 3 — Выполнить запрос на получение

Метод execute () класса CloseableHttpClient принимает объект HttpUriRequest (interface) (т. Е. HttpGet, HttpPost, HttpPut, HttpHead и т. Д.) И возвращает объект ответа.

Выполните запрос, используя этот метод, как показано ниже —

HttpResponse httpresponse = httpclient.execute(httpget);

пример

Ниже приведен пример, демонстрирующий выполнение HTTP-запроса GET с использованием библиотеки HttpClient.

import java.util.Scanner;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpGetExample {
 
   public static void main(String args[]) throws Exception{
 
      //Creating a HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //Creating a HttpGet object
      HttpGet httpget = new HttpGet("https://www.tutorialspoint.com/ ");

      //Printing the method used
      System.out.println("Request Type: "+httpget.getMethod());

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httpget);

      Scanner sc = new Scanner(httpresponse.getEntity().getContent());

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
      while(sc.hasNext()) {
         System.out.println(sc.nextLine());
      }
   }
} 

Выход

Вышеуказанная программа генерирует следующий вывод —

Request Type: GET
<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<title>Parallax Scrolling, Java Cryptography, YAML, Python Data Science, Java
i18n, GitLab, TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible,
LOLCODE, Current Affairs 2018, Apache Commons Collections</title>
<meta name = "Description" content = "Parallax Scrolling, Java Cryptography, YAML,
Python Data Science, Java i18n, GitLab, TestRail, VersionOne, DBUtils, Common
CLI, Seaborn, Ansible, LOLCODE, Current Affairs 2018, Intellij Idea, Apache
Commons Collections, Java 9, GSON, TestLink, Inter Process Communication (IPC),
Logo, PySpark, Google Tag Manager, Free IFSC Code, SAP Workflow"/>
<meta name = "Keywords" content = "Python Data Science, Java i18n, GitLab,
TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible, LOLCODE, Gson,
TestLink, Inter Process Communication (IPC), Logo"/>
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href="/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
</script>
</body>
</html>

Apache HttpClient — Http Post Request

POST-запрос используется для отправки данных на сервер; например, информация о клиенте, загрузка файла и т. д. с использованием HTML-форм.

HttpClient API предоставляет класс с именем HttpPost, который представляет запрос POST.

Следуйте приведенным ниже инструкциям, чтобы отправить запрос HTTP POST с использованием библиотеки HttpClient.

Шаг 1 — Создание объекта HttpClient

Метод createDefault () класса HttpClients возвращает объект класса CloseableHttpClient , который является базовой реализацией интерфейса HttpClient .

Используя этот метод, создайте объект HttpClient.

CloseableHttpClient httpClient = HttpClients.createDefault();

Шаг 2 — Создание объекта HttpPost

Класс HttpPost представляет запрос HTTP POST . Это отправляет необходимые данные и извлекает информацию о данном сервере, используя URI.

Создайте этот запрос путем создания экземпляра класса HttpPost и передачи строкового значения, представляющего URI, в качестве параметра его конструктору.

HttpGet httpGet = new HttpGet("http://www.tutorialspoint.com/");

Шаг 3 — Выполнить запрос на получение

Метод execute () объекта CloseableHttpClient принимает объект HttpUriRequest (interface) (т. Е. HttpGet, HttpPost, HttpPut, HttpHead и т. Д.) И возвращает объект ответа.

HttpResponse httpResponse = httpclient.execute(httpget);

пример

Ниже приведен пример, демонстрирующий выполнение HTTP-запроса POST с использованием библиотеки HttpClient.

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpPostExample {
 
   public static void main(String args[]) throws Exception{
 
      //Creating a HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //Creating a HttpGet object
      HttpPost httppost = new HttpPost("https://www.tutorialspoint.com/");

      //Printing the method used
      System.out.println("Request Type: "+httppost.getMethod());

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httppost);

      Scanner sc = new Scanner(httpresponse.getEntity().getContent());

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
      while(sc.hasNext()) {
         System.out.println(sc.nextLine());
      }
   }
}

Выход

Вышеуказанная программа генерирует следующий вывод.

Request Type: POST
<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!--> 
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<title>Parallax Scrolling, Java Cryptography, YAML, Python Data Science, Java
i18n, GitLab, TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible,
LOLCODE, Current Affairs 2018, Apache Commons Collections</title>
<meta name = "Description" content = "Parallax Scrolling, Java Cryptography, YAML,
Python Data Science, Java i18n, GitLab, TestRail, VersionOne, DBUtils, Common
CLI, Seaborn, Ansible, LOLCODE, Current Affairs 2018, Intellij Idea, Apache
Commons Collections, Java 9, GSON, TestLink, Inter Process Communication (IPC),
Logo, PySpark, Google Tag Manager, Free IFSC Code, SAP Workflow"/>
<meta name = "Keywords" content="Python Data Science, Java i18n, GitLab,
TestRail, VersionOne, DBUtils, Common CLI, Seaborn, Ansible, LOLCODE, Gson,
TestLink, Inter Process Communication (IPC), Logo"/>
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" conten t= "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href = "/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . .
</script>
</body>
</html>

Apache HttpClient — обработчики ответов

Рекомендуется обрабатывать ответы HTTP с использованием обработчиков ответов. В этой главе мы собираемся обсудить, как создавать обработчики ответов и как использовать их для обработки ответа.

Если вы используете обработчик ответа, все HTTP-соединения будут освобождены автоматически.

Создание обработчика ответа

HttpClient API предоставляет интерфейс, известный как ResponseHandler, в пакете org.apache.http.client. Чтобы создать обработчик ответа, реализуйте этот интерфейс и переопределите его метод handleResponse () .

Каждый ответ имеет код состояния, и если код состояния находится между 200 и 300, это означает, что действие было успешно получено, понято и принято. Поэтому в нашем примере мы будем обрабатывать сущности ответов с такими кодами состояния.

Выполнение запроса с использованием обработчика ответа

Выполните шаги, приведенные ниже, чтобы выполнить запрос, используя обработчик ответа.

Шаг 1 — Создание объекта HttpClient

Метод createDefault () класса HttpClients возвращает объект класса CloseableHttpClient , который является базовой реализацией интерфейса HttpClient . Используя этот метод, создайте объект HttpClient

CloseableHttpClient httpclient = HttpClients.createDefault();

Шаг 2 — Создание обработчика ответа

Создайте объект обработчика ответа, созданный выше, используя следующую строку кода:

ResponseHandler<String> responseHandler = new MyResponseHandler(); 

Шаг 3 — Создание объекта HttpGet

Класс HttpGet представляет HTTP-запрос GET, который извлекает информацию о данном сервере с использованием URI.

Создайте запрос HttpGet, создав экземпляр класса HttpGet и передав строку, представляющую URI, в качестве параметра его конструктору.

ResponseHandler<String> responseHandler = new MyResponseHandler(); 

Шаг 4 — Выполнить запрос Get с помощью обработчика ответа

Класс CloseableHttpClient имеет вариант метода execute (), который принимает два объекта ResponseHandler и HttpUriRequest и возвращает объект ответа.

String httpResponse = httpclient.execute(httpget, responseHandler);

пример

Следующий пример демонстрирует использование обработчиков ответов.

import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

class MyResponseHandler implements ResponseHandler<String>{
 
   public String handleResponse(final HttpResponse response) throws IOException{

      //Get the status of the response
      int status = response.getStatusLine().getStatusCode();
      if (status >= 200 && status < 300) {
         HttpEntity entity = response.getEntity();
         if(entity == null) {
            return "";
         } else {
            return EntityUtils.toString(entity);
         }

      } else {
         return ""+status;
      }
   }
}

public class ResponseHandlerExample {
   
   public static void main(String args[]) throws Exception{
 
      //Create an HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //instantiate the response handler
      ResponseHandler<String> responseHandler = new MyResponseHandler();

      //Create an HttpGet object
      HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

      //Execute the Get request by passing the response handler object and HttpGet object
      String httpresponse = httpclient.execute(httpget, responseHandler);

      System.out.println(httpresponse);
   }
}

Выход

Вышеуказанные программы генерируют следующий вывод —

<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href = "/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-232293-17');
</script>
</body>

Apache HttpClient — закрытие соединения

Если вы обрабатываете HTTP-ответы вручную, а не используете обработчик ответов, вам необходимо закрыть все http-соединения самостоятельно. В этой главе объясняется, как закрыть соединения вручную.

При закрытии HTTP-соединений вручную следуйте инструкциям ниже:

Шаг 1 — Создайте объект HttpClient

Метод createDefault () класса HttpClients возвращает объект класса CloseableHttpClient , который является базовой реализацией интерфейса HttpClient.

Используя этот метод, создайте объект HttpClient, как показано ниже —

CloseableHttpClient httpClient = HttpClients.createDefault();

Шаг 2 — Запустите блок try-finally

Запустите блок try-finally, запишите оставшийся код в программах в блоке try и закройте объект CloseableHttpClient в блоке finally.

CloseableHttpClient httpClient = HttpClients.createDefault();
try{
   //Remaining code . . . . . . . . . . . . . . .
}finally{
   httpClient.close();
}

Шаг 3 — Создание HttpGetobject

Класс HttpGet представляет HTTP-запрос GET, который извлекает информацию о данном сервере с использованием URI.

Создайте HTTP-запрос GET, создав экземпляр класса HttpGet, передав строку, представляющую URI.

HttpGet httpGet = new HttpGet("http://www.tutorialspoint.com/");

Шаг 4 — Выполнить запрос Get

Метод execute () объекта CloseableHttpClient принимает объект HttpUriRequest (interface) (т. Е. HttpGet, HttpPost, HttpPut, HttpHead и т. Д.) И возвращает объект ответа.

Выполнить запрос, используя данный метод —

HttpResponse httpResponse = httpclient.execute(httpGet);

Шаг 5 — Запустите еще одну (вложенную) попытку

Запустите другой блок try-finally (вложенный в предыдущий блок try-finally), запишите оставшийся код в программах этого блока try и закройте объект HttpResponse в блоке finally.

CloseableHttpClient httpclient = HttpClients.createDefault();
try{
   . . . . . . .
   . . . . . . .
   CloseableHttpResponse httpresponse = httpclient.execute(httpget);
   try{
      . . . . . . .
      . . . . . . .
   }finally{
      httpresponse.close();
   }
}finally{
   httpclient.close();
}

пример

Всякий раз, когда вы создаете / получаете объекты, такие как запрос, поток ответов и т. Д., Начинайте блок try finally на следующей строке, пишите оставшийся код в блоке try и закрывайте соответствующий объект в блоке finally, как показано в следующей программе:

import java.util.Scanner;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class CloseConnectionExample {
   
   public static void main(String args[])throws Exception{
 
      //Create an HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      try{
         //Create an HttpGet object
         HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

         //Execute the Get request
         CloseableHttpResponse httpresponse = httpclient.execute(httpget);

         try{
            Scanner sc = new Scanner(httpresponse.getEntity().getContent());
            while(sc.hasNext()) {
               System.out.println(sc.nextLine());
            }
         }finally{
            httpresponse.close();
         }
      }finally{
         httpclient.close();
      }
   }
}

Выход

При выполнении вышеупомянутой программы генерируется следующий вывод:

<!DOCTYPE html>
<!--[if IE 8]><html class = "ie ie8"> <![endif]-->
<!--[if IE 9]><html class = "ie ie9"> <![endif]-->
<!--[if gt IE 9]><!-->
<html lang = "en-US"> <!--<![endif]-->
<head>
<!-- Basic -->
<meta charset = "utf-8">
<meta http-equiv = "X-UA-Compatible" content = "IE = edge">
<meta name = "viewport" content = "width = device-width,initial-scale = 1.0,userscalable = yes">
<link href = "https://cdn.muicss.com/mui-0.9.39/extra/mui-rem.min.css"
rel = "stylesheet" type = "text/css" />
<link rel = "stylesheet" href = "/questions/css/home.css?v = 3" />
<script src = "/questions/js/jquery.min.js"></script>
<script src = "/questions/js/fontawesome.js"></script>
<script src = "https://cdn.muicss.com/mui-0.9.39/js/mui.min.js"></script>
</head>
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . 
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-232293-17');
</script>
</body>
</html>

Apache HttpClient — прерывание запроса

Вы можете прервать текущий HTTP-запрос, используя метод abort () , т. Е. После вызова этого метода для определенного запроса его выполнение будет прервано.

Если этот метод вызывается после одного выполнения, ответы этого выполнения не будут затронуты, и последующие выполнения будут прерваны.

пример

Если вы посмотрите на следующий пример, мы создали запрос HttpGet, распечатали формат запроса, используемый с помощью getMethod () .

Затем мы выполнили еще одно выполнение с тем же запросом. Напечатал строку состояния снова, используя 1- е исполнение. Наконец, печатается строка состояния второго исполнения.

Как обсуждалось, ответы 1- го исполнения (выполнение перед методом прерывания) печатаются (включая вторую строку состояния, которая записывается после метода прерывания), и все последующие исполнения текущего запроса после метода прерывания завершаются неудачно, вызывая исключение.

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpGetExample {
   public static void main(String args[]) throws Exception{
   
      //Creating an HttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();

      //Creating an HttpGet object
      HttpGet httpget = new HttpGet("http://www.tutorialspoint.com/");

      //Printing the method used
      System.out.println(httpget.getMethod());
 
      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());

      httpget.abort();
      System.out.println(httpresponse.getEntity().getContentLength());
 
      //Executing the Get request
      HttpResponse httpresponse2 = httpclient.execute(httpget);
      System.out.println(httpresponse2.getStatusLine());
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —

On executing, the above program generates the following output.
GET
HTTP/1.1 200 OK
-1
Exception in thread "main" org.apache.http.impl.execchain.RequestAbortedException:
Request aborted
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:180)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at HttpGetExample.main(HttpGetExample.java:32)

Apache HttpClient — перехватчики

Перехватчики — это те, которые помогают блокировать или изменять запросы или ответы. Протокол-перехватчики обычно действуют на определенный заголовок или группу связанных заголовков. Библиотека HttpClient обеспечивает поддержку перехватчиков.

Запрос перехватчика

Интерфейс HttpRequestInterceptor представляет перехватчики запросов. Этот интерфейс содержит метод, известный как процесс, в котором вам нужно написать кусок кода для перехвата запросов.

На стороне клиента этот метод проверяет / обрабатывает запросы перед их отправкой на сервер, а на стороне сервера этот метод выполняется перед оценкой тела запроса.

Создание запроса-перехватчика

Вы можете создать перехватчик запроса, выполнив шаги, указанные ниже.

Шаг 1 — Создание объекта HttpRequestInterceptor

Создайте объект интерфейса HttpRequestInterceptor, реализовав его абстрактный метод process.

HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {

@Override
 public void process(HttpRequest request, HttpContext context) throws
HttpException, IOException {
   //Method implementation . . . . .
};

Шаг 2. Создание объекта CloseableHttpClient

Создайте пользовательский объект CloseableHttpClient , добавив к нему созданный выше перехватчик, как показано ниже —

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients. custom() .addInterceptorFirst(requestInterceptor).build();

Используя этот объект, вы можете выполнять запросы как обычно.

пример

Следующий пример демонстрирует использование перехватчиков запросов. В этом примере мы создали объект запроса HTTP GET и добавили к нему три заголовка: sample-header, demoheader и test-header.

В методе processor () перехватчика мы проверяем заголовки отправленного запроса; если какой-либо из этих заголовков является sample-header , мы пытаемся удалить его и отобразить список заголовков этого конкретного запроса.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HttpContext;

public class InterceptorsExample {
 
   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpRequestInterceptor requestInterceptor = new HttpRequestInterceptor() {
         @Override
         public void process(HttpRequest request, HttpContext context) throws
         HttpException, IOException {
            if(request.containsHeader("sample-header")) {
               System.out.println("Contains header sample-header, removing it..");
               request.removeHeaders("sample-header"); 
            }
            //Printing remaining list of headers
            Header[] headers= request.getAllHeaders();
            for (int i = 0; i<headers.length;i++) {
               System.out.println(headers[i].getName());
            }
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient =
      HttpClients. custom() .addInterceptorFirst(requestInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Setting the header to it
      httpget1.setHeader(new BasicHeader("sample-header","My first header"));
      httpget1.setHeader(new BasicHeader("demo-header","My second header"));
      httpget1.setHeader(new BasicHeader("test-header","My third header"));

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
   }
}

Выход

При выполнении вышеупомянутой программы генерируется следующий вывод:

Contains header sample-header, removing it..
demo-header
test-header
HTTP/1.1 200 OK

Ответ перехватчик

Интерфейс HttpResponseInterceptor представляет перехватчики ответа. Этот интерфейс содержит метод, известный как process () . В этом методе вам нужно написать кусок кода для перехвата ответов.

На стороне сервера этот метод проверяет / обрабатывает ответ перед отправкой его клиенту, а на стороне клиента этот метод выполняется перед оценкой тела ответа.

Создание ответного перехватчика

Вы можете создать перехватчик ответа, выполнив следующие шаги:

Шаг 1 — Создание объекта HttpResponseInterceptor

Создайте объект интерфейса HttpResponseInterceptor , реализовав его абстрактный метод процесса .

HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
   @Override
   public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
      //Method implementation . . . . . . . .
   }
};

Шаг 2: создание объекта CloseableHttpClient

Создайте пользовательский объект CloseableHttpClient , добавив к нему созданный выше перехватчик, как показано ниже —

//Creating a CloseableHttpClient object
CloseableHttpClient httpclient =
HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

Используя этот объект, вы можете выполнять запросы как обычно.

пример

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

После выполнения запроса и получения ответа мы распечатали имена всех заголовков ответа, используя метод getAllHeaders () .

И в выводе вы можете наблюдать имена трех заголовков в списке.

import java.io.IOException;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.protocol.HttpContext;

public class ResponseInterceptorsExample {

   public static void main(String args[]) throws Exception{
      
      //Creating an HttpRequestInterceptor
      HttpResponseInterceptor responseInterceptor = new HttpResponseInterceptor() {
         @Override
         public void process(HttpResponse response, HttpContext context) throws
         HttpException, IOException {
            System.out.println("Adding header sample_header, demo-header, test_header to the response");
            response.setHeader("sample-header", "My first header");
            response.setHeader("demo-header", "My second header");
            response.setHeader("test-header", "My third header"); 
         }
      };

      //Creating a CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.custom().addInterceptorFirst(responseInterceptor).build();

      //Creating a request object
      HttpGet httpget1 = new HttpGet("https://www.tutorialspoint.com/");

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget1); 

      //Printing remaining list of headers
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i<headers.length;i++) {
         System.out.println(headers[i].getName());
      }
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий результат —

On executing the above program generates the following output.
Adding header sample_header, demo-header, test_header to the response
Accept-Ranges
Access-Control-Allow-Headers
Access-Control-Allow-Origin
Cache-Control
Content-Type
Date
Expires
Last-Modified
Server
Vary
X-Cache
sample-header
demo-header
test-header

Apache HttpClient — аутентификация пользователя

Используя HttpClient, вы можете подключиться к веб-сайту, который нуждался в имени пользователя и пароле. В этой главе объясняется, как выполнить клиентский запрос к сайту, который запрашивает имя пользователя и пароль.

Шаг 1 — Создание объекта CredentialsProvider

Интерфейс CredentialsProvider поддерживает коллекцию для хранения учетных данных пользователя. Вы можете создать его объект, создав экземпляр класса BasicCredentialsProvider , который является реализацией этого интерфейса по умолчанию.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Шаг 2 — Установите учетные данные

Вы можете установить необходимые учетные данные для объекта CredentialsProvider, используя метод setCredentials () .

Этот метод принимает два объекта, как указано ниже —

  • Объект AuthScope — область аутентификации, в которой указываются такие данные, как имя хоста, номер порта и имя схемы аутентификации.

  • Объект учетных данных — указание учетных данных (имя пользователя, пароль).

Объект AuthScope — область аутентификации, в которой указываются такие данные, как имя хоста, номер порта и имя схемы аутентификации.

Объект учетных данных — указание учетных данных (имя пользователя, пароль).

Установите учетные данные, используя метод setCredentials () для хоста и прокси, как показано ниже —

credsProvider.setCredentials(new AuthScope("example.com", 80), 
   new UsernamePasswordCredentials("user", "mypass"));
credsProvider.setCredentials(new AuthScope("localhost", 8000), 
   new UsernamePasswordCredentials("abc", "passwd"));

Шаг 3 — Создайте объект HttpClientBuilder

Создайте HttpClientBuilder, используя метод custom () класса HttpClients .

//Creating the HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Шаг 4 — Установите учетные данныеPovider

Вы можете установить созданный выше объект credentialsPovider в HttpClientBuilder, используя метод setDefaultCredentialsProvider () .

Задайте объект CredentialProvider, созданный на предыдущем шаге, для построителя клиента, передав его методу объекта CredentialsProvider (), как показано ниже.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Шаг 5 — Создайте CloseableHttpClient

Создайте объект CloseableHttpClient, используя метод build () класса HttpClientBuilder .

CloseableHttpClient httpclient = clientbuilder.build()

Шаг 6 — Создайте объект HttpGet и выполните его

Создайте объект HttpRequest, создав экземпляр класса HttpGet. Выполните этот запрос, используя метод execute () .

//Creating a HttpGet object
HttpGet httpget = new HttpGet("https://www.tutorialspoint.com/ ");

//Executing the Get request
HttpResponse httpresponse = httpclient.execute(httpget);

пример

Ниже приведен пример программы, которая демонстрирует выполнение HTTP-запроса к целевому сайту, который требует аутентификации пользователя.

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;

public class UserAuthenticationExample {
   
   public static void main(String args[]) throws Exception{
      
      //Create an object of credentialsProvider
      CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

      //Set the credentials
      AuthScope scope = new AuthScope("https://www.tutorialspoint.com/questions/", 80);
      
      Credentials credentials = new UsernamePasswordCredentials("USERNAME", "PASSWORD");
      credentialsPovider.setCredentials(scope,credentials);

      //Creating the HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the credentials
      clientbuilder = clientbuilder.setDefaultCredentialsProvider(credentialsPovider);

      //Building the CloseableHttpClient object
      CloseableHttpClient httpclient = clientbuilder.build();

      //Creating a HttpGet object
      HttpGet httpget = new HttpGet("https://www.tutorialspoint.com/questions/index.php");

      //Printing the method used
      System.out.println(httpget.getMethod()); 

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());
      int statusCode = httpresponse.getStatusLine().getStatusCode();
      System.out.println(statusCode);

      Header[] headers= httpresponse.getAllHeaders();
      for (int i = 0; i<headers.length;i++) {
         System.out.println(headers[i].getName());
      }
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод.

GET
HTTP/1.1 200 OK
200

Apache HttpClient — Использование прокси

Прокси-сервер является промежуточным сервером между клиентом и Интернетом. Прокси-серверы предлагают следующие основные функции —

  • Межсетевой экран и сетевая фильтрация данных

  • Совместное использование сетевого подключения

  • Кеширование данных

Межсетевой экран и сетевая фильтрация данных

Совместное использование сетевого подключения

Кеширование данных

Используя библиотеку HttpClient, вы можете отправить HTTP-запрос через прокси. Следуйте инструкциям ниже

Шаг 1 — Создайте объект HttpHost

Создайте экземпляр класса HttpHost пакета org.apache.http , передав строковый параметр, представляющий имя прокси-хоста (от которого вам нужно отправить запросы) его конструктору.

//Creating an HttpHost object for proxy
HttpHost proxyHost = new HttpHost("localhost"); 

Таким же образом создайте еще один объект HttpHost для представления целевого хоста, на который необходимо отправлять запросы.

//Creating an HttpHost object for target
HttpHost targetHost = new HttpHost("google.com");

Шаг 2 — Создание объекта HttpRoutePlanner

Интерфейс HttpRoutePlanner вычисляет маршрут к указанному хосту. Создайте объект этого интерфейса, создав экземпляр класса DefaultProxyRoutePlanner , который является реализацией этого интерфейса. В качестве параметра его конструктору передайте созданный выше прокси-хост —

//creating a RoutePlanner object
HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyhost);

Шаг 3 — Установите планировщик маршрута для строителя клиента

Используя метод custom () класса HttpClients , создайте объект HttpClientBuilder и установите для этого объекта планировщик маршрутов, созданный выше, с помощью метода setRoutePlanner () .

//Setting the route planner to the HttpClientBuilder object
HttpClientBuilder clientBuilder = HttpClients.custom();

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Шаг 4 — Постройте объект CloseableHttpClient

Создайте объект CloseableHttpClient , вызвав метод build () .

//Building a CloseableHttpClient
CloseableHttpClient httpClient = clientBuilder.build();

Шаг 5 — Создать HttpGetobject

Создайте HTTP-запрос GET, создав экземпляр класса HttpGet .

//Creating an HttpGet object
HttpGet httpGet = new HttpGet("/");

Шаг 6 — Выполнить запрос

Один из вариантов метода execute () принимает объекты HttpHost и HttpRequest и выполняет запрос. Выполнить запрос, используя этот метод —

//Executing the Get request
HttpResponse httpResponse = httpclient.execute(targetHost, httpGet); 

пример

В следующем примере показано, как отправить HTTP-запрос на сервер через прокси. В этом примере мы отправляем HTTP-запрос GET на google.com через localhost. Мы напечатали заголовки ответа и текст ответа.

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.routing.HttpRoutePlanner;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.DefaultProxyRoutePlanner;
import org.apache.http.util.EntityUtils;

public class RequestViaProxyExample {

   public static void main(String args[]) throws Exception{
 
      //Creating an HttpHost object for proxy
      HttpHost proxyhost = new HttpHost("localhost");

      //Creating an HttpHost object for target
      HttpHost targethost = new HttpHost("google.com");
 
      //creating a RoutePlanner object
      HttpRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxyhost);

      //Setting the route planner to the HttpClientBuilder object
      HttpClientBuilder clientBuilder = HttpClients.custom();
      clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

      //Building a CloseableHttpClient
      CloseableHttpClient httpclient = clientBuilder.build();

      //Creating an HttpGet object
      HttpGet httpget = new HttpGet("/");

      //Executing the Get request
      HttpResponse httpresponse = httpclient.execute(targethost, httpget);

      //Printing the status line
      System.out.println(httpresponse.getStatusLine());

      //Printing all the headers of the response
      Header[] headers = httpresponse.getAllHeaders();
 
      for (int i = 0; i < headers.length; i++) {
         System.out.println(headers[i]);
      }
      
      //Printing the body of the response
      HttpEntity entity = httpresponse.getEntity();

      if (entity != null) {
         System.out.println(EntityUtils.toString(entity));
      }
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —

HTTP/1.1 200 OK
Date: Sun, 23 Dec 2018 10:21:47 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.13
Last-Modified: Tue, 24 Jun 2014 10:46:24 GMT
ETag: "2e-4fc92abc3c000"
Accept-Ranges: bytes
Content-Length: 46
Content-Type: text/html
<html><body><h1>It works!</h1></body></html>

Apache HttpClient — прокси-аутентификация

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

Шаг 1 — Создание объекта CredentialsProvider

Интерфейс CredentialsProvider поддерживает коллекцию для хранения учетных данных пользователя. Вы можете создать его объект, создав экземпляр класса BasicCredentialsProvider, который является реализацией этого интерфейса по умолчанию.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Шаг 2 — Установите учетные данные

Вы можете установить необходимые учетные данные для объекта CredentialsProvider, используя метод setCredentials () . Этот метод принимает два объекта —

  • Объект AuthScope — область аутентификации, в которой указываются такие данные, как имя хоста, номер порта и имя схемы аутентификации.

  • Объект учетных данных — указание учетных данных (имя пользователя, пароль). Установите учетные данные, используя метод setCredentials () для хоста и прокси, как показано ниже.

Объект AuthScope — область аутентификации, в которой указываются такие данные, как имя хоста, номер порта и имя схемы аутентификации.

Объект учетных данных — указание учетных данных (имя пользователя, пароль). Установите учетные данные, используя метод setCredentials () для хоста и прокси, как показано ниже.

credsProvider.setCredentials(new AuthScope("example.com", 80), new
   UsernamePasswordCredentials("user", "mypass"));
credsProvider.setCredentials(new AuthScope("localhost", 8000), new
   UsernamePasswordCredentials("abc", "passwd"));

Шаг 3 — Создайте объект HttpClientBuilder

Создайте HttpClientBuilder, используя метод custom () класса HttpClients, как показано ниже —

//Creating the HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Шаг 4 — Установите CredentialsProvider

Вы можете установить объект CredentialsProvider в объект HttpClientBuilder, используя метод setDefaultCredentialsProvider () . Передайте ранее созданный объект CredentialsProvider этому методу.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Шаг 5 — Создайте CloseableHttpClient

Создайте объект CloseableHttpClient, используя метод build () .

CloseableHttpClient httpclient = clientbuilder.build();

Шаг 6 — Создайте прокси и целевые хосты

Создайте целевой и прокси-хосты, создав экземпляр класса HttpHost .

//Creating the target and proxy hosts
HttpHost target = new HttpHost("example.com", 80, "http");
HttpHost proxy = new HttpHost("localhost", 8000, "http");

Шаг 7 — Установите прокси и создайте объект RequestConfig

Создайте объект RequestConfig.Builder, используя метод custom () . Установите ранее созданный объект proxyHost в RequestConfig.Builder, используя метод setProxy () . Наконец, создайте объект RequestConfig, используя метод build () .

RequestConfig.Builder reqconfigconbuilder= RequestConfig.custom();
reqconfigconbuilder = reqconfigconbuilder.setProxy(proxyHost);
RequestConfig config = reqconfigconbuilder.build();

Шаг 8 — Создайте объект запроса HttpGet и установите для него объект конфигурации.

Создайте объект HttpGet, создав экземпляр класса HttpGet. Задайте для этого объекта конфигурации, созданного на предыдущем шаге, метод setConfig () .

//Create the HttpGet request object
HttpGet httpGet = new HttpGet("/");

//Setting the config to the request
httpget.setConfig(config);

Шаг 9 — Выполнить запрос

Выполните запрос, передав объект HttpHost (цель) и запрос (HttpGet) в качестве параметров методу execute () .

HttpResponse httpResponse = httpclient.execute(targetHost, httpget);

пример

В следующем примере показано, как выполнить HTTP-запрос через прокси-сервер, используя имя пользователя и пароль.

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;

public class ProxyAuthenticationExample {
   public static void main(String[] args) throws Exception {

      //Creating the CredentialsProvider object
      CredentialsProvider credsProvider = new BasicCredentialsProvider();

      //Setting the credentials
      credsProvider.setCredentials(new AuthScope("example.com", 80), 
         new UsernamePasswordCredentials("user", "mypass"));
      credsProvider.setCredentials(new AuthScope("localhost", 8000), 
         new UsernamePasswordCredentials("abc", "passwd"));

      //Creating the HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the credentials
      clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);
      
      //Building the CloseableHttpClient object
      CloseableHttpClient httpclient = clientbuilder.build();


      //Create the target and proxy hosts
      HttpHost targetHost = new HttpHost("example.com", 80, "http");
      HttpHost proxyHost = new HttpHost("localhost", 8000, "http");

      //Setting the proxy
      RequestConfig.Builder reqconfigconbuilder= RequestConfig.custom();
      reqconfigconbuilder = reqconfigconbuilder.setProxy(proxyHost);
      RequestConfig config = reqconfigconbuilder.build();

      //Create the HttpGet request object
      HttpGet httpget = new HttpGet("/");

      //Setting the config to the request
      httpget.setConfig(config);
 
      //Printing the status line
      HttpResponse response = httpclient.execute(targetHost, httpget);
      System.out.println(response.getStatusLine());

   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —

HTTP/1.1 200 OK

Apache HttpClient — Форма входа на основе

Используя библиотеку HttpClient, вы можете отправить запрос или войти в форму, передав параметры.

Следуйте инструкциям ниже, чтобы войти в форму.

Шаг 1 — Создайте объект HttpClient

Метод createDefault () класса HttpClients возвращает объект класса CloseableHttpClient , который является базовой реализацией интерфейса HttpClient. Используя этот метод, создайте объект HttpClient —

CloseableHttpClient httpClient = HttpClients.createDefault();

Шаг 2 — Создание объекта RequestBuilder

Класс RequestBuilder используется для построения запроса путем добавления к нему параметров. Если тип запроса — PUT или POST, он добавляет параметры в запрос как объект, закодированный в URL.

Создайте объект RequestBuilder (типа POST), используя метод post ().

//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post();

Шаг 3 — Установите Uri и параметры для RequestBuilder.

Установите URI и параметры для объекта RequestBuilder, используя методы setUri () и addParameter () класса RequestBuilder.

//Set URI and parameters
RequestBuilder reqbuilder = reqbuilder.setUri("http://httpbin.org/post");
reqbuilder = reqbuilder1.addParameter("Name", "username").addParameter("password", "password");

Шаг 4 — Создайте объект HttpUriRequest

После установки необходимых параметров создайте объект HttpUriRequest с помощью метода build () .

//Building the HttpUriRequest object
HttpUriRequest httppost = reqbuilder2.build();

Шаг 5 — Выполнить запрос

Метод execute объекта CloseableHttpClient принимает объект HttpUriRequest (interface) (т.е. HttpGet, HttpPost, HttpPut, HttpHead и т. Д.) И возвращает объект ответа.

Выполните HttpUriRequest, созданный на предыдущих шагах, передав его методу execute () .

//Execute the request
HttpResponse httpresponse = httpclient.execute(httppost);

пример

В следующем примере показано, как войти в форму, отправив учетные данные для входа. Здесь мы отправили два параметра — имя пользователя и пароль в форму и попытались напечатать сущность сообщения и статус запроса.

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URISyntaxException;

public class FormLoginExample {
 
   public static void main(String args[]) throws Exception {

      //Creating CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();
 
      //Creating the RequestBuilder object
      RequestBuilder reqbuilder = RequestBuilder.post();

      //Setting URI and parameters
      RequestBuilder reqbuilder1 = reqbuilder.setUri("http://httpbin.org/post");
      RequestBuilder reqbuilder2 = reqbuilder1.addParameter("Name", 
         "username").addParameter("password", "password");

      //Building the HttpUriRequest object
      HttpUriRequest httppost = reqbuilder2.build();

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httppost);

      //Printing the status and the contents of the response
      System.out.println(EntityUtils.toString(httpresponse.getEntity()));
      System.out.println(httpresponse.getStatusLine());
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —

{
   "args": {},
   "data": "",
   "files": {},
   "form": {
      "Name": "username",
      "password": "password"
   },
   "headers": {
      "Accept-Encoding": "gzip,deflate",
      "Connection": "close",
      "Content-Length": "31",
      "Content-Type": "application/x-www-form-urlencoded; charset = UTF-8",
      "Host": "httpbin.org",
      "User-Agent": "Apache-HttpClient/4.5.6 (Java/1.8.0_91)"
   },
   "json": null,
   "origin": "117.216.245.180",
   "url": "http://httpbin.org/post"
}
HTTP/1.1 200 OK

Форма Войти с помощью файлов cookie

Если ваша форма хранит куки, вместо создания объекта CloseableHttpClient по умолчанию.

Создайте объект CookieStore, создав экземпляр класса BasicCookieStore.

//Creating a BasicCookieStore object
BasicCookieStore cookieStore = new BasicCookieStore();

Создайте HttpClientBuilder, используя метод custom () класса HttpClients .

//Creating an HttpClientBuilder object
HttpClientBuilder clientbuilder = HttpClients.custom();

Установите хранилище cookie для построителя клиента, используя метод setDefaultCookieStore ().

//Setting default cookie store to the client builder object
Clientbuilder = clientbuilder.setDefaultCookieStore(cookieStore); 

Создайте объект CloseableHttpClient, используя метод build () .

//Building the CloseableHttpClient object
CloseableHttpClient httpclient = clientbuilder1.build();

Создайте объект HttpUriRequest, как указано выше, передавая запрос на выполнение.

Если на странице хранятся файлы cookie, переданные вами параметры будут добавлены в хранилище файлов cookie.

Вы можете распечатать содержимое объекта CookieStore, где вы можете увидеть ваши параметры (наряду с предыдущими страница, сохраненная в кейсе).

Чтобы распечатать файлы cookie, получите все файлы cookie из объекта CookieStore с помощью метода getCookies () . Этот метод возвращает объект List . Используя Iterator, распечатайте содержимое списка объектов, как показано ниже —

//Printing the cookies
List list = cookieStore.getCookies();

System.out.println("list of cookies");
Iterator it = list.iterator();
if(it.hasNext()) {
   System.out.println(it.next());
}

Apache HttpClient — управление файлами cookie

Куки-файлы — это текстовые файлы, которые хранятся на клиентском компьютере и хранятся в целях отслеживания различной информации.

HttpClient обеспечивает поддержку файлов cookie, которые вы можете создавать и управлять файлами cookie.

Создание куки

Следуйте приведенным ниже инструкциям, чтобы создать файл cookie с помощью библиотеки HttpClient.

Шаг 1 — Создать объект Cookiestore

Интерфейс CookieStore представляет абстрактное хранилище для объектов Cookie. Вы можете создать хранилище cookie, создав экземпляр класса BasicCookieStore , который является реализацией этого интерфейса по умолчанию.

//Creating the CookieStore object
CookieStore cookieStore = new BasicCookieStore();

Шаг 2 — Создание объекта ClientCookie

В дополнение к функциям файлов cookie, ClientCookie может получить оригинальные файлы cookie на сервере. Вы можете создать файл cookie клиента, создав экземпляр класса BasicClientCookie . В конструктор этого класса вам нужно передать пару ключ-значение, которую вы хотели сохранить в этом конкретном файле cookie.

//Creating client cookie
BasicClientCookie clientCookie = new BasicClientCookie("name","Raju");

Шаг 3 — Установите значения для куки

Для файла cookie клиента вы можете установить / удалить путь, значение, версию, срок действия, домен, комментарий и атрибут, используя соответствующие методы.

Calendar myCal = new GregorianCalendar(2018, 9, 26);
Date expiryDate = myCal.getTime();
clientcookie.setExpiryDate(expiryDate);
clientcookie.setPath("/");
clientcookie.setSecure(true);
clientcookie.setValue("25");
clientcookie.setVersion(5);

Шаг 4 — Добавить куки в магазин печенья

Вы можете добавить куки в хранилище куки, используя метод addCookie () класса BasicCookieStore .

Добавьте необходимые куки в Cookiestore .

//Adding the created cookies to cookie store
cookiestore.addCookie(clientcookie);

пример

Следующий пример демонстрирует, как создавать куки и добавлять их в магазин куки. Здесь мы создали хранилище cookie, набор файлов cookie, задав значения домена и пути, и добавили их в хранилище cookie.

import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;

public class CookieHandlingExample {
   
   public static void main(String args[]) throws Exception{
      
      //Creating the CookieStore object
      CookieStore cookiestore = new BasicCookieStore();
 
      //Creating client cookies
      BasicClientCookie clientcookie1 = new BasicClientCookie("name","Raju");
      BasicClientCookie clientcookie2 = new BasicClientCookie("age","28");
      BasicClientCookie clientcookie3 = new BasicClientCookie("place","Hyderabad");

      //Setting domains and paths to the created cookies
      clientcookie1.setDomain(".sample.com");
      clientcookie2.setDomain(".sample.com");
      clientcookie3.setDomain(".sample.com");

      clientcookie1.setPath("/");
      clientcookie2.setPath("/");
      clientcookie3.setPath("/");
 
      //Adding the created cookies to cookie store
      cookiestore.addCookie(clientcookie1);
      cookiestore.addCookie(clientcookie2);
      cookiestore.addCookie(clientcookie3);
   }
}

Извлечение печенья

Вы можете добавить файлы cookie в хранилище файлов cookie с помощью метода getCookies () класса asicCookieStore . Этот метод возвращает список, в котором хранятся все файлы cookie в хранилище файлов cookie.

Вы можете распечатать содержимое хранилища cookie с помощью Итератора, как показано ниже —

//Retrieving the cookies
List list = cookieStore.getCookies();

//Creating an iterator to the obtained list
Iterator it = list.iterator();
while(it.hasNext()) {
   System.out.println(it.next());
}

пример

В следующем примере показано, как получить файлы cookie из магазина cookie. Здесь мы добавляем кучу файлов cookie в магазин и получаем их обратно.

import org.apache.http.client.CookieStore;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.cookie.BasicClientCookie;

public class CookieHandlingExample {
 
   public static void main(String args[]) throws Exception{
      
      //Creating the CookieStore object
      CookieStore cookiestore = new BasicCookieStore();
      
      //Creating client cookies
      BasicClientCookie clientcookie1 = new BasicClientCookie("name","Raju");
      BasicClientCookie clientcookie2 = new BasicClientCookie("age","28");
      BasicClientCookie clientcookie3 = new BasicClientCookie("place","Hyderabad");

      //Setting domains and paths to the created cookies
      clientcookie1.setDomain(".sample.com");
      clientcookie2.setDomain(".sample.com");
      clientcookie3.setDomain(".sample.com");

      clientcookie1.setPath("/");
      clientcookie2.setPath("/");
      clientcookie3.setPath("/");
 
      //Adding the created cookies to cookie store
      cookiestore.addCookie(clientcookie1);
      cookiestore.addCookie(clientcookie2);
      cookiestore.addCookie(clientcookie3);
   }
}

Выход

При выполнении эта программа генерирует следующий вывод —

[version: 0][name: age][value: 28][domain: .sample.com][path: /][expiry: null]
[version: 0][name: name][value: Raju][domain: my.example.com][path: /][expiry:
null]
[version: 0][name: place][value: Hyderabad][domain: .sample.com][path:
/][expiry: null]

Apache HttpClient — несколько потоков

Многопоточная программа содержит две или более частей, которые могут работать одновременно, и каждая часть может одновременно обрабатывать разные задачи, оптимально используя доступные ресурсы.

Вы можете выполнять запросы из нескольких потоков, написав многопоточную программу HttpClient.

Если вы хотите последовательно выполнить несколько клиентских запросов из потоков, вам необходимо создать ClientConnectionPoolManager . Он поддерживает пул HttpClientConnections и обслуживает несколько запросов от потоков.

Диспетчер соединений объединяет соединения в зависимости от маршрута. Если у менеджера есть соединения для определенного маршрута, он обслуживает новые запросы в этих маршрутах, арендуя существующее соединение из пула, вместо того, чтобы создавать новое.

Выполните шаги для выполнения запросов из нескольких потоков —

Шаг 1 — Создание диспетчера клиентских подключений

Создайте диспетчер пулов клиентских подключений, создав экземпляр класса PoolingHttpClientConnectionManager .

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager(); 

Шаг 2 — Установите максимальное количество соединений

Установите максимальное количество соединений в пуле, используя метод setMaxTotal () .

//Set the maximum number of connections in the pool
connManager.setMaxTotal(100); 

Шаг 3 — Создание объекта ClientBuilder

Создайте объект ClientBuilder , установив диспетчер соединений с помощью метода setConnectionManager (), как показано ниже:

HttpClientBuilder clientbuilder =
HttpClients.custom().setConnectionManager(connManager);

Шаг 4 — Создание объектов запроса HttpGet

Создайте экземпляр класса HttpGet, передав нужный URI его конструктору в качестве параметра.

HttpGet httpget1 = new HttpGet("URI1");
HttpGet httpget2 = new HttpGet("URI2");
. . . . . . . . . . . . 

Шаг 5 — Реализация метода запуска

Убедитесь, что вы создали класс, сделали его потоком (либо путем расширения класса потока, либо путем реализации интерфейса Runnable) и реализовали метод run.

public class ClientMultiThreaded extends Thread {
   public void run() {
      //Run method implementation . . . . . . . . . .
   }
}

Шаг 6 — Создание объектов Thread

Создайте объекты потока, создав экземпляр класса Thread (ClientMultiThreaded), созданного выше.

Передайте объект HttpClient, соответствующий объект HttpGet и целое число, представляющее идентификатор для этих потоков.

ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Шаг 7 — Начните и присоединяйтесь к темам

Запустите все потоки, используя метод start (), и соедините их, используя метод join () .

thread1.start();
thread2.start();
. . . . . . . .
thread1.join();
thread2.join();
. . . . . . . . . . . .

Шаг 8 — Выполнить реализацию метода

В методе run выполните запрос, получите ответ и распечатайте результаты.

пример

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

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.util.EntityUtils;

public class ClientMultiThreaded extends Thread {
   CloseableHttpClient httpClient;
   HttpGet httpget;
   int id;
 
   public ClientMultiThreaded(CloseableHttpClient httpClient, HttpGet httpget,
   int id) {
      this.httpClient = httpClient;
      this.httpget = httpget;
      this.id = id;
   }
   @Override
   public void run() {
      try{
         //Executing the request
         CloseableHttpResponse httpresponse = httpClient.execute(httpget);

         //Displaying the status of the request.
         System.out.println("status of thread "+id+":"+httpresponse.getStatusLine());

         //Retrieving the HttpEntity and displaying the no.of bytes read
         HttpEntity entity = httpresponse.getEntity();
         if (entity != null) {
            System.out.println("Bytes read by thread thread "+id+":
               "+EntityUtils.toByteArray(entity).length);
         }
      }catch(Exception e) {
         System.out.println(e.getMessage());
      }
   }
      
   public static void main(String[] args) throws Exception {

      //Creating the Client Connection Pool Manager by instantiating the PoolingHttpClientConnectionManager class.
      PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();

      //Set the maximum number of connections in the pool
      connManager.setMaxTotal(100);

      //Create a ClientBuilder Object by setting the connection manager
      HttpClientBuilder clientbuilder = HttpClients.custom().setConnectionManager(connManager);
 
      //Build the CloseableHttpClient object using the build() method.
      CloseableHttpClient httpclient = clientbuilder.build();

      //Creating the HttpGet requests
      HttpGet httpget1 = new HttpGet("http://www.tutorialspoint.com/");
      HttpGet httpget2 = new HttpGet("http://www.google.com/");
      HttpGet httpget3 = new HttpGet("https://www.qries.com/");
      HttpGet httpget4 = new HttpGet("https://in.yahoo.com/");
 
      //Creating the Thread objects
      ClientMultiThreaded thread1 = new ClientMultiThreaded(httpclient,httpget1, 1);
      ClientMultiThreaded thread2 = new ClientMultiThreaded(httpclient,httpget2, 2);
      ClientMultiThreaded thread3 = new ClientMultiThreaded(httpclient,httpget3, 3);
      ClientMultiThreaded thread4 = new ClientMultiThreaded(httpclient,httpget4, 4);

      //Starting all the threads
      thread1.start();
      thread2.start();
      thread3.start();
      thread4.start();

      //Joining all the threads
      thread1.join();
      thread2.join();
      thread3.join();
      thread4.join();
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —

status of thread 1: HTTP/1.1 200 OK
Bytes read by thread thread 1: 36907
status of thread 2: HTTP/1.1 200 OK
Bytes read by thread thread 2: 13725
status of thread 3: HTTP/1.1 200 OK
Bytes read by thread thread 3: 17319
status of thread 4: HTTP/1.1 200 OK
Bytes read by thread thread 4: 127018

Apache HttpClient — пользовательский контекст SSL

Используя Secure Socket Layer, вы можете установить защищенное соединение между клиентом и сервером. Это помогает защитить конфиденциальную информацию, такую ​​как номера кредитных карт, имена пользователей, пароли, булавки и т. Д.

Вы можете сделать соединения более безопасными, создав собственный контекст SSL с помощью библиотеки HttpClient .

Выполните шаги, указанные ниже, чтобы настроить SSLContext с помощью библиотеки HttpClient —

Шаг 1 — Создайте объект SSLContextBuilder

SSLContextBuilder является компоновщиком объектов SSLContext. Создайте его объект, используя метод custom () класса SSLContexts .

//Creating SSLContextBuilder object
SSLContextBuilder SSLBuilder = SSLContexts.custom();

Шаг 2 — Загрузите хранилище ключей

В пути Java_home_directory / jre / lib / security / вы можете найти файл с именем cacerts. Сохраните его как файл хранилища ключей (с расширением .jks). Загрузите файл хранилища ключей и его пароль (который по умолчанию изменен ) с помощью метода loadTrustMaterial () класса SSLContextBuilder .

//Loading the Keystore file
File file = new File("mykeystore.jks");
SSLBuilder = SSLBuilder.loadTrustMaterial(file, "changeit".toCharArray());

Шаг 3 — построить объект SSLContext

Объект SSLContext представляет реализацию протокола защищенного сокета. Создайте SSLContext, используя метод build () .

//Building the SSLContext
SSLContext sslContext = SSLBuilder.build();

Шаг 4 — Создание объекта SSLConnectionSocketFactory

SSLConnectionSocketFactory — это многоуровневая фабрика сокетов для соединений TSL и SSL. Используя это, вы можете проверить сервер Https, используя список доверенных сертификатов, и аутентифицировать данный сервер Https.

Вы можете создать это разными способами. В зависимости от способа создания объекта SSLConnectionSocketFactory вы можете разрешить все узлы, разрешить только самозаверяющие сертификаты, разрешить только определенные протоколы и т. Д.

Чтобы разрешить только определенные протоколы , создайте объект SSLConnectionSocketFactory , передав объект SSLContext, строковый массив, представляющий протоколы, должны поддерживаться, строковый массив, представляющий костюмы шифров, должен поддерживаться, и объект HostnameVerifier его конструктору.

new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, null,    
   SSLConnectionSocketFactory.getDefaultHostnameVerifier());

Чтобы разрешить все хосты, создайте объект SSLConnectionSocketFactory , передав объект SSLContext и объект NoopHostnameVerifier .

//Creating SSLConnectionSocketFactory SSLConnectionSocketFactory object
SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());

Шаг 5 — Создайте объект HttpClientBuilder

Создайте объект HttpClientBuilder с помощью метода custom () класса HttpClients .

//Creating HttpClientBuilder
HttpClientBuilder clientbuilder = HttpClients.custom();

Шаг 6 — Установите объект SSLConnectionSocketFactory

Установите для объекта SSLConnectionSocketFactory значение HttpClientBuilder, используя метод setSSLSocketFactory () .

//Setting the SSLConnectionSocketFactory
clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);

Шаг 7 — Постройте объект CloseableHttpClient

Создайте объект CloseableHttpClient , вызвав метод build () .

//Building the CloseableHttpClient
CloseableHttpClient httpclient = clientbuilder.build();

Шаг 8 — Создайте объект HttpGet

Класс HttpGet представляет HTTP-запрос GET, который извлекает информацию о данном сервере с использованием URI.

Создайте HTTP-запрос GET, создав экземпляр класса HttpGet, передав строку, представляющую URI.

//Creating the HttpGet request
HttpGet httpget = new HttpGet("https://example.com/");

Шаг 9 — Выполнить запрос

Выполните запрос, используя метод execute () .

//Executing the request
HttpResponse httpresponse = httpclient.execute(httpget);

пример

Следующий пример демонстрирует настройку SSLContrext —

import java.io.File;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

public class ClientCustomSSL {
   
   public final static void main(String[] args) throws Exception {

      //Creating SSLContextBuilder object
      SSLContextBuilder SSLBuilder = SSLContexts.custom();
  
      //Loading the Keystore file
      File file = new File("mykeystore.jks");
      SSLBuilder = SSLBuilder.loadTrustMaterial(file,
         "changeit".toCharArray());

      //Building the SSLContext usiong the build() method
      SSLContext sslcontext = SSLBuilder.build();
 
      //Creating SSLConnectionSocketFactory object
      SSLConnectionSocketFactory sslConSocFactory = new SSLConnectionSocketFactory(sslcontext, new NoopHostnameVerifier());
 
      //Creating HttpClientBuilder
      HttpClientBuilder clientbuilder = HttpClients.custom();

      //Setting the SSLConnectionSocketFactory
      clientbuilder = clientbuilder.setSSLSocketFactory(sslConSocFactory);

      //Building the CloseableHttpClient
      CloseableHttpClient httpclient = clientbuilder.build();
      
      //Creating the HttpGet request
      HttpGet httpget = new HttpGet("https://example.com/");
 
      //Executing the request
      HttpResponse httpresponse = httpclient.execute(httpget);

      //printing the status line
      System.out.println(httpresponse.getStatusLine());

      //Retrieving the HttpEntity and displaying the no.of bytes read
      HttpEntity entity = httpresponse.getEntity();
      if (entity != null) {
         System.out.println(EntityUtils.toByteArray(entity).length);
      } 
   }
}

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод.

HTTP/1.1 200 OK
1270

Apache HttpClient — Multipart Upload

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

В общем, любая многочастная загрузка состоит из трех частей.

  • Начало загрузки

  • Загрузка частей объекта

  • Завершение многочастной загрузки

Начало загрузки

Загрузка частей объекта

Завершение многочастной загрузки

Для многоэтапной загрузки с использованием HttpClient нам необходимо выполнить следующие шаги:

  • Создать многокомпонентный конструктор.

  • Добавьте нужные части к нему.

  • Завершите сборку и получите составную часть HttpEntity.

  • Создайте запрос, установив вышеуказанный объект muti-part.

  • Выполнить запрос.

Создать многокомпонентный конструктор.

Добавьте нужные части к нему.

Завершите сборку и получите составную часть HttpEntity.

Создайте запрос, установив вышеуказанный объект muti-part.

Выполнить запрос.

Ниже приведены шаги для загрузки составного объекта с использованием библиотеки HttpClient.

Шаг 1 — Создайте объект HttpClient

Метод createDefault () класса HttpClients возвращает объект класса CloseableHttpClient , который является базовой реализацией интерфейса HttpClient. Используя этот метод, создайте объект HttpClient —

//Creating CloseableHttpClient object
CloseableHttpClient httpclient = HttpClients.createDefault();

Шаг 2 — Создать объект FileBody

Класс FileBody представляет двоичную часть тела, поддерживаемую файлом. Создайте экземпляр этого класса, передав объект File и объект ContentType, представляющий тип содержимого.

//Creating a File object
File file = new File("sample.txt");

//Creating the FileBody object
FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

Шаг 3 — Создайте MultipartEntityBuilder

Класс MultipartEntityBuilder используется для создания объекта HttpEntity, состоящего из нескольких частей . Создайте его объект, используя метод create () (того же класса).

//Creating the MultipartEntityBuilder
MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

Шаг 4 — Установите режим

MultipartEntityBuilder имеет три режима: STRICT, RFC6532 и BROWSER_COMPATIBLE. Установите желаемый режим, используя метод setMode () .

//Setting the mode
entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

Шаг 5 — Добавьте различные нужные части

Используя методы addTextBody () , addPart () и addBinaryBody () , вы можете добавить простой текст, файлы, потоки и другие объекты в MultipartBuilder . Добавьте желаемое содержимое с помощью этих методов.

//Adding text
entitybuilder.addTextBody("sample_text", "This is the text part of our file");
//Adding a file
entitybuilder.addBinaryBody("image", new File("logo.png"));

Шаг 6 — Создание единого объекта

Вы можете собрать все эти части в одну сущность, используя метод build () класса MultipartEntityBuilder . Используя этот метод, соберите все части в один HttpEntity .

//Building a single entity using the parts
HttpEntity mutiPartHttpEntity = entityBuilder.build(); 

Шаг 7 — Создание объекта RequestBuilder

Класс RequestBuilder используется для построения запроса путем добавления к нему параметров. Если запрос имеет тип PUT или POST, он добавляет параметры в запрос как объект в кодировке URL.

Создайте объект RequestBuilder (типа POST), используя метод post () . И передайте Uri, которому вы хотите отправить запрос, в качестве параметра.

//Building the post request object
RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

Шаг 8 — Установите объект объекта в RequestBuilder

Установите созданный выше составной объект в RequestBuilder, используя метод setEntity () класса RequestBuilder .

//Setting the entity object to the RequestBuilder
reqbuilder.setEntity(mutiPartHttpEntity);

Шаг 9 — Создайте запрос HttpUriRequest

Создайте объект запроса HttpUriRequest, используя метод build () класса RequestBuilder .

//Building the request
HttpUriRequest multipartRequest = reqbuilder.build();

Шаг 10 — Выполнить запрос

Используя метод execute () , выполните запрос, созданный на предыдущем шаге (обойдя запрос в качестве параметра для этого метода).

//Executing the request
HttpResponse httpresponse = httpclient.execute(multipartRequest);

пример

В следующем примере показано, как отправить многокомпонентный запрос с использованием библиотеки HttpClient. В этом примере мы пытаемся отправить многокомпонентный запрос, подкрепленный файлом.

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class MultipartUploadExample {
 
   public static void main(String args[]) throws Exception{

      //Creating CloseableHttpClient object
      CloseableHttpClient httpclient = HttpClients.createDefault();
 
      //Creating a file object
      File file = new File("sample.txt");

      //Creating the FileBody object
      FileBody filebody = new FileBody(file, ContentType.DEFAULT_BINARY);

      //Creating the MultipartEntityBuilder
      MultipartEntityBuilder entitybuilder = MultipartEntityBuilder.create();

      //Setting the mode
      entitybuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

      //Adding text
      entitybuilder.addTextBody("sample_text", "This is the text part of our file");

      //Adding a file
      entitybuilder.addBinaryBody("image", new File("logo.png"));

      //Building a single entity using the parts
      HttpEntity mutiPartHttpEntity = entitybuilder.build();

      //Building the RequestBuilder request object
      RequestBuilder reqbuilder = RequestBuilder.post("http://httpbin.org/post");

      //Set the entity object to the RequestBuilder
      reqbuilder.setEntity(mutiPartHttpEntity);

      //Building the request
      HttpUriRequest multipartRequest = reqbuilder.build();

      //Executing the request
      HttpResponse httpresponse = httpclient.execute(multipartRequest);

      //Printing the status and the contents of the response
      System.out.println(EntityUtils.toString(httpresponse.getEntity()));
      System.out.println(httpresponse.getStatusLine());
   }
} 

Выход

При выполнении вышеупомянутая программа генерирует следующий вывод —