跳過到頁腳內容
JAVA 幫助

OkHttp Java:HTTP 請求簡化

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

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

OkHttp是什麼?

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

此外,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 的實例。
    • 使用特定的 URL 和輸出檔案路徑呼叫 generatePdfFromUrl 方法。

輸出

使用 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生成體驗!

Darrius Serrant
全棧軟件工程師 (WebOps)

Darrius Serrant 擁有邁阿密大學計算機科學學士學位,目前任職於 Iron Software 的全栈 WebOps 市場營銷工程師。從小就迷上編碼,他認為計算既神秘又可接近,是創意和解決問題的完美媒介。

在 Iron Software,Darrius 喜歡創造新事物,並簡化複雜概念以便於理解。作為我們的駐場開發者之一,他也自願教學生,分享他的專業知識給下一代。

對 Darrius 來說,工作令人滿意因為它被重視且有實際影響。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我