Apache HttpClient - Guide rapide

Le protocole HTTP (Hypertext Transfer Protocol) est un protocole de niveau application pour les systèmes d'information distribués, collaboratifs et hypermédia. C'est la base de la communication de données pour le World Wide Web (c'est-à-dire Internet) depuis 1990. HTTP est un protocole générique et sans état qui peut être utilisé à d'autres fins ainsi qu'en utilisant des extensions de ses méthodes de demande, codes d'erreur et en-têtes.

Fondamentalement, HTTP est un protocole de communication basé sur TCP / IP, utilisé pour fournir des données (fichiers HTML, fichiers image, résultats de requêtes, etc.) sur le World Wide Web. Le port par défaut est TCP 80, mais d'autres ports peuvent également être utilisés. Il fournit un moyen standardisé pour les ordinateurs de communiquer entre eux. La spécification HTTP définit comment les données de demande des clients seront construites et envoyées au serveur, et comment les serveurs répondent à ces demandes.

Qu'est-ce que Http Client

Le client HTTP est une bibliothèque de transfert, il réside côté client, envoie et reçoit des messages HTTP. Il fournit une mise en œuvre à jour, riche en fonctionnalités et efficace qui répond aux normes HTTP récentes.

En plus de cela à l'aide de la bibliothèque cliente, on peut créer des applications basées sur HTTP telles que des navigateurs Web, des clients de service Web, etc.

Fonctionnalités de Http Client

Voici les principales fonctionnalités du client Http -

  • La bibliothèque HttpClient implémente toutes les méthodes HTTP disponibles.

  • La bibliothèque HttpClient fournit des API pour sécuriser les demandes à l'aide du protocole Secure Socket Layer.

  • En utilisant HttpClient, vous pouvez établir des connexions à l'aide de proxys.

  • Vous pouvez authentifier les connexions à l'aide de schémas d'authentification tels que Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, etc.

  • La bibliothèque HttpClient prend en charge l'envoi de demandes via plusieurs threads. Il gère plusieurs connexions établies à partir de différents threads en utilisantClientConnectionPoolManager.

  • À l'aide de la bibliothèque Apache HttpClient, vous pouvez définir les délais de connexion.

Dans ce chapitre, nous expliquerons comment définir un environnement pour HttpClient dans Eclipse IDE. Avant de procéder à l'installation, assurez-vous que Eclipse est déjà installé sur votre système. Sinon, téléchargez et installez Eclipse.

Pour plus d'informations sur Eclipse, veuillez consulter notre Tutoriel Eclipse .

Étape 1 - Téléchargez le fichier JAR de dépendance

Ouvrez la page d' accueil officielle du site Web HttpClient (composants) et accédez à la page de téléchargement

Ensuite, téléchargez la dernière version stable de HttpClient. Ici, tout au long du tutoriel, nous utilisons la version 4.5.6 donc téléchargez le fichier4.5.6.zip.

Dans le dossier téléchargé, vous trouverez un dossier nommé lib et cela contient les fichiers Jar requis qui doivent être ajoutés dans le chemin de classe de votre projet, pour fonctionner avec HttpClient.

Étape 2 - Créer un projet et définir le chemin de génération

Ouvrez eclipse et créez un exemple de projet. Faites un clic droit sur le projet sélectionnez l'optionBuild Path → Configure Build Path comme indiqué ci-dessous.

dans le Java Build Path cadre dans le Libraries onglet, cliquez sur Add External JARs.

Et sélectionnez tous les fichiers jar dans le dossier lib et cliquez sur Apply and Close.

Vous êtes tous prêts à travailler avec la bibliothèque HttpClient dans eclipse.

La méthode GET est utilisée pour récupérer des informations du serveur donné en utilisant un URI donné. Les requêtes utilisant GET ne doivent récupérer que des données et ne doivent avoir aucun autre effet sur les données.

L'API HttpClient fournit une classe nommée HttpGet qui représente la méthode de requête get.

Suivez les étapes ci-dessous pour envoyer une demande d'obtention à l'aide de la bibliothèque HttpClient

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients classe renvoie un CloseableHttpClient object, qui est l'implémentation de base du HttpClient interface.

En utilisant cette méthode, créez un objet HttpClient comme indiqué ci-dessous -

CloseableHttpClient httpclient = HttpClients.createDefault();

Étape 2 - Créer un objet HttpGet

le HttpGet classe représente la requête HTTPGET qui récupère les informations du serveur donné à l'aide d'un URI.

Créez une requête HTTP GET en instanciant cette classe. Le constructeur de cette classe accepte une valeur String représentant l'URI.

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

Étape 3 - Exécutez la demande d'obtention

le execute() méthode de la CloseableHttpClient La classe accepte un objet HttpUriRequest (interface) (c'est-à-dire HttpGet, HttpPost, HttpPut, HttpHead, etc.) et renvoie un objet de réponse.

Exécutez la demande en utilisant cette méthode comme indiqué ci-dessous -

HttpResponse httpresponse = httpclient.execute(httpget);

Exemple

Voici un exemple qui illustre l'exécution de la requête HTTP GET à l'aide de la bibliothèque 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());
      }
   }
}

