杰瑞科技汇

Java发起HTTP GET请求怎么写?

在 Java 中发送 HTTP GET 请求,有几种常见的方式,从传统的 HttpURLConnection 到现代的第三方库如 Apache HttpClientOkHttp,下面我将分别介绍这几种方法,并提供完整的代码示例。

Java发起HTTP GET请求怎么写?-图1
(图片来源网络,侵删)

使用 java.net.HttpURLConnection (JDK 内置,无需额外依赖)

这是最基础、最直接的方法,不需要引入任何第三方库,从 Java 1.1 开始就存在,但它的 API 相对繁琐。

代码示例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
    public static void main(String[] args) {
        String urlString = "https://jsonplaceholder.typicode.com/posts/1";
        try {
            // 1. 创建一个 URL 对象
            URL url = new URL(urlString);
            // 2. 打开一个 HttpURLConnection 连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 3. 设置请求方法为 GET
            connection.setRequestMethod("GET");
            // 4. 设置请求头 (可选)
            // connection.setRequestProperty("User-Agent", "Mozilla/5.0");
            // connection.setRequestProperty("Accept", "application/json");
            // 5. 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("Response Code: " + responseCode);
            // 6. 如果响应码是 200 (OK),则读取响应数据
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // 使用 try-with-resources 自动关闭流
                try (BufferedReader in = new BufferedReader(
                        new InputStreamReader(connection.getInputStream()))) {
                    String inputLine;
                    StringBuilder response = new StringBuilder();
                    while ((inputLine = in.readLine()) != null) {
                        response.append(inputLine);
                    }
                    // 7. 打印响应内容
                    System.out.println("Response Body: " + response.toString());
                }
            } else {
                System.out.println("GET request failed");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点

  • 优点: 无需依赖任何外部库,是 Java 标准库的一部分。
  • 缺点:
    • API 较为繁琐,需要手动管理连接和流。
    • 处理连接超时、读取超时等需要额外设置。
    • 对于复杂的 HTTP 请求(如异步、文件上传等)支持不佳。

使用 Apache HttpClient (功能强大,工业级标准)

Apache HttpClient 是一个功能非常全面的 HTTP 客户端库,被广泛应用于企业级应用中,它提供了更简洁、更强大的 API。

步骤

  1. 添加依赖 (如果你使用 Maven):
    <dependency>
        <groupId>org.apache.httpcomponents.client5</groupId>
        <artifactId>httpclient5</artifactId>
        <version>5.3.1</version> <!-- 请使用最新版本 -->
    </dependency>

    如果你使用 Gradle:

    implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1'

代码示例

import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.ParseException;
public class ApacheHttpClientExample {
    public static void main(String[] args) {
        String apiUrl = "https://jsonplaceholder.typicode.com/posts/1";
        // 1. 创建一个 HttpClient 实例
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 2. 创建一个 HttpGet 请求对象
            HttpGet request = new HttpGet(apiUrl);
            // 3. 可选:设置请求头
            // request.setHeader("Accept", "application/json");
            // 4. 执行请求,并获取响应
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                // 5. 获取响应状态码
                System.out.println("Response Code: " + response.getCode());
                // 6. 获取响应实体并转换为字符串
                if (response.getEntity() != null) {
                    String responseBody = EntityUtils.toString(response.getEntity());
                    System.out.println("Response Body: " + responseBody);
                }
            } catch (ParseException | IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点

  • 优点:
    • API 相对简洁,易于使用。
    • 功能非常强大,支持连接池、重试、Cookie、认证等高级特性。
    • 性能和稳定性都很好,是业界广泛使用的标准。
  • 缺点: 需要引入额外的第三方库。

使用 OkHttp (现代、高效,常用于 Android)

OkHttp 是一个由 Square 公司(现已独立)开发的开源项目,以其高效的连接池和简洁的 API 而闻名,是 Android 开发中首选的 HTTP 客户端。

Java发起HTTP GET请求怎么写?-图2
(图片来源网络,侵删)

步骤

  1. 添加依赖 (如果你使用 Maven):
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp</artifactId>
        <version>4.12.0</version> <!-- 请使用最新版本 -->
    </dependency>

    如果你使用 Gradle:

    implementation 'com.squareup.okhttp3:okhttp:4.12.0'

代码示例

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class OkHttpExample {
    public static void main(String[] args) {
        String url = "https://jsonplaceholder.typicode.com/posts/1";
        // 1. 创建一个 OkHttpClient 实例 (通常单例使用)
        OkHttpClient client = new OkHttpClient();
        // 2. 创建一个 Request 对象
        Request request = new Request.Builder()
                .url(url)
                // 可选:添加请求头
                // .header("User-Agent", "OkHttp Example")
                .build();
        // 3. 执行请求 (使用 try-with-resources 自动关闭响应体)
        try (Response response = client.newCall(request).execute()) {
            // 4. 判断响应是否成功 (isSuccessful() 会检查 2xx 状态码)
            if (response.isSuccessful()) {
                // 5. 获取响应体内容
                String responseBody = response.body().string();
                System.out.println("Response Code: " + response.code());
                System.out.println("Response Body: " + responseBody);
            } else {
                System.out.println("Request failed: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点

  • 优点:
    • API 极其简洁,易于上手。
    • 内置连接池,性能优异。
    • 对同步和异步请求都支持得很好。
    • 内置对 GZIP 的支持。
  • 缺点: 需要引入额外的第三方库。

总结与选择建议

特性 HttpURLConnection Apache HttpClient OkHttp
依赖 无需 需要 需要
易用性 较差 中等 极佳
功能 基础 非常强大 强大
性能 一般 优秀
适用场景 简单脚本、快速原型、无法引入第三方库的环境 企业级 Java 应用、需要复杂 HTTP 功能的服务端 Android 应用、现代 Java 服务端、对性能和易用性要求高的场景

如何选择?

  • 如果你只是想写一个非常简单的脚本,或者项目不允许引入任何外部库,那么使用 HttpURLConnection 是可行的。
  • 如果你正在构建一个复杂的企业级后端应用,需要处理连接池、认证、重试等,Apache HttpClient 是一个非常成熟和可靠的选择。
  • 如果你正在开发一个现代应用,尤其是 Android 应用,或者你追求最简洁的 API 和最好的性能OkHttp 是目前的首选,它极大地简化了网络请求的代码。
Java发起HTTP GET请求怎么写?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