Apache HttpClient - Guia rápido

O protocolo de transferência de hipertexto (HTTP) é um protocolo de nível de aplicativo para sistemas de informação hipermídia distribuídos e colaborativos. Esta é a base para a comunicação de dados para a World Wide Web (ou seja, Internet) desde 1990. HTTP é um protocolo genérico e sem estado que pode ser usado para outros fins, também usando extensões de seus métodos de solicitação, códigos de erro e cabeçalhos.

Basicamente, HTTP é um protocolo de comunicação baseado em TCP / IP, que é usado para entregar dados (arquivos HTML, arquivos de imagem, resultados de consultas, etc.) na World Wide Web. A porta padrão é TCP 80, mas outras portas também podem ser usadas. Ele fornece uma maneira padronizada para os computadores se comunicarem entre si. A especificação HTTP define como os dados de solicitação dos clientes serão construídos e enviados ao servidor e como os servidores respondem a essas solicitações.

O que é Cliente Http

O cliente Http é uma biblioteca de transferência que reside no lado do cliente, envia e recebe mensagens HTTP. Ele fornece uma implementação atualizada, rica em recursos e eficiente que atende aos padrões HTTP recentes.

Além disso, usando a biblioteca de cliente, pode-se construir aplicativos baseados em HTTP, como navegadores da web, clientes de serviço da web, etc.

Recursos do cliente Http

A seguir estão os recursos proeminentes do cliente Http -

  • A biblioteca HttpClient implementa todos os métodos HTTP disponíveis.

  • A biblioteca HttpClient fornece APIs para proteger as solicitações usando o protocolo Secure Socket Layer.

  • Usando HttpClient, você pode estabelecer conexões usando proxies.

  • Você pode autenticar conexões usando esquemas de autenticação como Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session etc.

  • A biblioteca HttpClient oferece suporte ao envio de solicitações por meio de vários threads. Ele gerencia várias conexões estabelecidas a partir de vários threads usandoClientConnectionPoolManager.

  • Usando a biblioteca Apache HttpClient, você pode definir tempos limite de conexão.

Neste capítulo, explicaremos como definir um ambiente para HttpClient no Eclipse IDE. Antes de prosseguir com a instalação, certifique-se de que já possui o Eclipse instalado em seu sistema. Caso contrário, baixe e instale o Eclipse.

Para obter mais informações sobre o Eclipse, consulte nosso Tutorial do Eclipse .

Etapa 1 - Baixe o arquivo JAR de dependência

Abra a página inicial oficial do site HttpClient (componentes) e vá para a página de download

Em seguida, baixe a última versão estável do HttpClient. Aqui, ao longo do tutorial, estamos usando a versão 4.5.6, portanto, baixe o arquivo4.5.6.zip.

Dentro da pasta baixada, você encontrará uma pasta chamada lib e contém os arquivos Jar necessários que devem ser adicionados ao classpath do seu projeto, para funcionar com o HttpClient.

Etapa 2 - Criar um projeto e definir o caminho de construção

Abra o eclipse e crie um projeto de amostra. Clique com o botão direito no projeto selecione a opçãoBuild Path → Configure Build Path como mostrado abaixo.

No Java Build Path quadro no Libraries guia, clique em Add External JARs.

E selecione todos os arquivos jar na pasta lib e clique em Apply and Close.

Você está pronto para trabalhar com a biblioteca HttpClient no eclipse.

O método GET é usado para recuperar informações de um determinado servidor usando um determinado URI. As solicitações que usam GET devem recuperar apenas dados e não devem ter nenhum outro efeito sobre os dados.

A API HttpClient fornece uma classe chamada HttpGet que representa o método de solicitação get.

Siga as etapas abaixo para enviar uma solicitação get usando a biblioteca HttpClient

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um CloseableHttpClient objeto, que é a implementação básica do HttpClient interface.

Usando este método, crie um objeto HttpClient conforme mostrado abaixo -

CloseableHttpClient httpclient = HttpClients.createDefault();

Etapa 2 - Criar um objeto HttpGet

o HttpGet classe representa a solicitação HTTPGET que recupera as informações do servidor fornecido usando um URI.

Crie uma solicitação HTTP GET instanciando esta classe. O construtor desta classe aceita um valor String que representa o URI.

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

Etapa 3 - Executar a solicitação Get