Production

Le programme ci-dessus génère la sortie suivante -

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>

Une requête POST est utilisée pour envoyer des données au serveur; par exemple, les informations client, le téléchargement de fichiers, etc., à l'aide de formulaires HTML.

L'API HttpClient fournit une classe nommée HttpPost qui représente la requête POST.

Suivez les étapes ci-dessous pour envoyer une requête HTTP POST à ​​l'aide de la bibliothèque HttpClient.

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients class renvoie un objet de la classe CloseableHttpClient, qui est l'implémentation de base du HttpClient interface.

À l'aide de cette méthode, créez un objet HttpClient.

CloseableHttpClient httpClient = HttpClients.createDefault();

Étape 2 - Créer un objet HttpPost

le HttpPost classe représente le HTTP POSTdemande. Cela envoie les données requises et récupère les informations du serveur donné à l'aide d'un URI.

Créez cette demande en instanciant le HttpPost class et transmettez une valeur de chaîne représentant l'URI, en tant que paramètre à son constructeur.

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

Étape 3 - Exécutez la demande d'obtention

le execute() La méthode de l'objet CloseableHttpClient accepte un objet HttpUriRequest (interface) (c'est-à-dire HttpGet, HttpPost, HttpPut, HttpHead, etc.) et renvoie un objet de réponse.

HttpResponse httpResponse = httpclient.execute(httpget);

Exemple

Voici un exemple qui illustre l'exécution de la requête HTTP POST à ​​l'aide de la bibliothèque 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());
      }
   }
}

Production

Le programme ci-dessus génère la sortie suivante.

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>

Le traitement des réponses HTTP à l'aide des gestionnaires de réponses est recommandé. Dans ce chapitre, nous allons discuter de la création de gestionnaires de réponses et de leur utilisation pour traiter une réponse.

Si vous utilisez le gestionnaire de réponses, toutes les connexions HTTP seront libérées automatiquement.

Créer un gestionnaire de réponses

L'API HttpClient fournit une interface appelée ResponseHandler dans le paquet org.apache.http.client. Afin de créer un gestionnaire de réponse, implémentez cette interface et remplacez son handleResponse() méthode.

Chaque réponse a un code d'état et si le code d'état est compris entre 200 et 300, cela signifie que l'action a été reçue, comprise et acceptée avec succès. Par conséquent, dans notre exemple, nous traiterons les entités des réponses avec de tels codes d'état.

Exécution de la demande à l'aide du gestionnaire de réponse

Suivez les étapes ci-dessous pour exécuter la demande à l'aide d'un gestionnaire de réponse.

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients class renvoie un objet de la classe CloseableHttpClient, qui est l'implémentation de base du HttpClientinterface. À l'aide de cette méthode, créez un objet HttpClient

CloseableHttpClient httpclient = HttpClients.createDefault();

Étape 2 - Instancier le gestionnaire de réponse

Instanciez l'objet gestionnaire de réponse créé ci-dessus à l'aide de la ligne de code suivante -

ResponseHandler<String> responseHandler = new MyResponseHandler();

Étape 3 - Créer un objet HttpGet

le HttpGet La classe représente la requête HTTP GET qui récupère les informations du serveur donné à l'aide d'un URI.

Créez une requête HttpGet en instanciant la classe HttpGet et en passant une chaîne représentant l'URI en tant que paramètre à son constructeur.

ResponseHandler<String> responseHandler = new MyResponseHandler();

Étape 4 - Exécutez la demande Get à l'aide du gestionnaire de réponses

le CloseableHttpClient class a une variante de execute() méthode qui accepte deux objets ResponseHandler et HttpUriRequest, et renvoie un objet de réponse.

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

Exemple

L'exemple suivant illustre l'utilisation des gestionnaires de réponses.

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);
   }
}

Production

Les programmes ci-dessus génèrent la sortie suivante -

<!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>

Si vous traitez les réponses HTTP manuellement au lieu d'utiliser un gestionnaire de réponses, vous devez fermer toutes les connexions http par vous-même. Ce chapitre explique comment fermer les connexions manuellement.

Lors de la fermeture manuelle des connexions HTTP, suivez les étapes ci-dessous -

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients class renvoie un objet de la classe CloseableHttpClient, qui est l'implémentation de base de l'interface HttpClient.

En utilisant cette méthode, créez un HttpClient objet comme indiqué ci-dessous -

CloseableHttpClient httpClient = HttpClients.createDefault();

Étape 2 - Démarrer un bloc d'essai

