杰瑞科技汇

Java HTTP POST请求怎么写?

使用 java.net.HttpURLConnection (JDK 内置)

这是最基础、最原始的方法,不需要任何额外的依赖,但它的 API 相对繁琐,不够现代化。

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

特点

  • 优点: 无需引入外部库,JDK 自带。
  • 缺点: 代码冗长,功能有限(如连接池、异步请求等需要自己实现),处理起来比较麻烦。

示例代码

这个例子演示了如何发送一个包含 JSON 数据的 POST 请求。

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionPostExample {
    public static void main(String[] args) {
        try {
            // 1. 创建 URL 对象
            String urlString = "https://jsonplaceholder.typicode.com/posts";
            URL url = new URL(urlString);
            // 2. 打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 3. 设置请求方法
            connection.setRequestMethod("POST");
            // 4. 设置请求头
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            // 5. 允许输出流,因为我们要发送数据
            connection.setDoOutput(true);
            // 6. 准备要发送的 JSON 数据
            String jsonInputString = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
            // 7. 使用 try-with-resources 确保 DataOutputStream 被正确关闭
            try (DataOutputStream out = new DataOutputStream(connection.getOutputStream())) {
                out.writeBytes(jsonInputString);
                out.flush();
            }
            // 8. 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("POST Response Code: " + responseCode);
            // 9. 读取响应内容
            // 使用 try-with-resources 确保 BufferedReader 被正确关闭
            try (BufferedReader in = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()))) {
                String inputLine;
                StringBuilder response = new StringBuilder();
                while ((inputLine = in.readLine()) != null) {
                    response.append(inputLine);
                }
                System.out.println("Response body: " + response.toString());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用 OkHttp (强烈推荐)

OkHttp 是目前最流行、功能最强大的 HTTP 客户端之一,它由 Square 公司开发,被广泛应用于 Android 和 Java 后端开发。

特点

  • 优点: API 简洁易用,支持同步/异步请求,自动管理连接池,支持 GZIP 压缩,内置拦截器机制。
  • 缺点: 需要引入第三方依赖。

添加依赖

如果你使用 Maven,在 pom.xml 中添加:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.12.0</version> <!-- 请使用最新版本 -->
</dependency>

如果你使用 Gradle,在 build.gradle 中添加:

Java HTTP POST请求怎么写?-图2
(图片来源网络,侵删)
implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 请使用最新版本

示例代码

同步请求

import okhttp3.*;
import java.io.IOException;
public class OkHttpPostExample {
    public static void main(String[] args) {
        // 1. 创建 OkHttpClient 实例 (推荐单例模式)
        OkHttpClient client = new OkHttpClient();
        // 2. 准备请求体
        String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(json, JSON);
        // 3. 构建请求
        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts")
                .post(body)
                .build();
        // 4. 发送请求并获取响应 (同步方式会阻塞线程)
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 获取响应体
            String responseBody = response.body().string();
            System.out.println("Response Code: " + response.code());
            System.out.println("Response Body: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

异步请求

异步请求不会阻塞调用线程,非常适合在 GUI 应用或高并发后端服务中使用。

import okhttp3.*;
import java.io.IOException;
public class OkHttpAsyncPostExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();
        String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(json, JSON);
        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts")
                .post(body)
                .build();
        // 异步调用
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 请求失败
                e.printStackTrace();
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                // 请求成功
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }
                String responseBody = response.body().string();
                System.out.println("Response Code: " + response.code());
                System.out.println("Response Body: " + responseBody);
            }
        });
        // 因为 main 线程不会等待异步回调,所以这里让它休眠一会儿,以便看到结果
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

使用 Apache HttpClient (经典选择)

Apache HttpClient 是一个功能非常成熟的 HTTP 客户端库,历史悠久,功能强大,在 OkHttp 流行之前,它是 Java 生态中最主流的选择。

特点

  • 优点: 功能极其丰富,稳定可靠,对 HTTP 协议的支持非常完善。
  • 缺点: API 相对 OkHttp 来说略显笨重,依赖包较大。

添加依赖

Maven (pom.xml):

<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.3.1</version> <!-- 请使用最新版本 -->
</dependency>

Gradle (build.gradle):

implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1' // 请使用最新版本

示例代码

import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.entity.StringEntity;
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.ContentType;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.io.entity.StringEntity;
import java.io.IOException;
public class ApacheHttpClientPostExample {
    public static void main(String[] args) {
        // 1. 创建 HttpClient 实例
        CloseableHttpClient httpClient = HttpClients.createDefault();
        // 2. 创建 HttpPost 请求
        HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/posts");
        // 3. 设置请求头
        httpPost.setHeader("Accept", "application/json");
        httpPost.setHeader("Content-Type", "application/json");
        try {
            // 4. 设置请求体
            String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";
            StringEntity entity = new StringEntity(json);
            httpPost.setEntity(entity);
            // 5. 执行请求
            CloseableHttpResponse response = httpClient.execute(httpPost);
            try {
                // 6. 获取响应状态码
                System.out.println("Response Code: " + response.getCode());
                // 7. 获取响应体
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.println("Response Body: " + responseBody);
            } finally {
                // 8. 确保响应体被完全消费并关闭
                EntityUtils.consume(response.getEntity());
                response.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 9. 关闭 HttpClient
            try {
                httpClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

总结与对比

特性 HttpURLConnection OkHttp Apache HttpClient
依赖 无需 需要引入 okhttp 需要引入 httpclient5
API 易用性 一般
功能 基础 非常丰富 非常丰富
性能 一般 优秀 (连接池等) 优秀
现代特性 支持 HTTP/1.1 支持 HTTP/2, SPDY 支持 HTTP/1.1, HTTP/2
推荐场景 简单脚本、无法引入第三方库的项目 新项目、推荐首选,尤其适合 Android 和现代服务 遗留系统、需要高级 HTTP 协议特性的企业级应用

如何选择?

  • 新手或新项目: 直接选择 OkHttp,它的 API 设计友好,性能卓越,社区活跃,文档齐全,是目前的不二之选。
  • 无法引入外部库: 只能使用 HttpURLConnection,但要做好处理繁琐 API 的准备。
  • 企业级/遗留系统: 如果项目已经在使用 Apache HttpClient 或者有非常复杂的 HTTP 协议需求,可以继续使用它,它非常稳定可靠,但对于新项目,OkHttp 通常是更好的选择。
分享:
扫描分享到社交APP
上一篇
下一篇