o execute() método do CloseableHttpClient classe aceita um objeto HttpUriRequest (interface) (isto é, HttpGet, HttpPost, HttpPut, HttpHead etc.) e retorna um objeto de resposta.

Execute a solicitação usando este método conforme mostrado abaixo -

HttpResponse httpresponse = httpclient.execute(httpget);

Exemplo

A seguir está um exemplo que demonstra a execução da solicitação HTTP GET usando a biblioteca 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());
      }
   }
}

Resultado

O programa acima gera a seguinte saída -

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>

Uma solicitação POST é usada para enviar dados ao servidor; por exemplo, informações do cliente, upload de arquivo, etc., usando formulários HTML.

A API HttpClient fornece uma classe chamada HttpPost que representa a solicitação POST.

Siga as etapas fornecidas abaixo para enviar uma solicitação HTTP POST usando a biblioteca HttpClient.

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um objeto da classe CloseableHttpClient, que é a implementação básica do HttpClient interface.

Usando esse método, crie um objeto HttpClient.

CloseableHttpClient httpClient = HttpClients.createDefault();

Etapa 2 - Criar objeto HttpPost

o HttpPost classe representa o HTTP POSTsolicitação. Isso envia os dados necessários e recupera as informações do servidor fornecido usando um URI.

Crie esta solicitação instanciando o HttpPost classe e passa um valor string representando o URI, como um parâmetro para seu construtor.

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

Etapa 3 - Executar a solicitação Get

o execute() O método do objeto CloseableHttpClient aceita um objeto HttpUriRequest (interface) (isto é, HttpGet, HttpPost, HttpPut, HttpHead etc.) e retorna um objeto de resposta.

HttpResponse httpResponse = httpclient.execute(httpget);

Exemplo

A seguir está um exemplo que demonstra a execução da solicitação HTTP POST usando a biblioteca 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());
      }
   }
}

Resultado

O programa acima gera a seguinte saída.

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>

O processamento das respostas HTTP usando os manipuladores de resposta é recomendado. Neste capítulo, vamos discutir como criar manipuladores de resposta e como usá-los para processar uma resposta.

Se você usar o manipulador de resposta, todas as conexões HTTP serão liberadas automaticamente.

Criação de um manipulador de resposta

A API HttpClient fornece uma interface conhecida como ResponseHandler Na embalagem org.apache.http.client. Para criar um manipulador de resposta, implemente esta interface e substitua seu handleResponse() método.

Cada resposta possui um código de status e se o código de status estiver entre 200 e 300, significa que a ação foi recebida, compreendida e aceita com sucesso. Portanto, em nosso exemplo, trataremos as entidades das respostas com tais códigos de status.

Executar a solicitação usando o manipulador de resposta

Siga as etapas fornecidas a seguir para executar a solicitação usando um manipulador de resposta.

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um objeto da classe CloseableHttpClient, que é a implementação básica do HttpClientinterface. Usando este método, crie um objeto HttpClient

CloseableHttpClient httpclient = HttpClients.createDefault();

Etapa 2 - Instancie o manipulador de resposta

Instancie o objeto do manipulador de resposta criado acima usando a seguinte linha de código -

ResponseHandler<String> responseHandler = new MyResponseHandler();

Etapa 3 - Criar um objeto HttpGet

o HttpGet classe representa a solicitação HTTP GET que recupera as informações do servidor fornecido usando um URI.

Crie uma solicitação HttpGet instanciando a classe HttpGet e passando uma string que representa o URI como um parâmetro para seu construtor.

ResponseHandler<String> responseHandler = new MyResponseHandler();

Etapa 4 - Executar a solicitação Get usando o manipulador de resposta

o CloseableHttpClient classe tem uma variante de execute() método que aceita dois objetos ResponseHandler e HttpUriRequest e retorna um objeto de resposta.

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

Exemplo

O exemplo a seguir demonstra o uso de manipuladores de resposta.

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

Resultado

Os programas acima geram a seguinte saída -

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

Se você estiver processando respostas HTTP manualmente em vez de usar um manipulador de resposta, será necessário fechar todas as conexões http sozinho. Este capítulo explica como fechar as conexões manualmente.

Ao fechar as conexões HTTP manualmente, siga as etapas abaixo -

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um objeto da classe CloseableHttpClient, que é a implementação básica da interface HttpClient.

Usando este método, crie um HttpClient objeto como mostrado abaixo -

CloseableHttpClient httpClient = HttpClients.createDefault();

