杰瑞科技汇

java post json 请求

使用 HttpClient (Java 11+)

从 Java 11 开始,java.net.http.HttpClient 被引入为标准库的一部分,这是目前官方推荐、功能最强大且最现代的方式,它支持 HTTP/1.1 和 HTTP/2,并且是异步友好的。

java post json 请求-图1
(图片来源网络,侵删)

核心步骤

  1. 创建 HttpClient 实例: 可以配置连接超时、代理等。
  2. 构建请求体: 将你的 Java 对象转换为 JSON 字符串,这通常需要借助第三方库,如 JacksonGson
  3. 创建 HttpRequest: 设置请求方法 (POST)、URL、请求头 (Content-Type: application/json) 和请求体。
  4. 发送请求并获取响应: 使用 HttpClient.send() 发送请求,并处理返回的 HttpResponse

完整代码示例

你需要一个 JSON 处理库,这里以 Jackson 为例,它是目前最流行、性能最好的 Java JSON 库。

Maven 依赖 (pom.xml):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新版本 -->
</dependency>

Java 代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class HttpClientPostExample {
    // Jackson 的核心对象,用于序列化和反序列化
    private static final ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) {
        // 1. 目标 API 的 URL
        String url = "https://jsonplaceholder.typicode.com/posts";
        // 2. 准备要发送的 JSON 数据对应的 Java 对象
        PostRequestData postData = new PostRequestData();
        postData.setTitle("foo");
        postData.setBody("bar");
        postData.setUserId(1);
        try {
            // 3. 将 Java 对象转换为 JSON 字符串
            String jsonBody = objectMapper.writeValueAsString(postData);
            System.out.println("Request JSON Body: " + jsonBody);
            // 4. 创建 HttpClient
            HttpClient client = HttpClient.newBuilder()
                    .version(HttpClient.Version.HTTP_2)
                    .connectTimeout(Duration.ofSeconds(10))
                    .build();
            // 5. 创建 HttpRequest
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(URI.create(url))
                    .header("Content-Type", "application/json") // 设置 Content-Type 头
                    .POST(HttpRequest.BodyPublishers.ofString(jsonBody)) // 设置请求体
                    .build();
            // 6. 发送请求并获取响应
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            // 7. 打印结果
            System.out.println("Response Status Code: " + response.statusCode());
            System.out.println("Response Body: " + response.body());
        } catch (JsonProcessingException e) {
            System.err.println("Error converting object to JSON: " + e.getMessage());
        } catch (IOException | InterruptedException e) {
            System.err.println("Error sending HTTP request: " + e.getMessage());
            // 如果是线程中断,需要恢复中断状态
            if (e instanceof InterruptedException) {
                Thread.currentThread().interrupt();
            }
        }
    }
    // 定义一个与 JSON 结构匹配的 Java 类 (POJO)
    static class PostRequestData {
        private String title;
        private String body;
        private int userId;
        // Getters and Setters (必须要有,Jackson 需要它们)
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
        public String getBody() { return body; }
        public void setBody(String body) { this.body = body; }
        public int getUserId() { return userId; }
        public void setUserId(int userId) { this.userId = userId; }
    }
}

使用第三方库 OkHttp (非常流行)

OkHttp 是一个高效的 HTTP 客户端,在 Android 开发和 Java 后端服务中都非常流行,它易于使用,并且有强大的拦截器机制。

java post json 请求-图2
(图片来源网络,侵删)

核心步骤

  1. 添加 OkHttp 和 Jackson 依赖
  2. 创建 OkHttpClient 实例
  3. 构建请求体: 使用 RequestBody.create()MediaType 来创建 JSON 请求体。
  4. 创建 Request: 设置 URL、方法、头和请求体。
  5. 执行请求: 使用 client.newCall(request).execute() 同步发送请求。

完整代码示例

Maven 依赖 (pom.xml):

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.11.0</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

Java 代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import okhttp3.*;
import java.io.IOException;
public class OkHttpPostExample {
    private static final OkHttpClient client = new OkHttpClient();
    private static final ObjectMapper objectMapper = new ObjectMapper();
    private static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
    public static void main(String[] args) {
        String url = "https://jsonplaceholder.typicode.com/posts";
        PostRequestData postData = new PostRequestData();
        postData.setTitle("okhttp-title");
        postData.setBody("okhttp-body");
        postData.setUserId(1);
        try {
            String jsonBody = objectMapper.writeValueAsString(postData);
            System.out.println("Request JSON Body: " + jsonBody);
            RequestBody body = RequestBody.create(jsonBody, JSON);
            Request request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
            try (Response response = client.newCall(request).execute()) {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }
                // Response.body() is a one-time stream. Do not use it more than once.
                String responseBody = response.body().string();
                System.out.println("Response Status Code: " + response.code());
                System.out.println("Response Body: " + responseBody);
            }
        } catch (JsonProcessingException e) {
            System.err.println("Error converting object to JSON: " + e.getMessage());
        } catch (IOException e) {
            System.err.println("Error sending HTTP request: " + e.getMessage());
        }
    }
    // 与 HttpClient 示例中相同的 PostRequestData 类
    static class PostRequestData {
        private String title;
        private String body;
        private int userId;
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
        public String getBody() { return body; }
        public void setBody(String body) { this.body = body; }
        public int getUserId() { return userId; }
        public void setUserId(int userId) { this.userId = userId; }
    }
}