Démarrez un bloc try-finally, écrivez le code restant dans les programmes du bloc try et fermez l'objet CloseableHttpClient dans le bloc finally.

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

Étape 3 - Créer un HttpGetobject

le HttpGet La classe représente la requête HTTP GET qui récupère les informations du serveur donné à l'aide d'un URI.

Créez une requête HTTP GET en instanciant la classe HttpGet en passant une chaîne représentant l'URI.

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

Étape 4 - Exécutez la demande Get

le execute() méthode de la CloseableHttpClient objet accepte un HttpUriRequest (interface) (c'est-à-dire HttpGet, HttpPost, HttpPut, HttpHead etc.) et renvoie un objet de réponse.

Exécutez la requête en utilisant la méthode donnée -

HttpResponse httpResponse = httpclient.execute(httpGet);

Étape 5 - Commencer un autre essai (imbriqué)

Démarrez un autre bloc try-finally (imbriqué dans le dernier try-finally), écrivez le code restant dans les programmes de ce bloc try et fermez l'objet HttpResponse dans le bloc finally.

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

Exemple

Chaque fois que vous créez / obtenez des objets tels que la requête, le flux de réponse, etc., démarrez un bloc try

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();
      }
   }
}

Production

Lors de l'exécution du programme ci-dessus, la sortie suivante est générée -

<!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>

Vous pouvez abandonner la requête HTTP actuelle à l'aide du abort() méthode, c'est-à-dire qu'après avoir invoqué cette méthode, sur une requête particulière, son exécution sera abandonnée.

Si cette méthode est appelée après une exécution, les réponses de cette exécution ne seront pas affectées et les exécutions suivantes seront abandonnées.

Exemple

Si vous observez l'exemple suivant, nous avons créé une requête HttpGet, imprimé le format de requête utilisé à l'aide du getMethod().

Ensuite, nous avons effectué une autre exécution avec la même requête. Imprimé à nouveau la ligne d'état en utilisant la 1ère exécution. Enfin, imprimé la ligne d'état de la deuxième exécution.

Comme discuté, les réponses de la 1ère exécution (exécution avant la méthode d'abandon) sont imprimées (y compris la deuxième ligne d'état qui est écrite après la méthode d'abandon) et, toutes les exécutions ultérieures de la demande en cours après la méthode d'abandon échouent en invoquant un exception.

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());
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

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)

Les intercepteurs sont ceux qui aident à obstruer ou à modifier les demandes ou les réponses. Les intercepteurs de protocole agissent en général sur un en-tête spécifique ou un groupe d'en-têtes associés. La bibliothèque HttpClient prend en charge les intercepteurs.

Demander un intercepteur

le HttpRequestInterceptorinterface représente les intercepteurs de demande. Cette interface contient une méthode connue sous le nom de processus dans lequel vous devez écrire le morceau de code pour intercepter les requêtes.

Côté client, cette méthode vérifie / traite les requêtes avant de les envoyer au serveur et, côté serveur, cette méthode est exécutée avant d'évaluer le corps de la requête.

Création d'un intercepteur de demande

Vous pouvez créer un intercepteur de demande en suivant les étapes ci-dessous.

Step 1 - Create an object of HttpRequestInterceptor

Créez un objet de l'interface HttpRequestInterceptor en implémentant son processus de méthode abstraite.

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

Step 2 - Instantiate CloseableHttpClient object

Construire une personnalisation CloseableHttpClient objet en lui ajoutant l'intercepteur créé ci-dessus comme indiqué ci-dessous -

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

À l'aide de cet objet, vous pouvez effectuer les exécutions de requêtes comme d'habitude.

Exemple

L'exemple suivant montre l'utilisation des intercepteurs de demande. Dans cet exemple, nous avons créé un objet de requête HTTP GET et ajouté trois en-têtes: exemple-en-tête, démo-en-tête et test-en-tête.

dans le processor()méthode de l'intercepteur, nous vérifions les en-têtes de la requête envoyée; si l'un de ces en-têtes estsample-header, nous essayons de le supprimer et d'afficher la liste des en-têtes de cette requête particulière.

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());
   }
}

Production

Lors de l'exécution du programme ci-dessus, la sortie suivante est générée -

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

Intercepteur de réponse

le HttpResponseInterceptorinterface représente les intercepteurs de réponse. Cette interface contient une méthode appeléeprocess(). Dans cette méthode, vous devez écrire le morceau de code pour intercepter les réponses.

Côté serveur, cette méthode vérifie / traite la réponse avant de l'envoyer au client, et côté client, cette méthode est exécutée avant d'évaluer le corps de la réponse.

Créer un intercepteur de réponse

Vous pouvez créer un intercepteur de réponse en suivant les étapes ci-dessous -

Step 1 - Create an object of HttpResponseInterceptor