Etapa 2 - iniciar um bloco tentar finalmente

Inicie um bloco try-finally, escreva o código restante nos programas no bloco try e feche o objeto CloseableHttpClient no bloco finally.

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

Etapa 3 - Criar um objeto HttpGet

o HttpGet classe representa a solicitação HTTP GET que recupera as informações do servidor fornecido usando um URI.

Crie uma solicitação HTTP GET instanciando a classe HttpGet passando uma string que representa o URI.

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

Etapa 4 - Executar a solicitação Get

o execute() método do CloseableHttpClient objeto aceita um HttpUriRequest (interface) (ou seja, HttpGet, HttpPost, HttpPut, HttpHead etc.) e retorna um objeto de resposta.

Execute a solicitação usando o método fornecido -

HttpResponse httpResponse = httpclient.execute(httpGet);

Etapa 5 - Iniciar outra tentativa (aninhada) - finalmente

Inicie outro bloco try-finally (aninhado no anterior try-finally), escreva o código restante nos programas neste bloco try e feche o objeto HttpResponse no bloco finally.

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

Exemplo

Sempre que você cria / obtém objetos como solicitação, fluxo de resposta, etc., inicie um bloco try finally na próxima linha, escreva o código restante dentro do try e feche o respectivo objeto no bloco finally conforme demonstrado no programa a seguir -

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

Resultado

Ao executar o programa acima, a seguinte saída é gerada -

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

Você pode abortar a solicitação HTTP atual usando o abort() , ou seja, após invocar este método, em uma solicitação particular, sua execução será abortada.

Se este método for invocado após uma execução, as respostas dessa execução não serão afetadas e as execuções subsequentes serão abortadas.

Exemplo

Se você observar o exemplo a seguir, criamos uma solicitação HttpGet, imprimimos o formato da solicitação usado usando o getMethod().

Em seguida, realizamos outra execução com a mesma solicitação. Impresso na linha de estado usando o 1 st execução novamente. Finalmente, imprimiu a linha de status da segunda execução.

Como discutido, as respostas do 1 r execução (execução antes de abortar método) são impressos (incluindo a segunda linha de estado que está escrito após o método de interrupção) e, todas as execuções subsequentes do pedido actual, após o método de abortar estão falhou invocando um exceção.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

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)

Interceptadores são aqueles que ajudam a obstruir ou alterar solicitações ou respostas. Os interceptores de protocolo em geral agem sobre um cabeçalho específico ou um grupo de cabeçalhos relacionados. A biblioteca HttpClient fornece suporte para interceptores.

Solicitar interceptor

o HttpRequestInterceptorinterface representa os interceptores de solicitação. Essa interface contém um método conhecido como processo no qual você precisa escrever o pedaço de código para interceptar as solicitações.

No lado do cliente, este método verifica / processa os pedidos antes de enviá-los ao servidor e, no lado do servidor, este método é executado antes de avaliar o corpo do pedido.

Criando interceptor de solicitação

Você pode criar um interceptor de solicitação seguindo as etapas fornecidas abaixo.

Step 1 - Create an object of HttpRequestInterceptor

Crie um objeto da interface HttpRequestInterceptor implementando seu processo de método abstrato.

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

Step 2 - Instantiate CloseableHttpClient object

Crie um personalizado CloseableHttpClient objeto adicionando o interceptor criado acima a ele, conforme mostrado abaixo -

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

Usando este objeto, você pode realizar as execuções da solicitação normalmente.

Exemplo

O exemplo a seguir demonstra o uso de interceptores de solicitação. Neste exemplo, criamos um objeto de solicitação HTTP GET e adicionamos três cabeçalhos: sample-header, demoheader e test-header a ele.

No processor()método do interceptor, estamos verificando os cabeçalhos da solicitação enviada; se algum desses cabeçalhos forsample-header, estamos tentando removê-lo e exibir a lista de cabeçalhos dessa solicitação específica.

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

Resultado

Ao executar o programa acima, a seguinte saída é gerada -

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

Interceptador de resposta

o HttpResponseInterceptorinterface representa os interceptores de resposta. Esta interface contém um método conhecido comoprocess(). Neste método, você precisa escrever o pedaço de código para interceptar as respostas.

No lado do servidor, este método verifica / processa a resposta antes de enviá-la ao cliente, e no lado do cliente, este método é executado antes de avaliar o corpo da resposta.