使用 Apache HttpClient (经典选择)

Apache HttpClient 是一个非常成熟和强大的库,在 Java 8 之前是事实上的标准,它功能非常全面,但配置相对复杂一些。

核心步骤

  1. 添加 Apache HttpClient 和 Jackson 依赖
  2. 创建 CloseableHttpClient 实例
  3. 构建请求体: 使用 StringEntity 包装 JSON 字符串。
  4. 创建 HttpPost: 设置 URL 和请求体。
  5. 执行请求: 使用 httpClient.execute() 发送请求。

完整代码示例

Maven 依赖 (pom.xml):

java post json 请求-图3
(图片来源网络,侵删)
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
    <version>5.2.1</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents.core5</groupId>
    <artifactId>httpcore5</artifactId>
    <version>5.2</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

Java 代码:

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.hc.client5.http.classic.methods.HttpPost;
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.StringEntity;
import org.apache.hc.core5.http.util.EntityUtils;
import java.io.IOException;
public class ApacheHttpClientPostExample {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    public static void main(String[] args) {
        String url = "https://jsonplaceholder.typicode.com/posts";
        PostRequestData postData = new PostRequestData();
        postData.setTitle("apache-title");
        postData.setBody("apache-body");
        postData.setUserId(1);
        // 使用 try-with-resources 确保 HttpClient 和 HttpResponse 被正确关闭
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            String jsonBody;
            try {
                jsonBody = objectMapper.writeValueAsString(postData);
                System.out.println("Request JSON Body: " + jsonBody);
            } catch (JsonProcessingException e) {
                System.err.println("Error converting object to JSON: " + e.getMessage());
                return;
            }
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("Content-Type", "application/json");
            httpPost.setEntity(new StringEntity(jsonBody, ContentType.APPLICATION_JSON));
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                // 获取响应体并转换为字符串
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.println("Response Status Code: " + response.getCode());
                System.out.println("Response Body: " + responseBody);
            }
        } catch (IOException e) {
            System.err.println("Error sending HTTP request: " + e.getMessage());
        }
    }
    // 与前两个示例中相同的 PostRequestData 类
    static class PostRequestData {
        private String title;
        private String body;
        private int userId;
        public String getTitle() { return title; }
        public void setTitle(String title) { this.title = title; }
        public String getBody() { return body; }
        public void setBody(String body) { this.body = body; }
        public int getUserId() { return userId; }
        public void setUserId(int userId) { this.userId = userId; }
    }
}

不使用第三方库 (Java 8+)

如果你不想引入任何外部依赖,可以使用 Java 8 引入的 java.net.http.HttpClient,但手动构建 JSON 字符串,这种方式不推荐用于复杂的生产环境,因为手动拼接 JSON 容易出错且难以维护。

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ManualJsonPostExample {
    public static void main(String[] args) {
        String url = "https://jsonplaceholder.typicode.com/posts";
        // 手动构建 JSON 字符串,注意转义双引号
        String jsonBody = "{\"title\":\"manual-title\",\"body\":\"manual-body\",\"userId\":1}";
        System.out.println("Request JSON Body: " + jsonBody);
        HttpClient client = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .connectTimeout(Duration.ofSeconds(10))
                .build();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .header("Content-Type", "application/json")
                .POST(HttpRequest.BodyPublishers.ofString(jsonBody))
                .build();
        try {
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
            System.out.println("Response Status Code: " + response.statusCode());
            System.out.println("Response Body: " + response.body());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结与对比

特性 Java 11+ HttpClient OkHttp Apache HttpClient 手动构建
依赖 无需额外依赖 (JDK自带) okhttp httpclient5 无需额外依赖
易用性 简单 非常简单 较复杂 极其简单,但不推荐
功能 强大,支持 HTTP/2, 异步 强大,支持拦截器、WebSocket 功能最全面 仅支持基本功能
性能 优秀 非常高 优秀 N/A
推荐场景 新项目,Java 11+ 环境 任何 Java 项目,尤其是 Android 需要高级企业级功能时 快速测试、极简脚本

最终建议:

  • 如果你使用 Java 11 或更高版本,首选 Java 11+ HttpClient,它是标准,性能好,且未来可期。
  • 如果你使用 Java 8 或更早版本,或者需要 Android 支持OkHttp 是最佳选择,它社区活跃,文档完善,使用体验极佳。
  • 如果你需要非常复杂的 HTTP 功能(如高级重试策略、连接池精细控制等),可以考虑 Apache HttpClient
  • 尽量避免手动拼接 JSON,除非是在一个非常简单的脚本中临时使用。
分享:
扫描分享到社交APP
上一篇
下一篇