HTTP: Três Maneiras de Implementar Requisições HTTP em Java

Atualmente, existem dois métodos principais em Java para implementar requisições HTTP:

Um deles utiliza o framework de código aberto HttpClient. Esta biblioteca oferece uma boa abstração do protocolo HTTP, atendendo à maioria das necessidades de desenvolvimento. A versão 3.1 do HttpClient, localizada em org.apache.commons.httpclient, é uma ferramenta para manipular URLs remotas, embora não receba mais atualizações. Muitos projetos ainda utilizam código baseado nesta versão. Por outro lado, a versão 4.5, encontrada em org.apache.http.client, é a mais recente e recomendada para novos projetos.

O outro método utiliza HttpURLConnection, uma classe padrão da plataforma Java, representando uma implementação nativa mais básica.

Primeiro método: HttpURLConnection nativo do Java

package com.requisicoes.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class RequisitorHttp {
    public static String executarGet(String enderecoHttp) {
        conexaoHttp conexao = null;
        fluxoEntrada entrada = null;
        leitorBufferizado leitor = null;
        String resultado = null;
        
        try {
            // Criar objeto de URL remota
            URL url = new URL(enderecoHttp);
            // Abrir conexão e converter para HttpURLConnection
            conexao = (HttpURLConnection) url.openConnection();
            // Definir método de requisição como GET
            conexao.setRequestMethod("GET");
            // Configurar timeout de conexão: 15000ms
            conexao.setConnectTimeout(15000);
            // Configurar timeout de leitura: 60000ms
            conexao.setReadTimeout(60000);
            // Enviar requisição
            conexao.connect();
            // Obter fluxo de entrada através da conexão
            if (conexao.getResponseCode() == 200) {
                entrada = conexao.getInputStream();
                // Empacotar fluxo de entrada com codificação UTF-8
                leitor = new BufferedReader(new InputStreamReader(entrada, "UTF-8"));
                // Armazenar dados
                StringBuilder acumulador = new StringBuilder();
                String linha = null;
                while ((linha = leitor.readLine()) != null) {
                    acumulador.append(linha);
                    acumulador.append("\r\n");
                }
                resultado = acumulador.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // Fechar recursos
            if (null != leitor) {
                try {
                    leitor.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != entrada) {
                try {
                    entrada.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            conexao.disconnect();
        }

        return resultado;
    }

    public static String executarPost(String enderecoHttp, String parametros) {
        conexaoHttp conexao = null;
        fluxoEntrada entrada = null;
        fluxoSaida saida = null;
        leitorBufferizado leitor = null;
        String resultado = null;
        
        try {
            URL url = new URL(enderecoHttp);
            // Abrir conexão com URL remota
            conexao = (HttpURLConnection) url.openConnection();
            // Definir método de requisição como POST
            conexao.setRequestMethod("POST");
            // Configurar timeout de conexão: 15000ms
            conexao.setConnectTimeout(15000);
            // Configurar timeout de leitura: 60000ms
            conexao.setReadTimeout(60000);

            // Habilitar envio de dados (padrão: false)
            conexao.setDoOutput(true);
            // Habilitar recebimento de dados (padrão: true)
            conexao.setDoInput(true);
            // Definir formato dos parâmetros enviados
            conexao.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            // Configurar informações de autenticação
            conexao.setRequestProperty("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
            // Obter fluxo de saída através da conexão
            saida = conexao.getOutputStream();
            // Escrever parâmetros via fluxo de saída
            saida.write(parametros.getBytes());
            // Obter fluxo de entrada para resposta remota
            if (conexao.getResponseCode() == 200) {
                entrada = conexao.getInputStream();
                // Empacotar fluxo de entrada com codificação UTF-8
                leitor = new BufferedReader(new InputStreamReader(entrada, "UTF-8"));

                StringBuilder acumulador = new StringBuilder();
                String linha = null;
                // Ler dados linha por linha
                while ((linha = leitor.readLine()) != null) {
                    acumulador.append(linha);
                    acumulador.append("\r\n");
                }
                resultado = acumulador.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // Fechar recursos
            if (null != leitor) {
                try {
                    leitor.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != saida) {
                try {
                    saida.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != entrada) {
                try {
                    entrada.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // Desconectar da URL remota
            conexao.disconnect();
        }
        return resultado;
    }
}

Segundo método: Apache HttpClient 3.1 (obsoleto)

package com.requisicoes.http;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;

public class RequisitorHttpClient3 {

    public static String executarGet(String url) {
        // Fluxo de entrada
        InputStream entrada = null;
        BufferedReader leitor = null;
        String resultado = null;
        // Criar instância do httpClient
        HttpClient httpClient = new HttpClient();
        // Configurar timeout de conexão: 15000ms
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000);
        // Criar instância do método Get
        GetMethod metodoGet = new GetMethod(url);
        // Configurar timeout da requisição GET: 60000ms
        metodoGet.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000);
        // Configurar mecanismo de retry (padrão: 3 tentativas)
        metodoGet.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, true));
        try {
            // Executar método Get
            int statusResposta = httpClient.executeMethod(metodoGet);
            // Verificar código de status
            if (statusResposta != HttpStatus.SC_OK) {
                // Se o status não for OK, falhou
                System.err.println("Método falhou: " + metodoGet.getStatusLine());
            } else {
                // Obter fluxo de resposta
                entrada = metodoGet.getResponseBodyAsStream();
                // Empacotar fluxo de entrada
                leitor = new BufferedReader(new InputStreamReader(entrada, "UTF-8"));

                StringBuilder acumulador = new StringBuilder();
                // Ler dados do fluxo empacotado
                String linha = null;
                while ((linha = leitor.readLine()) != null) {
                    acumulador.append(linha).append("\r\n");
                }

                resultado = acumulador.toString();
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // Fechar recursos
            if (null != leitor) {
                try {
                    leitor.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != entrada) {
                try {
                    entrada.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // Liberar conexão
            metodoGet.releaseConnection();
        }
        return resultado;
    }

    public static String executarPost(String url, Map<String, Object> mapaParametros) {
        // Obter fluxo de entrada
        InputStream entrada = null;
        BufferedReader leitor = null;
        String resultado = null;
        // Criar instância do httpClient
        HttpClient httpClient = new HttpClient();
        // Configurar timeout de conexão: 15000ms
        httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000);
        // Criar instância do método POST
        PostMethod metodoPost = new PostMethod(url);
        // Configurar timeout da requisição POST
        metodoPost.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000);

        NameValuePair[] paresNomeValor = null;
        // Verificar se o mapa de parâmetros está vazio
        if (null != mapaParametros && mapaParametros.size() > 0) {
            // Criar array de pares nome-valor
            paresNomeValor = new NameValuePair[mapaParametros.size()];
            // Iterar sobre o mapa de parâmetros
            Set<Entry<String, Object>> conjuntoEntradas = mapaParametros.entrySet();
            Iterator<Entry<String, Object>> iterador = conjuntoEntradas.iterator();

            int indice = 0;
            while (iterador.hasNext()) {
                Entry<String, Object> entradaMapa = iterador.next();
                // Criar pares nome-valor e adicionar ao array
                try {
                    paresNomeValor[indice] = new NameValuePair(entradaMapa.getKey(),
                            new String(entradaMapa.getValue().toString().getBytes("UTF-8"), "UTF-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                indice++;
            }
        }
        // Verificar se o array de pares não é nulo
        if (null != paresNomeValor && paresNomeValor.length > 0) {
            // Adicionar parâmetros ao corpo da requisição
            metodoPost.setRequestBody(paresNomeValor);
        }
        // Executar método POST
        try {
            int statusResposta = httpClient.executeMethod(metodoPost);
            // Verificar se foi bem-sucedido
            if (statusResposta != HttpStatus.SC_OK) {
                System.err.println("Método falhou: " + metodoPost.getStatusLine());
            }
            // Obter dados da resposta remota
            entrada = metodoPost.getResponseBodyAsStream();
            // Empacotar fluxo de entrada
            leitor = new BufferedReader(new InputStreamReader(entrada, "UTF-8"));

            StringBuilder acumulador = new StringBuilder();
            String linha = null;
            while ((linha = leitor.readLine()) != null) {
                acumulador.append(linha).append("\r\n");
            }

            resultado = acumulador.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // Fechar recursos
            if (null != leitor) {
                try {
                    leitor.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != entrada) {
                try {
                    entrada.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // Liberar conexão
            metodoPost.releaseConnection();
        }
        return resultado;
    }
}

Terceiro método: Apache HttpClient 4.5

package com.requisicoes.http;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public class RequisitorHttpClient4 {

    public static String executarGet(String url) {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse resposta = null;
        String resultado = "";
        try {
            // Criar instância httpClient com configuração padrão
            httpClient = HttpClients.createDefault();
            // Criar instância de conexão HTTP GET
            HttpGet httpGet = new HttpGet(url);
            // Configurar cabeçalhos de requisição, incluindo autenticação
            httpGet.setHeader("Authorization", "Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0");
            // Configurar parâmetros da requisição
            RequestConfig configuracaoRequisicao = RequestConfig.custom()
                    .setConnectTimeout(35000) // Timeout de conexão
                    .setConnectionRequestTimeout(35000) // Timeout de requisição
                    .setSocketTimeout(60000) // Timeout de leitura
                    .build();
            // Aplicar configuração ao método GET
            httpGet.setConfig(configuracaoRequisicao);
            // Executar requisição GET e obter resposta
            resposta = httpClient.execute(httpGet);
            // Obter dados da resposta
            HttpEntity entidade = resposta.getEntity();
            // Converter resultado para string
            resultado = EntityUtils.toString(entidade);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // Fechar recursos
            if (null != resposta) {
                try {
                    resposta.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return resultado;
    }

    public static String executarPost(String url, Map<String, Object> mapaParametros) {
        CloseableHttpClient httpClient = null;
        CloseableHttpResponse respostaHttp = null;
        String resultado = "";
        // Criar instância httpClient
        httpClient = HttpClients.createDefault();
        // Criar instância de conexão HTTP POST
        HttpPost httpPost = new HttpPost(url);
        // Configurar parâmetros da requisição
        RequestConfig configuracaoRequisicao = RequestConfig.custom()
                .setConnectTimeout(35000) // Timeout de conexão
                .setConnectionRequestTimeout(35000) // Timeout de requisição
                .setSocketTimeout(60000) // Timeout de leitura
                .build();
        // Aplicar configuração ao método POST
        httpPost.setConfig(configuracaoRequisicao);
        // Configurar cabeçalhos
        httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
        // Empacotar parâmetros da requisição POST
        if (null != mapaParametros && mapaParametros.size() > 0) {
            List<NameValuePair> paresNomeValor = new ArrayList<NameValuePair>();
            // Iterar sobre o mapa de parâmetros
            Set<Entry<String, Object>> conjuntoEntradas = mapaParametros.entrySet();
            Iterator<Entry<String, Object>> iterador = conjuntoEntradas.iterator();
            while (iterador.hasNext()) {
                Entry<String, Object> entradaMapa = iterador.next();
                paresNomeValor.add(new BasicNameValuePair(entradaMapa.getKey(), entradaMapa.getValue().toString()));
            }

            // Adicionar parâmetros empacotados à requisição POST
            try {
                httpPost.setEntity(new UrlEncodedFormEntity(paresNomeValor, "UTF-8"));
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        try {
            // Executar requisição POST e obter resposta
            respostaHttp = httpClient.execute(httpPost);
            // Obter conteúdo da resposta
            HttpEntity entidade = respostaHttp.getEntity();
            resultado = EntityUtils.toString(entidade);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // Fechar recursos
            if (null != respostaHttp) {
                try {
                    respostaHttp.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != httpClient) {
                try {
                    httpClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return resultado;
    }
}

Em algumas situações, ao usar requisições POST, os parâmetros podem estar em formato JSON ou outros tipos de dados. Nesses casos, precisamos modificar as configurações de cabeçalho e parâmetros.

**Para o HttpClient 4.5, por exemplo, podemos alterar as seguintes configurações:****httpPost.setEntity(new StringEntity("seu JSON aqui"));**httpPost.addHeader("Content-Type", "application/json")

Tags: java HTTP HttpURLConnection httpclient

Publicado em 6-18 22:03