Criando interceptor de resposta

Você pode criar um interceptor de resposta seguindo as etapas abaixo -

Step 1 - Create an object of HttpResponseInterceptor

Crie um objeto do HttpResponseInterceptor interface implementando seu método abstrato process.

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

Etapa 2: instanciar o objeto CloseableHttpClient

Crie um personalizado CloseableHttpClient objeto adicionando o interceptor criado acima a ele, como mostrado abaixo -

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

Usando este objeto, você pode realizar as execuções da solicitação normalmente.

Exemplo

O exemplo a seguir demonstra o uso de interceptores de resposta. Neste exemplo, adicionamos três cabeçalhos: sample-header, demo-header e test-header à resposta no processador.

Depois de executar a solicitação e obter a resposta, imprimimos os nomes de todos os cabeçalhos da resposta usando o getAllHeaders() método.

E na saída, você pode observar os nomes de três cabeçalhos na lista.

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

Resultado

Ao ser executado, o programa acima gera o seguinte resultado -

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

Usando HttpClient, você pode se conectar a um site que precisava de nome de usuário e senha. Este capítulo explica como executar uma solicitação de cliente em um site que pede nome de usuário e senha.

Etapa 1 - Criar um objeto CredentialsProvider

o CredentialsProviderA interface mantém uma coleção para manter as credenciais de login do usuário. Você pode criar seu objeto instanciando oBasicCredentialsProvider classe, a implementação padrão desta interface.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Etapa 2 - Definir as credenciais

Você pode definir as credenciais necessárias para o objeto CredentialsProvider usando o setCredentials() método.

Este método aceita dois objetos conforme fornecido abaixo -

  • AuthScope object - Escopo de autenticação especificando os detalhes como nome do host, número da porta e nome do esquema de autenticação.

  • Credentials object - Especificar as credenciais (nome de usuário, senha).

Defina as credenciais usando o setCredentials() método para host e proxy, conforme mostrado abaixo -

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

Etapa 3 - Criar um objeto HttpClientBuilder

Criar uma HttpClientBuilder usando o custom() método do HttpClients classe.

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

Etapa 4 - Definir credentialsPovider

Você pode definir o objeto credentialsPovider criado acima como um HttpClientBuilder usando o setDefaultCredentialsProvider() método.

Defina o objeto CredentialProvider criado na etapa anterior para o construtor do cliente, passando-o para o CredentialsProvider object() método conforme mostrado abaixo.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Etapa 5 - Construir o CloseableHttpClient

Construa o CloseableHttpClient objeto usando o build() método do HttpClientBuilder classe.

CloseableHttpClient httpclient = clientbuilder.build()

Etapa 6 - Crie um objeto HttpGet e execute-o

Crie um objeto HttpRequest instanciando a classe HttpGet. Execute esta solicitação usando oexecute() método.

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

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

Exemplo

A seguir está um programa de exemplo que demonstra a execução de uma solicitação HTTP em um site de destino que requer autenticação do usuário.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída.

GET
HTTP/1.1 200 OK
200

Um servidor proxy é um servidor intermediário entre o cliente e a Internet. Os servidores proxy oferecem as seguintes funcionalidades básicas -

  • Firewall e filtragem de dados de rede

  • Compartilhamento de conexão de rede

  • Cache de dados

Usando a biblioteca HttpClient, você pode enviar uma solicitação HTTP usando um proxy. Siga as etapas abaixo -

Etapa 1 - Criar um objeto HttpHost

Instancie o HttpHost classe do org.apache.http pacote passando um parâmetro de string que representa o nome do host proxy (a partir do qual você precisa que as solicitações sejam enviadas) para seu construtor.

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

Da mesma forma, crie outro objeto HttpHost para representar o host de destino para o qual as solicitações devem ser enviadas.

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

Etapa 2 - Criar um objeto HttpRoutePlanner

o HttpRoutePlannerinterface calcula uma rota para um host especificado. Crie um objeto desta interface instanciando oDefaultProxyRoutePlannerclasse, uma implementação desta interface. Como um parâmetro para seu construtor, passe o host proxy criado acima -

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

Etapa 3 - Definir o planejador de rotas para um construtor de cliente

Usando o custom() método do HttpClients classe, crie um HttpClientBuilder objeto e, para este objeto, defina o planejador de rotas criado acima, usando o setRoutePlanner() método.

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

clientBuilder = clientBuilder.setRoutePlanner(routePlanner);

