杰瑞科技汇

Java如何用HTTP发送JSON请求?

创建一个简单的测试 API

为了演示,我们使用一个公共的测试 API:JSONPlaceholder,我们将向其发送一个 POST 请求,创建一个新的 "todo" 项目。

Java如何用HTTP发送JSON请求?-图1
(图片来源网络,侵删)

请求信息:

  • URL: https://jsonplaceholder.typicode.com/todos
  • 方法: POST
  • 请求头: Content-Type: application/json
  • 请求体 (JSON):
    {
      "title": "学习 Java HTTP 请求",
      "body": "这是一个关于如何发送 JSON 请求的教程",
      "userId": 1
    }

使用 HttpURLConnection (JDK 内置)

这是最基础的方法,不需要引入任何第三方库,但它的代码相对繁琐,且功能较弱。

代码示例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpURLConnectionExample {
    public static void main(String[] args) {
        // 1. 目标 URL
        String urlString = "https://jsonplaceholder.typicode.com/todos";
        String jsonInputString = "{\n" +
                "  \"title\": \"学习 Java HTTP 请求\",\n" +
                "  \"body\": \"这是一个关于如何发送 JSON 请求的教程\",\n" +
                "  \"userId\": 1\n" +
                "}";
        try {
            // 2. 创建 URL 对象
            URL url = new URL(urlString);
            // 3. 打开连接
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            // 4. 设置请求方法
            connection.setRequestMethod("POST");
            // 5. 设置请求头
            connection.setRequestProperty("Content-Type", "application/json; utf-8");
            connection.setRequestProperty("Accept", "application/json");
            // 允许输出
            connection.setDoOutput(true);
            // 6. 发送请求体
            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }
            // 7. 获取响应码
            int responseCode = connection.getResponseCode();
            System.out.println("响应码: " + responseCode);
            // 8. 读取响应
            StringBuilder response = new StringBuilder();
            // 根据响应码决定使用哪个输入流
            try (BufferedReader br = new BufferedReader(
                    new InputStreamReader(responseCode < 400 ? connection.getInputStream() : connection.getErrorStream(), "utf-8"))) {
                String responseLine;
                while ((responseLine = br.readLine()) != null) {
                    response.append(responseLine.trim());
                }
            }
            // 9. 输出结果
            System.out.println("响应内容: " + response.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点:

  • 优点: 无需依赖,JDK 自带。
  • 缺点: 代码冗长,处理复杂请求(如文件上传、连接池)非常麻烦,不支持异步请求。

使用 OkHttp (推荐)

OkHttp 是目前最流行的 HTTP 客户端之一,由 Square 公司开发,它功能强大、性能优异、API 设计简洁,支持同步和异步请求。

Java如何用HTTP发送JSON请求?-图2
(图片来源网络,侵删)

添加依赖

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

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

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

implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 请使用最新版本

代码示例

OkHttp 通常与 OkioMoshi/Gson 等库结合使用来处理 JSON,这里我们直接使用字符串。

import okhttp3.*;
import java.io.IOException;
public class OkHttpExample {
    public static void main(String[] args) {
        // 1. 创建 OkHttp 客户端
        OkHttpClient client = new OkHttpClient();
        // 2. 准备 JSON 请求体
        String json = "{\n" +
                "  \"title\": \"学习 OkHttp\",\n" +
                "  \"body\": \"OkHttp 是一个优秀的 HTTP 客户端\",\n" +
                "  \"userId\": 1\n" +
                "}";
        // 3. 创建 RequestBody,指定内容类型为 JSON
        RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8"));
        // 4. 构建请求
        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/todos")
                .post(body) // 设置 POST 请求体
                .addHeader("Accept", "application/json")
                .build();
        // 5. 发送请求并获取响应
        try (Response response = client.newCall(request).execute()) {
            // 6. 检查响应是否成功
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            }
            // 7. 获取响应体
            String responseBody = response.body().string();
            System.out.println("响应码: " + response.code());
            System.out.println("响应内容: " + responseBody);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点:

Java如何用HTTP发送JSON请求?-图3
(图片来源网络,侵删)
  • 优点: API 简洁易用,性能高(支持连接池、GZIP),支持同步/异步,功能全面(WebSocket、拦截器等)。
  • 缺点: 需要引入第三方库。

使用 Apache HttpClient (经典选择)

Apache HttpClient 是一个功能非常成熟和强大的 HTTP 组件库,在企业级应用中广泛使用。

添加依赖

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

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

注意:httpclient5 依赖 httpcore5

代码示例

import org.apache.hc.client5.http.classic.methods.HttpPost;
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 ApacheHttpClientExample {
    public static void main(String[] args) {
        // 1. 创建 HttpClient 实例
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 2. 创建 HttpPost 请求
            HttpPost httpPost = new HttpPost("https://jsonplaceholder.typicode.com/todos");
            // 3. 准备 JSON 请求体
            String json = "{\n" +
                    "  \"title\": \"学习 Apache HttpClient\",\n" +
                    "  \"body\": \"这是一个经典的 HTTP 客户端库\",\n" +
                    "  \"userId\": 1\n" +
                    "}";
            // 4. 设置请求体和内容类型
            StringEntity entity = new StringEntity(json, ContentType.APPLICATION_JSON);
            httpPost.setEntity(entity);
            // 5. 执行请求
            System.out.println("发送请求...");
            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                // 6. 获取响应状态码
                System.out.println("响应码: " + response.getCode());
                // 7. 获取响应内容
                String responseBody = EntityUtils.toString(response.getEntity());
                System.out.println("响应内容: " + responseBody);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

优缺点:

  • 优点: 功能极其强大和稳定,配置灵活,在企业级项目中经过长期验证。
  • 缺点: API 相对 OkHttp 稍显复杂,依赖包较大。

使用 RestTemplate (Spring 生态)

如果你已经在使用 Spring 或 Spring Boot 框架,RestTemplate 是一个非常方便的选择。

添加依赖 (Spring Boot 项目通常已包含)

代码示例

import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
public class RestTemplateExample {
    public static void main(String[] args) {
        // 1. 创建 RestTemplate 实例
        RestTemplate restTemplate = new RestTemplate();
        // 2. 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        // 3. 准备请求体
        String json = "{\n" +
                "  \"title\": \"学习 RestTemplate\",\n" +
                "  \"body\": \"Spring 生态中的 HTTP 客户端\",\n" +
                "  \"userId\": 1\n" +
                "}";
        // 4. 构建 HttpEntity 对象
        HttpEntity<String> entity = new HttpEntity<>(json, headers);
        // 5. 设置 URL
        String url = "https://jsonplaceholder.typicode.com/todos";
        // 6. 发送 POST 请求并映射返回结果到 Todo 类 (可选)
        // 为了简单,这里直接获取 String
        ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
        // 7. 输出结果
        System.out.println("响应码: " + response.getStatusCode());
        System.out.println("响应头: " + response.getHeaders());
        System.out.println("响应内容: " + response.getBody());
    }
    // 可以定义一个与 JSON 结构匹配的类
    static class Todo {
        private int id;
        private int userId;
        private String title;
        private String body;
        private boolean completed;
        // Getters and Setters...
    }
}

优缺点:

  • 优点: 与 Spring 框架无缝集成,支持直接将 JSON 映射到 Java 对象,API 高度封装。
  • 缺点: 严重依赖 Spring 生态,不适用于非 Spring 项目,在 Spring Boot 3.2+ 中已被 WebClient 标记为不推荐使用。

总结与如何选择

方法 优点 缺点 适用场景
HttpURLConnection 无需依赖,JDK 自带 代码繁琐,功能弱 简单的脚本、小型项目、无法引入第三方库的环境
OkHttp API 简洁,性能高,功能全面 需要引入第三方库 大多数 Java 应用,尤其是 Android 开发和现代微服务
Apache HttpClient 功能强大、稳定、成熟 API 略显复杂,依赖较大 企业级应用、需要高度定制和稳定性的传统项目
RestTemplate 与 Spring 集成好,支持对象映射 依赖 Spring,已被 WebClient 取代 正在使用 Spring 框架的老项目

推荐选择:

  • 新项目:优先选择 OkHttp,它在易用性、性能和社区活跃度上都表现出色。
  • Spring Boot 项目:如果你使用的是较新版本的 Spring Boot,推荐学习并使用 WebClient (异步、非阻塞);如果是在旧项目中,RestTemplate 仍然可用。
  • 企业级/传统项目Apache HttpClient 是一个非常可靠和成熟的选择。
  • 简单/无依赖需求:使用 HttpURLConnection,但通常不推荐用于复杂的业务逻辑。
分享:
扫描分享到社交APP
上一篇
下一篇