Créez un objet du HttpResponseInterceptor interface en implémentant sa méthode abstraite process.

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

Étape 2: instancier l'objet CloseableHttpClient

Construire une personnalisation CloseableHttpClient objet en y ajoutant l'intercepteur créé ci-dessus, comme indiqué ci-dessous -

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

À l'aide de cet objet, vous pouvez effectuer les exécutions de requêtes comme d'habitude.

Exemple

L'exemple suivant illustre l'utilisation des intercepteurs de réponse. Dans cet exemple, nous avons ajouté trois en-têtes: sample-header, demo-header et test-header à la réponse dans le processeur.

Après avoir exécuté la requête et obtenu la réponse, nous avons imprimé les noms de tous les en-têtes de la réponse en utilisant le getAllHeaders() méthode.

Et dans la sortie, vous pouvez observer les noms de trois en-têtes dans la liste.

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());
      }
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère le résultat suivant -

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

En utilisant HttpClient, vous pouvez vous connecter à un site Web nécessitant un nom d'utilisateur et un mot de passe. Ce chapitre explique comment exécuter une demande client sur un site qui demande un nom d'utilisateur et un mot de passe.

Étape 1 - Créer un objet CredentialsProvider

le CredentialsProviderL'interface gère une collection pour contenir les informations de connexion de l'utilisateur. Vous pouvez créer son objet en instanciant leBasicCredentialsProvider class, l'implémentation par défaut de cette interface.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Étape 2 - Définissez les informations d'identification

Vous pouvez définir les informations d'identification requises pour l'objet CredentialsProvider à l'aide du setCredentials() méthode.

Cette méthode accepte deux objets comme indiqué ci-dessous -

  • AuthScope object - Portée d'authentification spécifiant les détails tels que le nom d'hôte, le numéro de port et le nom du schéma d'authentification.

  • Credentials object - Spécification des identifiants (nom d'utilisateur, mot de passe).

Définissez les informations d'identification à l'aide du setCredentials() méthode pour l'hôte et le proxy comme indiqué ci-dessous -

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

Étape 3 - Créer un objet HttpClientBuilder

Créer un HttpClientBuilder en utilisant le custom() méthode de la HttpClients classe.

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

Étape 4 - Définissez les informations d'identification

Vous pouvez définir l'objet credentialsPovider créé ci-dessus sur un HttpClientBuilder à l'aide du setDefaultCredentialsProvider() méthode.

Définissez l'objet CredentialProvider créé à l'étape précédente sur le générateur client en le transmettant au CredentialsProvider object() méthode comme indiqué ci-dessous.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Étape 5 - Créez le CloseableHttpClient

Construisez le CloseableHttpClient objet utilisant le build() méthode de la HttpClientBuilder classe.

CloseableHttpClient httpclient = clientbuilder.build()

Étape 6 - Créez un objet HttpGet et exécutez-le

Créez un objet HttpRequest en instanciant la classe HttpGet. Exécutez cette demande en utilisant leexecute() méthode.

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

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

Exemple

Voici un exemple de programme qui montre l'exécution d'une requête HTTP sur un site cible nécessitant une authentification utilisateur.

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());
      }
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante.

GET
HTTP/1.1 200 OK
200

Un serveur proxy est un serveur intermédiaire entre le client et Internet. Les serveurs proxy offrent les fonctionnalités de base suivantes -

  • Pare-feu et filtrage des données réseau

  • Partage de connexion réseau

  • Mise en cache des données

À l'aide de la bibliothèque HttpClient, vous pouvez envoyer une requête HTTP à l'aide d'un proxy. Suivez les étapes ci-dessous -

Étape 1 - Créer un objet HttpHost

Instancier le HttpHost classe de la org.apache.http package en passant un paramètre de chaîne représentant le nom de l'hôte proxy, (à partir duquel vous devez envoyer les requêtes) à son constructeur.

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

De la même manière, créez un autre objet HttpHost pour représenter l'hôte cible auquel les demandes doivent être envoyées.

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

Étape 2 - Créez un objet HttpRoutePlanner

le HttpRoutePlannerinterface calcule une route vers un hôte spécifié. Créez un objet de cette interface en instanciant leDefaultProxyRoutePlannerclass, une implémentation de cette interface. En tant que paramètre à son constructeur, transmettez l'hôte proxy créé ci-dessus -

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

Étape 3 - Définissez le planificateur d'itinéraire sur un constructeur client

En utilisant le custom() méthode de la HttpClients classe, créez un HttpClientBuilder et, sur cet objet, définissez le planificateur d'itinéraire créé ci-dessus, en utilisant le setRoutePlanner() méthode.

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

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Étape 4 - Construisez l'objet CloseableHttpClient

Construisez le CloseableHttpClient objet en appelant le build() méthode.

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

Étape 5 - Créer un HttpGetobject