Etapa 4 - Construir o objeto CloseableHttpClient

Construa o CloseableHttpClient objeto chamando o build() método.

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

Etapa 5 - Criar um objeto HttpGet

Crie uma solicitação HTTP GET instanciando o HttpGet classe.

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

Etapa 6 - Executar a solicitação

Uma das variantes do execute() método aceita um HttpHost e HttpRequestobjeta e executa a solicitação. Execute a solicitação usando este método -

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

Exemplo

O exemplo a seguir demonstra como enviar uma solicitação HTTP a um servidor via proxy. Neste exemplo, estamos enviando uma solicitação HTTP GET para google.com via localhost. Imprimimos os cabeçalhos da resposta e o corpo da resposta.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

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>

Neste capítulo, aprenderemos como criar um HttpRequest autenticado usando nome de usuário e senha e encapsulá-lo por meio de um proxy para um host de destino, usando um exemplo.

Etapa 1 - Criar um objeto CredentialsProvider

A interface CredentialsProvider mantém uma coleção para manter as credenciais de login do usuário. Você pode criar seu objeto instanciando a classe BasicCredentialsProvider, a implementação padrão desta interface.

CredentialsProvider credentialsPovider = new BasicCredentialsProvider();

Etapa 2 - definir as credenciais

Você pode definir as credenciais necessárias para o objeto CredentialsProvider usando o setCredentials()método. Este método aceita dois objetos -

  • AuthScope object - Escopo de autenticação especificando os detalhes como nome do host, número da porta e nome do esquema de autenticação.

  • Credentials object- Especificar as credenciais (nome de usuário, senha). Defina as credenciais usando osetCredentials() método para host e proxy, conforme mostrado abaixo.

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

Etapa 3 - Crie um objeto HttpClientBuilder

Criar uma HttpClientBuilder usando o custom() método do HttpClients classe como mostrado abaixo -

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

Etapa 4 - definir o CredentialsProvider

Você pode definir o objeto CredentialsProvider como um objeto HttpClientBuilder usando o setDefaultCredentialsProvider()método. Passe o criado anteriormenteCredentialsProvider objeto a este método.

clientbuilder = clientbuilder.setDefaultCredentialsProvider(credsProvider);

Etapa 5 - Construir o CloseableHttpClient

Construa o CloseableHttpClient objeto usando o build() método.

CloseableHttpClient httpclient = clientbuilder.build();

Etapa 6 - Criar o proxy e os hosts de destino

Crie os hosts de destino e proxy instanciando o HttpHost classe.

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

Etapa 7 - Definir o proxy e construir um objeto RequestConfig

Criar uma RequestConfig.Builder objeto usando o custom()método. Defina o objeto proxyHost criado anteriormente para oRequestConfig.Builder usando o setProxy()método. Finalmente, construa oRequestConfig objeto usando o build() método.

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

Etapa 8 - Criar um objeto de solicitação HttpGet e definir o objeto de configuração para ele.

Criar uma HttpGetobjeto instanciando a classe HttpGet. Defina o objeto de configuração criado na etapa anterior para este objeto usando osetConfig() método.

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

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

Etapa 9 - Executar a solicitação

Execute a solicitação passando o objeto HttpHost (destino) e a solicitação (HttpGet) como parâmetros para o execute() método.

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

Exemplo

O exemplo a seguir demonstra como executar uma solicitação HTTP por meio de um proxy usando nome de usuário e senha.

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

   }
}

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

HTTP/1.1 200 OK

Usando a biblioteca HttpClient, você pode enviar uma solicitação ou fazer o login em um formulário passando parâmetros.

Siga as etapas abaixo para fazer o login em um formulário.

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um objeto da classe CloseableHttpClient, que é a implementação básica da interface HttpClient. Usando este método, crie um objeto HttpClient -

CloseableHttpClient httpClient = HttpClients.createDefault();

Etapa 2 - Criar um objeto RequestBuilder

A classe RequestBuilderé usado para construir a solicitação adicionando parâmetros a ela. Se o tipo de solicitação for PUT ou POST, ele adiciona os parâmetros à solicitação como entidade codificada de URL

Crie um objeto RequestBuilder (do tipo POST) usando o método post ().

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

Etapa 3 - Definir Uri e parâmetros para o RequestBuilder.

Defina o URI e os parâmetros para o objeto RequestBuilder usando o setUri() e addParameter() métodos da classe RequestBuilder.

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

