跳過到頁腳內容
JAVA 說明

OkHttp Java:簡化 HTTP 請求

在現代 Java 開發中,高效處理 HTTP 請求對於建立健全的應用程式至關重要,尤其對於那些依賴 Web 服務和 API 的應用程式而言更是如此。 OkHttp 是一款功能強大的 Java 和 Kotlin HTTP/2 用戶端,憑藉其高效能、易用性和高級功能,已成為熱門之選。

本文提供了 OkHttp 的全面指南,涵蓋其主要功能、安裝和常見用例。

OkHttp是什麼?

OkHttp 是一個功能強大的開源 Java 庫,用於處理 HTTP 請求,它提供了一套全面的功能,可以無縫整合到您的應用程式中。 憑藉其直覺的 API,建立新請求或執行簡單的 POST 請求就像配置帶有查詢參數和字串 URL 的新請求建構器一樣簡單。

此外,OkHttp 還有助於高效處理回應,提供對回應正文、回應標頭的訪問,甚至支援回應緩存,以優化網路流量並減少伺服器可用性問題。 無論進行同步調用還是非同步調用,OkHttp 的連接池都能確保最佳效能,即使處理多個 IP 位址也是如此。

OkHttp Java(開發者使用指南):圖 1

對於習慣使用 Apache HTTP 用戶端的開發人員來說,OkHttp 提供了一個更現代、更有效率的替代方案,具有更高的效能和靈活性。 它對非同步呼叫和回調的支援使其成為需要響應性和可擴展性的應用程式的首選。

借助 OkHttp,管理眾多 HTTP 用戶端和請求變得輕而易舉,使開發人員能夠專注於建立強大可靠的應用程序,而不會影響效能或功能。

主要特點

OkHttp 的主要功能包括:

*同步和非同步請求處理:* OkHttp 允許同步(阻塞)和非同步(非阻塞)操作。 連線池:重複使用 HTTP 連線以最大限度地減少客戶端連線問題並提高效能。 透明 GZIP 壓縮:減少 HTTP 回應的大小,節省頻寬並加快資料傳輸速度。 快取:**支援回應緩存,減少重複的網路請求。

  • HTTP/2 支援:透過允許在單一連線上重複使用多個請求和回應來提高效能。 *逾時和重試:提供連接和讀取逾時的精細控制,以及失敗請求的重試機制。

安裝 OkHttp

要開始在 Java 專案中使用 OkHttp,則需要在建置配置中包含其相依性。 如果您使用的是 Maven,請將以下依賴項新增至您的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>
XML

對於 Gradle,請將以下程式碼新增至build.gradle檔案:

implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14'

請務必在 Maven Central 或 GitHub 上查看最新版本。

基本用法

創建 OkHttpClient

OkHttpClient類別是執行 HTTP 請求的主要入口點。 建議建立一個OkHttpClient實例,並在整個應用程式中重複使用它,以利用連線池。

import okhttp3.OkHttpClient;

OkHttpClient client = new OkHttpClient();
import okhttp3.OkHttpClient;

OkHttpClient client = new OkHttpClient();
JAVA

發出 GET 請求

要發出簡單的 GET 請求,您需要建立一個Request物件並使用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
        }
    }
}
JAVA

OkHttp Java(開發者使用指南):圖 2

發送 POST 請求

對於 POST 請求,您需要包含請求正文和回傳回應。 OkHttp 提供了RequestBody類別來處理此問題。

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
        }
    }
}
JAVA

OkHttp Java(開發者使用指南):圖 3

非同步請求

非同步請求透過回調來處理,從而使您的應用程式在等待回應的同時保持回應。

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

進階功能

攔截者

攔截器是一項強大的功能,可讓您檢查、修改或重試請求和回應。 它們可用於日誌記錄、新增標頭或處理身份驗證。

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
        }
    }
}
JAVA

處理超時

OkHttp 提供了一個為 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
        }
    }
}
JAVA

快取回應

OkHttp 可以快取回應,以減少請求延遲並提高效能。 這需要設定快取目錄和大小。

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
        }
    }
}
JAVA