Créez une requête HTTP GET en instanciant le HttpGet classe.

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

Étape 6 - Exécutez la demande

L'une des variantes du execute() méthode accepte un HttpHost et HttpRequestobjets et exécute la requête. Exécutez la requête en utilisant cette méthode -

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

Exemple

L'exemple suivant montre comment envoyer une requête HTTP à un serveur via un proxy. Dans cet exemple, nous envoyons une requête HTTP GET à google.com via localhost. Nous avons imprimé les en-têtes de la réponse et le corps de la réponse.

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));
      }
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

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>

Dans ce chapitre, nous allons apprendre à créer une HttpRequest authentifiée à l'aide d'un nom d'utilisateur et d'un mot de passe et à la tunneliser via un proxy vers un hôte cible, à l'aide d'un exemple.

Étape 1 - Créer un objet CredentialsProvider

L'interface CredentialsProvider gère une collection pour contenir les informations d'identification de connexion de l'utilisateur. Vous pouvez créer son objet en instanciant la classe BasicCredentialsProvider, l'implémentation par défaut de cette interface.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Étape 2 - Définissez les informations d'identification

Vous pouvez définir les informations d'identification requises pour l'objet CredentialsProvider à l'aide du setCredentials()méthode. Cette méthode accepte deux objets -

  • AuthScope object - Portée d'authentification spécifiant les détails tels que le nom d'hôte, le numéro de port et le nom du schéma d'authentification.

  • Credentials object- Spécification des identifiants (nom d'utilisateur, mot de passe). Définissez les informations d'identification à l'aide dusetCredentials() méthode pour l'hôte et le proxy comme indiqué ci-dessous.

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

Étape 3 - Créez un objet HttpClientBuilder

Créer un HttpClientBuilder en utilisant le custom() méthode de la HttpClients classe comme indiqué ci-dessous -

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

Étape 4 - Définissez le CredentialsProvider

Vous pouvez définir l'objet CredentialsProvider sur un objet HttpClientBuilder à l'aide du setDefaultCredentialsProvider()méthode. Passer le précédemment crééCredentialsProvider objecter à cette méthode.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Étape 5 - Créez le CloseableHttpClient

Construisez le CloseableHttpClient objet utilisant le build() méthode.

CloseableHttpClient httpclient = clientbuilder.build();

Étape 6 - Créez le proxy et les hôtes cibles

Créez les hôtes cible et proxy en instanciant le HttpHost classe.

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

Étape 7 - Définissez le proxy et créez un objet RequestConfig

Créer un RequestConfig.Builder objet utilisant le custom()méthode. Définissez l'objet proxyHost précédemment créé sur leRequestConfig.Builder en utilisant le setProxy()méthode. Enfin, construisez leRequestConfig objet utilisant le build() méthode.

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

Étape 8 - Créez un objet de requête HttpGet et définissez-lui l'objet de configuration.

Créer un HttpGetobjet en instanciant la classe HttpGet. Définissez l'objet de configuration créé à l'étape précédente sur cet objet à l'aide dusetConfig() méthode.

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

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

Étape 9 - Exécutez la demande

Exécutez la requête en transmettant l'objet HttpHost (cible) et la requête (HttpGet) en tant que paramètres au execute() méthode.

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

Exemple

L'exemple suivant montre comment exécuter une requête HTTP via un proxy à l'aide d'un nom d'utilisateur et d'un mot de passe.

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());

   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

HTTP/1.1 200 OK

En utilisant la bibliothèque HttpClient, vous pouvez envoyer une demande ou vous connecter à un formulaire en passant des paramètres.

Suivez les étapes ci-dessous pour vous connecter à un formulaire.

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients class renvoie un objet de la classe CloseableHttpClient, qui est l'implémentation de base de l'interface HttpClient. À l'aide de cette méthode, créez un objet HttpClient -

CloseableHttpClient httpClient = HttpClients.createDefault();

Étape 2 - Créer un objet RequestBuilder

La classe RequestBuilderest utilisé pour créer une requête en y ajoutant des paramètres. Si le type de demande est PUT ou POST, il ajoute les paramètres à la demande en tant qu'entité encodée en URL

Créez un objet RequestBuilder (de type POST) à l'aide de la méthode post ().

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

Étape 3 - Définissez l'URI et les paramètres sur RequestBuilder.

Définissez l'URI et les paramètres sur l'objet RequestBuilder à l'aide du setUri() et addParameter() méthodes de la classe RequestBuilder.

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

Étape 4 - Générez l'objet HttpUriRequest

Après avoir défini les paramètres requis, créez le HttpUriRequest objet utilisant le build() méthode.

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

Étape 5 - Exécutez la demande

La méthode execute de l'objet CloseableHttpClient accepte un objet HttpUriRequest (interface) (c'est-à-dire HttpGet, HttpPost, HttpPut, HttpHead etc.) et renvoie un objet de réponse.