Etapa 4 - Construir o objeto HttpUriRequest

Depois de definir os parâmetros necessários, crie o HttpUriRequest objeto usando o build() método.

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

Etapa 5 - Executar a solicitação

O método execute do objeto CloseableHttpClient aceita um objeto HttpUriRequest (interface) (isto é, HttpGet, HttpPost, HttpPut, HttpHead etc.) e retorna um objeto de resposta.

Execute o HttpUriRequest criado nas etapas anteriores, passando-o para o execute() método.

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

Exemplo

O exemplo a seguir demonstra como fazer logon em um formulário enviando credenciais de logon. Aqui, enviamos dois parâmetros -username and password a um formulário e tentei imprimir a entidade da mensagem e o status da solicitação.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

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

Login de formulário com cookies

Se o seu formulário armazena cookies, em vez de criar um padrão CloseableHttpClient objeto.

Create a CookieStore object instanciando a classe BasicCookieStore.

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

Create a HttpClientBuilder usando o custom() método do HttpClients classe.

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

Set the cookie store to the client builder usando o método setDefaultCookieStore ().

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

Construa o CloseableHttpClient objeto usando o build() método.

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

Construa o HttpUriRequest objeto conforme especificado acima, passando execute a solicitação.

Se a página armazena cookies, os parâmetros que você passou serão adicionados ao armazenamento de cookies.

Você pode imprimir o conteúdo do CookieStore objeto onde você pode ver seus parâmetros (junto com os anteriores a página armazenada no caso).

Para imprimir os cookies, obtenha todos os cookies do CookieStore objeto usando o getCookies()método. Este método retorna umListobjeto. Usando o Iterator, imprima o conteúdo dos objetos da lista conforme mostrado abaixo -

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

Cookies são arquivos de texto armazenados no computador cliente e são mantidos para diversos fins de rastreamento de informações.

HttpClient fornece suporte para cookies que você pode criar e gerenciar cookies.

Criação de um cookie

Siga as etapas fornecidas abaixo para criar um cookie usando a biblioteca HttpClient.

Etapa 1 - Criar objeto Cookiestore

o CookieStoreinterface representa o armazenamento abstrato de objetos Cookie. Você pode criar um armazenamento de cookies instanciando oBasicCookieStore classe, uma implementação padrão desta interface.

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

Etapa 2 - Criar objeto ClientCookie

Além das funcionalidades de um cookie, ClientCookie pode obter os cookies originais no servidor. Você pode criar um cookie de cliente instanciando oBasicClientCookieclasse. Para o construtor desta classe, você precisa passar o par de valores-chave que deseja armazenar naquele cookie específico.

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

Etapa 3 - Definir valores para o cookie

Para um cookie de cliente, você pode definir / remover caminho, valor, versão, data de validade, domínio, comentário e atributo usando os respectivos métodos.

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

Etapa 4 - Adicionar cookie ao armazenamento de cookies

Você pode adicionar cookies ao armazenamento de cookies usando o addCookie() método do BasicCookieStore classe.

Adicione os cookies necessários ao Cookiestore.

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

Exemplo

O exemplo a seguir demonstra como criar cookies e adicioná-los a um armazenamento de cookies. Aqui, criamos um armazenamento de cookies, vários cookies, definindo os valores de domínio e caminho, e os adicionamos ao armazenamento 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);
   }
}

Recuperando um cookie

Você pode obter os cookies adicionados a uma loja de cookies usando getCookies() método do asicCookieStoreclasse. Este método retorna uma lista que contém todos os cookies no armazenamento de cookies.

Você pode imprimir o conteúdo de uma loja de cookies usando o Iterator conforme mostrado abaixo -

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

Exemplo

O exemplo a seguir demonstra como recuperar cookies de um armazenamento de cookies. Aqui, estamos adicionando vários cookies a um armazenamento de cookies e os recuperamos de volta.

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

Resultado

Ao ser executado, este programa gera a seguinte saída -

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

Um programa multithread contém duas ou mais partes que podem ser executadas simultaneamente e cada parte pode lidar com uma tarefa diferente ao mesmo tempo, fazendo um uso otimizado dos recursos disponíveis.

Você pode executar solicitações de vários threads escrevendo um programa HttpClient multithread.