在 Java 中將 OkHttp 與 IronPDF 集成

結合 OkHttp 和 IronPDF 的功能,Java 開發人員可以從網路取得資料並將其轉換為 PDF。 OkHttp 是一個強大的 HTTP 用戶端,用於處理網路請求;而 IronPDF 是一個功能強大的庫,可以從各種來源產生 PDF 檔案。

IronPDF - 概述

IronPDF for Java 是一個綜合性的函式庫,旨在簡化 Java 應用程式中的 PDF 生成。 利用其直覺的 API,開發人員可以輕鬆地從各種資料來源(包括 HTML、圖像和文字)建立、操作和渲染 PDF 文件。

IronPDF 支援 PDF 加密、數位簽章和互動式表單填寫等進階功能,使開發人員能夠製作符合其特定要求的專業級 PDF。 其無縫整合和豐富的文件使其成為 Java 開發人員尋求透過強大的 PDF 生成功能來增強其應用程式的首選解決方案。

OkHttp Java(開發者使用指南):圖 4

設定依賴關係

首先,將必要的依賴項新增至pom.xml檔(對於 Maven)或build.gradle檔(對於 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>
XML

Gradle

implementation 'com.ironsoftware:ironpdf:2024.3.1'

整合 OkHttp 和 IronPDF

現在,讓我們將這兩個功能結合起來:使用 OkHttp 來取得 HTML 內容,使用 IronPDF 產生 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
    }
}
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
    }
}
JAVA

程式碼解釋

以上程式碼示範如何使用 Java 中的 OkHttp 和 IronPDF 庫從 URL 取得 HTML 內容並將其轉換為 PDF 檔案:

1.導入語句:導入必要的函式庫,包括用於產生 PDF 的 IronPDF 和用於 HTTP 請求的 OkHttp。

  1. OkHttpClient 初始化:建立OkHttpClient實例。

  2. fetchHtml方法:此方法從指定的 URL 取得 HTML 內容。

    • 使用提供的 URL 建置請求。 請求已執行,並已獲得回應。
    • 如果回應不成功,則會拋出IOException異常。
    • 回應體以字串形式傳回。
  3. generatePdfFromUrl方法:此方法從指定 URL 的 HTML 內容產生 PDF,並將其儲存到給定的檔案路徑。

    • 使用fetchHtml方法取得 HTML 內容。
    • HTML 內容使用IronPDF渲染為 PDF。
    • PDF文件已儲存到指定的文件路徑。
    • HTML 取得和 PDF 產生都包含了適當的錯誤處理機制。
  4. main方法:這是程式的入口點。

    • 建立OkHttpToPdf的一個實例。
    • generatePdfFromUrl方法透過指定的 URL 和輸出檔案路徑來呼叫。

輸出

使用 OkHttp 用戶端取得 URL 數據,然後使用 IronPDF 有效地將其渲染為 PDF,如下所示:

OkHttp Java(開發者使用指南):圖 5

有關 IronPDF 的更多詳細信息,請訪問此IronPDF 文件頁面。 請同時查看IronPDF 程式碼範例IronPDF API 參考頁面,以進一步了解如何使用 IronPDF。

結論

OkHttp 是一個功能強大且用途廣泛的 Java 和 Android HTTP 用戶端,它簡化了發出網路請求的過程。 OkHttp 用戶端支援同步和非同步操作、連線池、透明 GZIP 壓縮、快取和 HTTP/2,因此非常適合各種使用情境。 透過將 OkHttp 整合到 Java 應用程式中,您可以提高其效能、可靠性和效率。

透過將 OkHttp 與 IronPDF 集成,您可以有效率地從 Web 資源中取得 HTML 內容並將其轉換為 PDF 文件。 這種方法對於需要產生報告、保存網頁或將網頁內容轉換為離線文件的應用程式尤其有用。

使用 IronPDF 的免費試用版,釋放 Java 應用程式中 PDF 生成的潛力,將專業級 PDF 生成功能無縫整合到您的專案中。 立即下載,提升您的PDF生成體驗!

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。