OkHttp Java: Requisições HTTP Simplificadas
No desenvolvimento Java moderno, o tratamento eficiente de requisições HTTP é crucial para a construção de aplicações robustas, especialmente aquelas que dependem de serviços web e APIs. O OkHttp, um poderoso cliente HTTP e HTTP/2 for Java e Kotlin, tornou-se uma escolha popular devido ao seu desempenho, facilidade de uso e recursos avançados.
Este artigo fornece um guia completo sobre o OkHttp, abordando seus principais recursos, instalação e casos de uso comuns.
O que é OkHttp?
OkHttp é uma biblioteca Java versátil e de código aberto para lidar com solicitações HTTP, oferecendo um conjunto abrangente de recursos para integração perfeita em seus aplicativos. Com sua API intuitiva, criar uma nova solicitação ou executar uma simples solicitação POST é tão fácil quanto configurar um novo construtor de solicitações com parâmetros de consulta e uma URL em formato de string.
Além disso, o OkHttp facilita o processamento eficiente de respostas, fornecendo acesso ao corpo da resposta, aos cabeçalhos da resposta e até mesmo oferecendo suporte ao cache de respostas para otimizar o tráfego de rede e reduzir problemas de disponibilidade do servidor. Quer você esteja fazendo chamadas síncronas ou assíncronas, o agrupamento de conexões do OkHttp garante um desempenho ideal, mesmo ao lidar com vários endereços IP.

Para desenvolvedores acostumados a usar o Apache HTTP Client, o OkHttp oferece uma alternativa mais moderna e eficiente, com desempenho e flexibilidade aprimorados. O suporte para chamadas assíncronas e callbacks faz dele a escolha preferida para aplicações que exigem capacidade de resposta e escalabilidade.
Com o OkHttp, gerenciar vários clientes e solicitações HTTP torna-se fácil, permitindo que os desenvolvedores se concentrem na criação de aplicativos robustos e confiáveis sem comprometer o desempenho ou a funcionalidade.
Principais características
As principais funcionalidades do OkHttp incluem:
- Tratamento de requisições síncronas e assíncronas: o OkHttp permite operações síncronas (bloqueantes) e assíncronas (não bloqueantes).
- Agrupamento de conexões: Reutiliza conexões HTTP para minimizar problemas de conectividade do cliente e melhorar o desempenho.
- Compressão GZIP transparente: Reduz o tamanho das respostas HTTP, economizando largura de banda e acelerando a transferência de dados.
- Cache: Suporta o armazenamento em cache de respostas, reduzindo a necessidade de solicitações de rede repetidas.
- Suporte a HTTP/2: Melhora o desempenho permitindo que várias solicitações e respostas sejam multiplexadas em uma única conexão.
- Tempos limite e novas tentativas: Oferece controle preciso sobre os tempos limite de conexão e leitura, bem como mecanismos de nova tentativa para solicitações com falha.
Instalando o OkHttp
Para começar a usar o OkHttp em seu projeto Java, você precisa incluir sua dependência na configuração de compilação. Se você estiver usando o Maven, adicione a seguinte dependência ao seu arquivo pom.xml:
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>5.0.0-alpha.14</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>5.0.0-alpha.14</version>
</dependency>
Para o Gradle, adicione esta linha ao seu arquivo build.gradle:
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14'
Certifique-se de verificar a versão mais recente no Maven Central ou no GitHub.
Uso básico
Criando um OkHttpClient
A classe OkHttpClient é o principal ponto de entrada para a execução de requisições HTTP. Recomenda-se criar uma única instância de OkHttpClient e reutilizá-la em toda a sua aplicação para aproveitar o pool de conexões.
import okhttp3.OkHttpClient;
OkHttpClient client = new OkHttpClient();
import okhttp3.OkHttpClient;
OkHttpClient client = new OkHttpClient();
Fazendo solicitações GET
Para fazer uma solicitação GET simples, você precisa criar um objeto Request e executá-lo usando o OkHttpClient.
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}

Fazendo solicitações POST
Para uma requisição POST, você precisa incluir um corpo de requisição e retornar uma resposta. OkHttp fornece a classe RequestBody para lidar com isso.
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
// Define the JSON media type
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// JSON data to be sent
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
// Create request body with JSON data
RequestBody body = RequestBody.create(json, JSON);
// Build the POST request
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
// Define the JSON media type
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// JSON data to be sent
String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
// Create request body with JSON data
RequestBody body = RequestBody.create(json, JSON);
// Build the POST request
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts")
.post(body)
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}