Se você deseja executar várias solicitações de cliente de threads consecutivamente, você precisa criar um ClientConnectionPoolManager. Ele mantém um pool deHttpClientConnections e atende a várias solicitações de threads.

O gerenciador de conexões agrupa as conexões com base na rota. Se o gerenciador tiver conexões para uma rota específica, ele atenderá a novas solicitações nessas rotas alugando uma conexão existente do pool, em vez de criar uma nova.

Siga as etapas para executar solicitações de vários threads -

Etapa 1 - Criação do gerenciador de pool de conexão do cliente

Crie o Client Connection Pool Manager instanciando o PoolingHttpClientConnectionManager classe.

PoolingHttpClientConnectionManager connManager = new
   PoolingHttpClientConnectionManager();

Etapa 2 - Definir o número máximo de conexões

Defina o número máximo de conexões no pool usando o setMaxTotal() método.

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

Etapa 3 - Criar um objeto ClientBuilder

Criar uma ClientBuilder Objeto configurando o gerenciador de conexões usando o setConnectionManager() método como mostrado abaixo -

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

Etapa 4 - Criar os objetos de solicitação HttpGet

Instancie a classe HttpGet passando o URI desejado para seu construtor como um parâmetro.

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

Etapa 5 - Implementando o método de execução

Certifique-se de ter criado uma classe, feito um thread (estendendo a classe de thread ou implementando a interface Runnable) e implementado o método run.

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

Etapa 6 - Criar objetos Thread

Crie objetos de thread instanciando a classe Thread (ClientMultiThreaded) criada acima.

Passe um objeto HttpClient, respectivo objeto HttpGet e, um inteiro representando o ID para esses threads.

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

Passo 7 - Comece e junte os tópicos

Comece todos os tópicos usando start() método e junte-os usando o método join method().

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

Etapa 8 - Executar implementação do método

Dentro do método run, execute a solicitação, recupere a resposta e imprima os resultados.

Exemplo

O exemplo a seguir demonstra a execução de solicitações HTTP simultaneamente de vários threads. Neste exemplo, estamos tentando executar várias solicitações de vários threads e tentando imprimir o status e o número de bytes lidos por cada cliente.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

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

Usando Secure Socket Layer, você pode estabelecer uma conexão segura entre o cliente e o servidor. Ajuda a proteger informações confidenciais, como números de cartão de crédito, nomes de usuário, senhas, pins, etc.

Você pode tornar as conexões mais seguras criando seu próprio contexto SSL usando o HttpClient biblioteca.

Siga as etapas fornecidas abaixo para personalizar SSLContext usando a biblioteca HttpClient -

Etapa 1 - Criar objeto SSLContextBuilder

SSLContextBuilderé o construtor dos objetos SSLContext. Crie seu objeto usando ocustom() método do SSLContexts classe.

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

Etapa 2 - Carregar o armazenamento de chaves

No caminho Java_home_directory/jre/lib/security/, você pode localizar um arquivo denominado cacerts. Salve-o como seu arquivo de armazenamento de chaves (com extensão .jks). Carregue o arquivo keystore e sua senha (que échangeit por padrão) usando o loadTrustMaterial() método do SSLContextBuilder classe.

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

Etapa 3 - construir um objeto SSLContext

Um objeto SSLContext representa uma implementação de protocolo de soquete seguro. Construa um SSLContext usando obuild() método.

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

Etapa 4 - Criação do objeto SSLConnectionSocketFactory

SSLConnectionSocketFactoryé uma fábrica de soquetes em camadas para conexões TSL e SSL. Usando isso, você pode verificar o servidor Https usando uma lista de certificados confiáveis ​​e autenticar o servidor Https fornecido.

Você pode criar isso de várias maneiras. Dependendo da maneira como você cria umSSLConnectionSocketFactory objeto, você pode permitir todos os hosts, permitir apenas certificados autoassinados, permitir apenas protocolos específicos, etc.

To allow only particular protocols, crio SSLConnectionSocketFactory passando um objeto SSLContext, a matriz de string que representa os protocolos precisa ser suportada, a matriz de string que representa os naipes de cifra precisa ser suportada e um objeto HostnameVerifier para seu construtor.

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

To allow all hosts, crio SSLConnectionSocketFactory objeto passando um objeto SSLContext e um NoopHostnameVerifier objeto.

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

Etapa 5 - Criar um objeto HttpClientBuilder

Crie um objeto HttpClientBuilder usando o custom() método do HttpClients classe.

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