Exécutez la requête HttpUriRequest créée lors des étapes précédentes en la transmettant au execute() méthode.

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

Exemple

L'exemple suivant montre comment se connecter à un formulaire en envoyant des informations de connexion. Ici, nous avons envoyé deux paramètres -username and password dans un formulaire et a essayé d'imprimer l'entité de message et l'état de la demande.

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());
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

{
   "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

Connexion par formulaire avec cookies

Si votre formulaire stocke des cookies, au lieu de créer par défaut CloseableHttpClient objet.

Create a CookieStore object en instanciant la classe BasicCookieStore.

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

Create a HttpClientBuilder en utilisant le custom() méthode de la HttpClients classe.

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

Set the cookie store to the client builder en utilisant la méthode setDefaultCookieStore ().

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

Construisez le CloseableHttpClient objet utilisant le build() méthode.

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

Construisez le HttpUriRequest objet comme spécifié ci-dessus en passant exécutez la requête.

Si la page stocke des cookies, les paramètres que vous avez transmis seront ajoutés au magasin de cookies.

Vous pouvez imprimer le contenu du CookieStore objet où vous pouvez voir vos paramètres (avec les précédents la page stockée dans le cas).

Pour imprimer les cookies, récupérez tous les cookies du CookieStore objet utilisant le getCookies()méthode. Cette méthode renvoie unListobjet. À l'aide d'itérateur, imprimez le contenu des objets de liste comme indiqué ci-dessous -

//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());
}

Les cookies sont des fichiers texte stockés sur l'ordinateur client et ils sont conservés à diverses fins de suivi des informations.

HttpClient fournit un support pour les cookies, vous pouvez créer et gérer les cookies.

Créer un cookie

Suivez les étapes ci-dessous pour créer un cookie à l'aide de la bibliothèque HttpClient.

Étape 1 - Créer un objet Cookiestore

le CookieStoreL'interface représente le magasin abstrait pour les objets Cookie. Vous pouvez créer un magasin de cookies en instanciant leBasicCookieStore class, une implémentation par défaut de cette interface.

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

Étape 2 - Créer un objet ClientCookie

En plus des fonctionnalités d'un cookie, ClientCookie peut récupérer les cookies d'origine sur le serveur. Vous pouvez créer un cookie client en instanciant leBasicClientCookieclasse. Au constructeur de cette classe, vous devez transmettre la paire clé-valeur que vous souhaitez stocker dans ce cookie particulier.

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

Étape 3 - Définissez les valeurs du cookie

Pour un cookie client, vous pouvez définir / supprimer le chemin, la valeur, la version, la date d'expiration, le domaine, le commentaire et l'attribut à l'aide des méthodes respectives.

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);

Étape 4 - Ajouter un cookie au magasin de cookies

Vous pouvez ajouter des cookies au magasin de cookies en utilisant le addCookie() méthode de la BasicCookieStore classe.

Ajoutez les cookies requis au Cookiestore.

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

Exemple

L'exemple suivant montre comment créer des cookies et les ajouter à un magasin de cookies. Ici, nous avons créé un magasin de cookies, un tas de cookies en définissant les valeurs de domaine et de chemin, et les avons ajoutés au magasin de cookies.

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);
   }
}

Récupérer un cookie

Vous pouvez ajouter les cookies à un magasin de cookies en utilisant getCookies() méthode de la asicCookieStoreclasse. Cette méthode renvoie une liste contenant tous les cookies du magasin de cookies.

Vous pouvez imprimer le contenu d'un magasin de cookies à l'aide de l'itérateur comme indiqué ci-dessous -

//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());
}

Exemple

L'exemple suivant montre comment récupérer des cookies à partir d'un magasin de cookies. Ici, nous ajoutons un tas de cookies à un magasin de cookies et les récupérons.

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);
   }
}

Production

Lors de l'exécution, ce programme génère la sortie suivante -

[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]

Un programme multithread contient deux ou plusieurs parties qui peuvent s'exécuter simultanément et chaque partie peut gérer une tâche différente en même temps en utilisant de manière optimale les ressources disponibles.

Vous pouvez exécuter des requêtes à partir de plusieurs threads en écrivant un programme HttpClient multithread.

Si vous souhaitez exécuter plusieurs demandes client à partir de threads consécutivement, vous devez créer un ClientConnectionPoolManager. Il maintient une piscine deHttpClientConnections et sert plusieurs demandes de threads.

Le gestionnaire de connexions regroupe les connexions en fonction de l'itinéraire. Si le gestionnaire a des connexions pour un itinéraire particulier, il répond aux nouvelles demandes dans ces itinéraires en louant une connexion existante du pool, au lieu d'en créer une nouvelle.

Suivez les étapes pour exécuter les demandes de plusieurs threads -