Requisições assíncronas
As requisições assíncronas são tratadas usando callbacks, permitindo que seu aplicativo permaneça responsivo enquanto aguarda a resposta.
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Enqueue the request to be executed asynchronously
client.newCall(request).enqueue(new Callback() {
// Handle failure of the request
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace(); // Handle exceptions
}
// Handle successful response
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
}
});
}
}
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Enqueue the request to be executed asynchronously
client.newCall(request).enqueue(new Callback() {
// Handle failure of the request
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace(); // Handle exceptions
}
// Handle successful response
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
}
});
}
}
Recursos avançados
Interceptores
Os interceptores são um recurso poderoso que permite inspecionar, modificar ou repetir solicitações e respostas. Podem ser usados para registro de logs, adição de cabeçalhos ou para lidar com autenticação.
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
// Add an interceptor for modifying requests
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
// Modify the request to add the authorization header
Request request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer your_token_here")
.build();
return chain.proceed(request);
}
})
.build();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
// Add an interceptor for modifying requests
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
// Modify the request to add the authorization header
Request request = chain.request().newBuilder()
.addHeader("Authorization", "Bearer your_token_here")
.build();
return chain.proceed(request);
}
})
.build();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
Lidando com timeouts
O OkHttp fornece métodos para definir tempos limite para diferentes estágios da própria requisição HTTP.
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class OkHttpExample {
public static void main(String[] args) {
// Configure timeouts for connections, writes, and reads
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class OkHttpExample {
public static void main(String[] args) {
// Configure timeouts for connections, writes, and reads
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
Armazenando respostas em cache
O OkHttp pode armazenar em cache as respostas para reduzir a latência das solicitações e melhorar o desempenho. Isso requer a configuração de um diretório de cache e a definição de seu tamanho.
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.File;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
// Define the cache directory and size
File cacheDirectory = new File("cacheDirectory");
Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024); // 10 MB cache
// Build OkHttpClient with caching capability
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.build();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
import okhttp3.Cache;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.File;
import java.io.IOException;
public class OkHttpExample {
public static void main(String[] args) {
// Define the cache directory and size
File cacheDirectory = new File("cacheDirectory");
Cache cache = new Cache(cacheDirectory, 10 * 1024 * 1024); // 10 MB cache
// Build OkHttpClient with caching capability
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.build();
// Create a request specifying the URL
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
// Execute the request and handle the response
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) { // Check if the response was successful
System.out.println(response.body().string()); // Print the response body
} else {
System.err.println("Request failed: " + response.code()); // Print error code
}
} catch (IOException e) {
e.printStackTrace(); // Handle exceptions
}
}
}
Integrando OkHttp com IronPDF em Java
A combinação das funcionalidades do OkHttp e do IronPDF permite que desenvolvedores Java busquem dados da web e os convertam em PDFs. OkHttp é um cliente HTTP robusto para lidar com solicitações de rede, enquanto IronPDF é uma biblioteca poderosa para gerar PDFs a partir de diversas fontes.
IronPDF - Visão geral
IronPDF for Java é uma biblioteca abrangente projetada para simplificar a geração de PDFs em aplicações Java. Aproveitando sua API intuitiva, os desenvolvedores podem criar, manipular e renderizar documentos PDF sem esforço a partir de diversas fontes de dados, incluindo HTML, imagens e texto.
Com suporte para recursos avançados como criptografia de PDF, assinaturas digitais e preenchimento interativo de formulários, o IronPDF permite que os desenvolvedores produzam PDFs de nível profissional, personalizados para atender às suas necessidades específicas. Sua integração perfeita e documentação abrangente fazem dele uma solução ideal para desenvolvedores Java que buscam aprimorar seus aplicativos com recursos robustos de geração de PDFs.

Configurando dependências
Primeiro, adicione as dependências necessárias ao seu arquivo pom.xml (para Maven) ou build.gradle (para Gradle).
Maven
<dependency>
<groupId>com.ironsoftware</groupId>
<artifactId>ironpdf</artifactId>
<version>2024.3.1</version>
</dependency>
<dependency>
<groupId>com.ironsoftware</groupId>
<artifactId>ironpdf</artifactId>
<version>2024.3.1</version>
</dependency>
Gradle
implementation 'com.ironsoftware:ironpdf:2024.3.1'
Integrando OkHttp e IronPDF
Agora, vamos combinar as duas funcionalidades: buscar conteúdo HTML com OkHttp e gerar um PDF com IronPDF.
import com.ironsoftware.ironpdf.PdfDocument;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.nio.file.Paths;
public class OkHttpToPdf {
private final OkHttpClient client = new OkHttpClient(); // Initialize the OkHttpClient
// Method to fetch HTML content from a given URL
public String fetchHtml(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
// Execute the request and return the response body as a string
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().string();
}
}
// Method to generate a PDF from a URL
public void generatePdfFromUrl(String url, String outputFilePath) {
try {
String htmlContent = fetchHtml(url); // Fetch the HTML content
PdfDocument pdf = PdfDocument.renderHtmlAsPdf(htmlContent); // Render HTML as PDF
pdf.saveAs(Paths.get(outputFilePath)); // Save the PDF to the specified path
System.out.println("PDF generated successfully at " + outputFilePath);
} catch (IOException e) {
System.err.println("Failed to fetch HTML content: " + e.getMessage());
} catch (Exception e) {
System.err.println("Failed to generate PDF: " + e.getMessage());
}
}
// Main method to demonstrate fetching HTML and generating a PDF
public static void main(String[] args) {
OkHttpToPdf converter = new OkHttpToPdf(); // Create an instance of OkHttpToPdf
converter.generatePdfFromUrl("https://ironpdf.com/java", "website.pdf"); // Fetch HTML and generate PDF
}
}
import com.ironsoftware.ironpdf.PdfDocument;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.nio.file.Paths;
public class OkHttpToPdf {
private final OkHttpClient client = new OkHttpClient(); // Initialize the OkHttpClient
// Method to fetch HTML content from a given URL
public String fetchHtml(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
// Execute the request and return the response body as a string
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().string();
}
}
// Method to generate a PDF from a URL
public void generatePdfFromUrl(String url, String outputFilePath) {
try {
String htmlContent = fetchHtml(url); // Fetch the HTML content
PdfDocument pdf = PdfDocument.renderHtmlAsPdf(htmlContent); // Render HTML as PDF
pdf.saveAs(Paths.get(outputFilePath)); // Save the PDF to the specified path
System.out.println("PDF generated successfully at " + outputFilePath);
} catch (IOException e) {
System.err.println("Failed to fetch HTML content: " + e.getMessage());
} catch (Exception e) {
System.err.println("Failed to generate PDF: " + e.getMessage());
}
}
// Main method to demonstrate fetching HTML and generating a PDF
public static void main(String[] args) {
OkHttpToPdf converter = new OkHttpToPdf(); // Create an instance of OkHttpToPdf
converter.generatePdfFromUrl("https://ironpdf.com/java", "website.pdf"); // Fetch HTML and generate PDF
}
}
Explicação do código
O código acima demonstra como obter conteúdo HTML de uma URL e convertê-lo em um arquivo PDF usando as bibliotecas OkHttp e IronPDF em Java:
-
Instruções de importação: As bibliotecas necessárias são importadas, incluindo o IronPDF para geração de PDFs e o OkHttp para requisições HTTP.
-
Inicialização do OkHttpClient: Uma instância de
OkHttpClienté criada. -
fetchHtmlMétodo: Este método busca conteúdo HTML a partir de um URL especificado.- Uma solicitação é criada com a URL fornecida.
- A solicitação é executada e a resposta é obtida.
- Se a resposta não for bem-sucedida, um
IOExceptionserá lançado. - O corpo da resposta é retornado como uma string.
-
generatePdfFromUrlMétodo: Este método gera um PDF a partir do conteúdo HTML de um URL especificado e o salva em um caminho de arquivo fornecido.- O conteúdo HTML é obtido usando o método
fetchHtml. - O conteúdo HTML é renderizado como um PDF usando
IronPDF. O PDF foi salvo no caminho de arquivo especificado. - O tratamento de erros adequado está incluído tanto para a obtenção de HTML quanto para a geração de PDF.
- O conteúdo HTML é obtido usando o método
-
mainMétodo: Este é o ponto de entrada do programa.- Uma instância de
OkHttpToPdffoi criada. - O método
generatePdfFromUrlé chamado com um URL específico e um caminho de arquivo de saída.
- Uma instância de
Saída
Os dados da URL são obtidos usando o cliente OkHttp e, em seguida, renderizados de forma eficiente usando o IronPDF para convertê-los em PDF, conforme mostrado abaixo:

Para obter informações mais detalhadas sobre o IronPDF, visite esta página de documentação do IronPDF . Consulte também os exemplos de código do IronPDF e a página de referência da API do IronPDF para obter mais informações sobre como utilizar o IronPDF.
Conclusão
OkHttp é um cliente HTTP versátil e poderoso for Java e Android que simplifica o processo de fazer requisições de rede. Com suporte para operações síncronas e assíncronas, agrupamento de conexões, compressão GZIP transparente, cache e HTTP/2, o cliente OkHttp é adequado para uma ampla gama de casos de uso. Ao integrar o OkHttp em suas aplicações Java, você pode melhorar o desempenho, a confiabilidade e a eficiência delas.
Ao integrar o OkHttp com o IronPDF, você pode obter conteúdo HTML de fontes da web de forma eficiente e convertê-lo em documentos PDF. Essa abordagem é especialmente útil para aplicativos que precisam gerar relatórios, salvar páginas da web ou converter conteúdo da web em documentos offline.
Desbloqueie o potencial da geração de PDFs em seus aplicativos Java com a avaliação gratuita do IronPDF, permitindo a integração perfeita da geração de PDFs de nível profissional em seus projetos. Baixe agora e aprimore sua experiência na geração de PDFs!