Etapa 6 - Definir o objeto SSLConnectionSocketFactory

Defina o objeto SSLConnectionSocketFactory para o HttpClientBuilder usando o setSSLSocketFactory() método.

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

Etapa 7 - Construir o objeto CloseableHttpClient

Construa o CloseableHttpClient objeto chamando o build() método.

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

Etapa 8 - Criar um objeto HttpGet

o HttpGet classe representa a solicitação HTTP GET que recupera as informações do servidor fornecido usando um URI.

Crie uma solicitação HTTP GET instanciando a classe HttpGet passando uma string que representa o URI.

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

Etapa 9 - Executar a solicitação

Execute a solicitação usando o execute() método.

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

Exemplo

O exemplo a seguir demonstra a personalização do 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);
      } 
   }
}

Resultado

Ao ser executado, o programa acima gera a seguinte saída.

HTTP/1.1 200 OK
1270

Usando HttpClient, podemos fazer upload de várias partes, ou seja, podemos fazer upload de objetos maiores em partes menores. Neste capítulo, demonstramos o upload de várias partes no cliente HTTP por meio do upload de um arquivo de texto simples.

Em geral, qualquer upload de várias partes contém três partes.

  • Iniciação do upload

  • Carregando as partes do objeto

  • Concluindo o upload de várias partes

Para o upload de várias partes usando HttpClient, precisamos seguir as etapas abaixo -

  • Crie um construtor multiparte.

  • Adicione as partes desejadas a ele.

  • Conclua a construção e obtenha uma HttpEntity multipart.

  • Solicitação de compilação definindo a entidade de várias partes acima.

  • Execute a solicitação.

A seguir estão as etapas para fazer upload de uma entidade multipartes usando a biblioteca HttpClient.

Etapa 1 - Criar um objeto HttpClient

o createDefault() método do HttpClients classe retorna um objeto da classe CloseableHttpClient, que é a implementação básica da interface HttpClient. Usando este método, crie um objeto HttpClient -

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

Etapa 2 - Criar um objeto FileBody

FileBodyclasse representa a parte binária do corpo apoiada por um arquivo. Instancie esta classe passando umFile objeto e um ContentType objeto que representa o tipo de conteúdo.

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

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

Etapa 3 - Crie um MultipartEntityBuilder

o MultipartEntityBuilder classe é usada para construir o multi-part HttpEntityobjeto. Crie seu objeto usando ocreate() método (da mesma classe).

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

Etapa 4 - definir o modo

UMA MultipartEntityBuildertem três modos: STRICT, RFC6532 e BROWSER_COMPATIBLE. Defina-o para o modo desejado usando osetMode() método.

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

Etapa 5 - Adicionar várias partes desejadas

Usando os métodos addTextBody(), addPart () e, addBinaryBody(), você pode adicionar texto simples, arquivos, fluxos e outros objetos a um MultipartBuilder. Adicione o conteúdo desejado usando esses métodos.

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

Etapa 6 - Construindo uma entidade única

Você pode construir todas essas partes em uma única entidade usando o build() método do MultipartEntityBuilderclasse. Usando este método, construa todas as peças em um únicoHttpEntity.

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

Etapa 7 - Criar um objeto RequestBuilder

A classe RequestBuilderé usado para construir a solicitação adicionando parâmetros a ela. Se a solicitação for do tipo PUT ou POST, ele adiciona os parâmetros à solicitação como entidade codificada de URL.

Crie um objeto RequestBuilder (do tipo POST) usando o post()método. E passe como parâmetro o Uri para o qual você deseja enviar a solicitação.

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

Etapa 8 - Defina o objeto de entidade para o RequestBuilder

Defina a entidade multiparte criada acima para o RequestBuilder usando o setEntity() método do RequestBuilder classe.

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

Etapa 9 - Construir o HttpUriRequest

Construir um HttpUriRequest objeto de solicitação usando o build() método do RequestBuilder classe.

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

Etapa 10 - Executar a solicitação

Usando o execute() método, execute a solicitação construída na etapa anterior (ignorando a solicitação como um parâmetro para este método).

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

Exemplo

O exemplo a seguir demonstra como enviar uma solicitação multiparte usando a biblioteca HttpClient. Neste exemplo, estamos tentando enviar uma solicitação multiparte apoiada por um arquivo.

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

Resultado

Ao ser executado, o programa acima gera a seguinte saída -

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