Étape 1 - Création du gestionnaire de pool de connexions client

Créez le gestionnaire de pool de connexions client en instanciant le PoolingHttpClientConnectionManager classe.

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

Étape 2 - Définissez le nombre maximum de connexions

Définissez le nombre maximal de connexions dans le pool à l'aide du setMaxTotal() méthode.

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

Étape 3 - Créer un objet ClientBuilder

Créer un ClientBuilder Objet en définissant le gestionnaire de connexions à l'aide de setConnectionManager() méthode comme indiqué ci-dessous -

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

Étape 4 - Créez les objets de requête HttpGet

Instanciez la classe HttpGet en passant l'URI souhaité à son constructeur en tant que paramètre.

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

Étape 5 - Implémentation de la méthode d'exécution

Assurez-vous que vous avez créé une classe, en avez fait un thread (soit en étendant la classe de thread, soit en implémentant l'interface Runnable) et en implémentant la méthode run.

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

Étape 6 - Créer des objets Thread

Créez des objets de thread en instanciant la classe Thread (ClientMultiThreaded) créée ci-dessus.

Passez un objet HttpClient, un objet HttpGet respectif et un entier représentant l'ID à ces threads.

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

Étape 7 - Démarrez et rejoignez les discussions

Démarrez tous les threads en utilisant start() et rejoignez-les en utilisant la jointure method().

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

Étape 8 - Exécuter la mise en œuvre de la méthode

Dans la méthode run, exécutez la demande, récupérez la réponse et imprimez les résultats.

Exemple

L'exemple suivant montre l'exécution de requêtes HTTP simultanément à partir de plusieurs threads. Dans cet exemple, nous essayons d'exécuter diverses requêtes à partir de différents threads et essayons d'imprimer l'état et le nombre d'octets lus par chaque client.

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();
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

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

À l'aide de Secure Socket Layer, vous pouvez établir une connexion sécurisée entre le client et le serveur. Il aide à protéger les informations sensibles telles que les numéros de carte de crédit, les noms d'utilisateur, les mots de passe, les broches, etc.

Vous pouvez rendre les connexions plus sécurisées en créant votre propre contexte SSL à l'aide du HttpClient bibliothèque.

Suivez les étapes ci-dessous pour personnaliser SSLContext à l'aide de la bibliothèque HttpClient -

Étape 1 - Créer un objet SSLContextBuilder

SSLContextBuilderest le générateur des objets SSLContext. Créez son objet à l'aide ducustom() méthode de la SSLContexts classe.

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

Étape 2 - Charger le keystore

Sur le chemin Java_home_directory/jre/lib/security/, vous pouvez trouver un fichier nommé cacerts. Enregistrez-le en tant que fichier de stockage de clés (avec l'extension .jks). Chargez le fichier keystore et son mot de passe (qui estchangeit par défaut) en utilisant le loadTrustMaterial() méthode de la SSLContextBuilder classe.

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

Étape 3 - Créer un objet SSLContext

Un objet SSLContext représente une implémentation de protocole de socket sécurisé. Créez un SSLContext à l'aide debuild() méthode.

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

Étape 4 - Création de l'objet SSLConnectionSocketFactory

SSLConnectionSocketFactoryest une fabrique de sockets en couches pour les connexions TSL et SSL. Grâce à cela, vous pouvez vérifier le serveur Https à l'aide d'une liste de certificats de confiance et authentifier le serveur Https donné.

Vous pouvez créer cela de plusieurs manières. Selon la façon dont vous créez unSSLConnectionSocketFactory objet, vous pouvez autoriser tous les hôtes, autoriser uniquement les certificats auto-signés, autoriser uniquement des protocoles particuliers, etc.

To allow only particular protocols, créer SSLConnectionSocketFactory objet en passant un objet SSLContext, un tableau de chaînes représentant les protocoles doit être pris en charge, un tableau de chaînes représentant les combinaisons de chiffrement doit être pris en charge et un objet HostnameVerifier à son constructeur.

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

To allow all hosts, créer SSLConnectionSocketFactory objet en passant un objet SSLContext et un NoopHostnameVerifier objet.

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

Étape 5 - Créez un objet HttpClientBuilder

Créez un objet HttpClientBuilder à l'aide du custom() méthode de la HttpClients classe.

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

Étape 6 - Définissez l'objet SSLConnectionSocketFactory

Définissez l'objet SSLConnectionSocketFactory sur HttpClientBuilder en utilisant le setSSLSocketFactory() méthode.

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

Étape 7 - Créer l'objet CloseableHttpClient

Construisez le CloseableHttpClient objet en appelant le build() méthode.

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

Étape 8 - Créer un objet HttpGet

le HttpGet La classe représente la requête HTTP GET qui récupère les informations du serveur donné à l'aide d'un URI.

Créez une requête HTTP GET en instanciant la classe HttpGet en passant une chaîne représentant l'URI.

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

Étape 9 - Exécutez la demande

Exécutez la requête à l'aide du execute() méthode.

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

Exemple

L'exemple suivant montre la personnalisation du 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);
      } 
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante.

HTTP/1.1 200 OK
1270

En utilisant HttpClient, nous pouvons effectuer un téléchargement en plusieurs parties, c'est-à-dire que nous pouvons télécharger des objets plus volumineux en parties plus petites. Dans ce chapitre, nous démontrons le téléchargement en plusieurs parties dans le client HTTP en téléchargeant un simple fichier texte.

En général, tout téléchargement en plusieurs parties contient trois parties.

  • Lancement du téléchargement

  • Téléchargement des parties d'objet

  • Terminer le téléchargement en plusieurs parties

Pour le téléchargement en plusieurs parties à l'aide de HttpClient, nous devons suivre les étapes ci-dessous -

  • Créez un générateur en plusieurs parties.

  • Ajoutez-y les pièces souhaitées.

  • Terminez la construction et obtenez un HttpEntity en plusieurs parties.

  • Demande de génération en définissant l'entité en plusieurs parties ci-dessus.

  • Exécutez la demande.

Voici les étapes pour télécharger une entité en plusieurs parties à l'aide de la bibliothèque HttpClient.

Étape 1 - Créer un objet HttpClient

le createDefault() méthode de la HttpClients class renvoie un objet de la classe CloseableHttpClient, qui est l'implémentation de base de l'interface HttpClient. À l'aide de cette méthode, créez un objet HttpClient -

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

Étape 2 - Créer un objet FileBody

FileBodyclass représente la partie du corps binaire sauvegardée par un fichier. Instanciez cette classe en passant unFile objet et un ContentType objet représentant le type du contenu.

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

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

Étape 3 - Créer un MultipartEntityBuilder

le MultipartEntityBuilder la classe est utilisée pour construire le multi-part HttpEntityobjet. Créez son objet à l'aide ducreate() méthode (de la même classe).

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

Étape 4 - Réglez le mode

UNE MultipartEntityBuildera trois modes: STRICT, RFC6532 et BROWSER_COMPATIBLE. Réglez-le sur le mode souhaité à l'aide dusetMode() méthode.

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

Étape 5 - Ajouter diverses pièces souhaitées

Utiliser les méthodes addTextBody(), addPart () et, addBinaryBody(), vous pouvez ajouter du texte simple, des fichiers, des flux et d'autres objets à un MultipartBuilder. Ajoutez le contenu souhaité à l'aide de ces méthodes.

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

Étape 6 - Construire une seule entité

Vous pouvez créer toutes ces pièces en une seule entité en utilisant le build() méthode de la MultipartEntityBuilderclasse. En utilisant cette méthode, créez toutes les pièces en un seulHttpEntity.

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

Étape 7 - Créer un objet RequestBuilder

La classe RequestBuilderest utilisé pour créer une requête en y ajoutant des paramètres. Si la requête est de type PUT ou POST, elle ajoute les paramètres à la requête en tant qu'entité encodée en URL.

Créez un objet RequestBuilder (de type POST) à l'aide du post()méthode. Et transmettez l'URI auquel vous vouliez envoyer la requête en tant que paramètre.

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

Étape 8 - Définissez l'objet d'entité sur RequestBuilder

Définissez l'entité en plusieurs parties créée ci-dessus sur RequestBuilder à l'aide du setEntity() méthode de la RequestBuilder classe.

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

Étape 9 - Créez le HttpUriRequest

Construire un HttpUriRequest objet de requête à l'aide de build() méthode de la RequestBuilder classe.

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

Étape 10 - Exécutez la demande

En utilisant le execute() méthode, exécutez la requête générée à l'étape précédente (en contournant la requête en tant que paramètre de cette méthode).

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

Exemple

L'exemple suivant montre comment envoyer une requête en plusieurs parties à l'aide de la bibliothèque HttpClient. Dans cet exemple, nous essayons d'envoyer une requête en plusieurs parties soutenue par un fichier.

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());
   }
}

Production

Lors de l'exécution, le programme ci-dessus génère la sortie suivante -

{
   "args": {},
   "data": "",
   "files": {
      "image": "data:application/octets66PohrH3IWNk1FzpohfdXPIfv9X3490FGcuXsHn9X0piCwomF/xdgADZ9GsfSyvLYAAAAAE
      lFTkSuQmCC"
   },
   "form": {
      "sample_text": "This is the text part of our file"
   },
   "headers": {
      "Accept-Encoding": "gzip,deflate",
      "Connection": "close",
      "Content-Length": "11104", 
      "Content-Type": "multipart/form-data;
      boundary=UFJbPHT7mTwpVq70LpZgCi5I2nvxd1g-I8Rt",
      "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