Formas de chamar interfaces HTTP de terceiros em Java

Formas de chamar interfaces HTTP de terceiros em Java

  • Através da classe Java.net.HttpURLConnection (JDK nativo);
  • Através do HttpClient do Apache Commons;
  • Através do CloseableHttpClient do Apache;
  • Através do Spring Boot RestTemplate;
  • Através do OkHttp.

Usando Java.net.HttpURLConnection (JDK nativo)

Abordagem mais primitiva, onde as requisições GET e POST são unificadas em um único método.

Processo de implementação:

GET:
1. Criar conexão remota
2. Definir método de conexão (get, post, put...)
3. Definir timeout de conexão
4. Definir timeout de leitura de resposta
5. Enviar requisição
6. Obter dados da resposta
7. Fechar conexão

POST:
1. Criar conexão remota
2. Definir método de conexão (get, post, put...)
3. Definir timeout de conexão
4. Definir timeout de leitura de resposta
5. Ao enviar dados para servidor remoto, setar setDoOutput como true
6. Ao ler dados do servidor remoto, setar setDoInput como true (opcional)
7. Definir formato dos parâmetros de entrada (setRequestProperty)
8. Definir informações de autenticação: Authorization (setRequestProperty)
9. Definir parâmetros
10. Enviar requisição
11. Obter dados da resposta
12. Fechar conexão

Arquivo pom.xml com dependências:

<!-- Dependências vazias neste exemplo -->

Usando HttpClient do Apache Commons

Passos para requisições GET ou POST com HttpClient:

1. Criar objeto HttpClient e configurar parâmetros;
2. Criar objeto GetMethod ou PostMethod e configurar parâmetros;
3. Executar o método criado através do objeto HttpClient;
4. Tratar o código de status da resposta;
5. Se resposta normal, processar conteúdo HTTP;
6. Liberar conexão.

Arquivo pom.xml com dependências:

<!--HttpClient-->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>

Usando CloseableHttpClient do Apache

CloseableHttpClient é uma atualização do HttpClient anterior, inclui configuração de token no cabeçalho (autenticação) e usa fastjson para converter strings de requisição/resposta para JSON. Os métodos anteriores também podem configurar token e JSON, mas a explicação será dada aqui.

Arquivo pom.xml com dependências:

<!--CloseableHttpClient-->
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.2</version>
</dependency>
<!--fastjson-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.32</version>
</dependency>

Usando Spring Boot RestTemplate

RestTemplate é uma abstração das três abordagens anteriores, simplificando a escrita. Os métodos disponíveis para chamar interfaces de terceiros incluem:

delete() // Executa DELETE HTTP em uma URL específica
exchange() // Executa método HTTP em uma URL, retorna ResponseEntity com objeto mapeado da resposta
execute() // Executa método HTTP em uma URL, retorna objeto mapeado da resposta
getForEntity() // Envia GET HTTP, retorna ResponseEntity com objeto mapeado
getForObject() // Envia GET HTTP, retorna objeto mapeado diretamente
postForEntity() // Envia POST para URL, retorna ResponseEntity com objeto mapeado
postForObject() // Envia POST para URL, retorna objeto mapeado
headForHeaders() // Envia HEAD HTTP, retorna cabeçalhos HTTP da URL
optionsForAllow() // Envia OPTIONS HTTP, retorna cabeçalho Allow da URL
postForLocation() // Envia POST para URL, retorna URL do novo recurso criado
put() // Envia PUT para URL específica

Arquivo pom.xml com dependências:

<!--serviço web-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Usando OkHttp

OkHttp é bastante popular atualmente, especialmente no desenvolvimento mobile.

Arquivo pom.xml com dependências:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.10.0</version>
</dependency>

HttpClient

O uso do HttpClient para enviar requisições segue os passos:

  1. Criar objeto CloseableHttpClient (síncrono) ou CloseableHttpAsyncClient (assíncrono);
  2. Criar objeto de requisição HTTP;
  3. Executar o método execute() – no caso assíncrono, chamar start() antes.

Criando conexão

CloseableHttpClient httpClient = HttpClientBuilder.create().build();

RequestConfig requestConfig = RequestConfig.custom()
        .setSocketTimeout(60 * 1000)
        .setConnectTimeout(60 * 1000).build();
String api = "/user/v1/getUserInfo";
String url = String.format("%s%s", "localhost:18080", api);
HttpGet httpGet = new HttpGet(url);
httpGet.setConfig(requestConfig); // define timeout

OkHttp

O uso do OkHttp para enviar requisições segue os passos:

  1. Criar objeto OkHttpClient;
  2. Criar objeto Request;
  3. Encapsular Request em um Call;
  4. Executar requisição síncrona (execute()) ou assíncrona (enqueue()).

Criando conexão

OkHttpClient client = new OkHttpClient();

// Ou com configuração personalizada
OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(60, TimeUnit.SECONDS)
        .readTimeout(60, TimeUnit.SECONDS)
        .build();

Comparação

  • OkHttp usa o padrão builder para criar objetos, tornando o código mais conciso;
  • Em relação a dependências, se HttpClient precisar de requisições assíncronas ou upload de arquivos, são necessárias dependências adicionais;
  • No modo singleton, HttpClient é ligeiramente mais rápido (em milissegundos), com diferença de desempenho pequena;
  • No modo não singleton, OkHttp tem melhor desempenho, pois HttpClient demora mais para criar conexões – na maioria dos casos, esses recursos são configurados como singleton;
  • OkHttp e HttpClient têm desempneho e usabilidade equivalentes; a escolha depende do cenário real.

Tags: java HTTP httpclient OkHttp resttemplate

Publicado em 7-3 03:33