You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HTTP GET请求体中接收并解析JSON数据(Java实现)

处理GET请求体中JSON数据的修改方案

首先明确:HTTP规范中GET请求通常不建议携带请求体,很多客户端、网关或服务器对GET请求体的支持并不完善,更推荐使用POST/PUT方法来传递JSON数据。如果确实需要基于现有GET逻辑处理请求体,可按以下步骤修改:

  • 步骤1:读取请求体内容
    通过exchange.getRequestBody()获取请求输入流,将其转换为字符串。需处理IO异常,同时指定统一字符编码(建议UTF-8)。

  • 步骤2:引入JSON解析库
    原生Java无内置JSON解析工具,需引入第三方库,以常用的Jackson为例。若使用Maven,在pom.xml中添加依赖:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.15.2</version> <!-- 替换为最新稳定版 -->
    </dependency>
    
  • 步骤3:解析JSON并处理业务逻辑
    定义与请求JSON结构匹配的实体类,用Jackson将请求体字符串解析为Java对象,再执行业务处理。

  • 步骤4:调整响应逻辑
    根据处理结果生成响应内容,设置响应头后返回给客户端。

修改后的完整代码

import com.sun.net.httpserver.HttpServer;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;

// 对应请求JSON结构的实体类(示例假设请求体为{"num1":10, "num2":20})
class RequestData {
    private int num1;
    private int num2;

    // Jackson要求必须提供无参构造方法
    public RequestData() {}

    // Getter和Setter方法
    public int getNum1() { return num1; }
    public void setNum1(int num1) { this.num1 = num1; }
    public int getNum2() { return num2; }
    public void setNum2(int num2) { this.num2 = num2; }
}

public class API {
    // 全局单例Jackson解析器
    private static final ObjectMapper objectMapper = new ObjectMapper();

    public static void main(String[] args) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/api", (exchange -> {
            if ("GET".equals(exchange.getRequestMethod())) {
                try {
                    // 读取请求体
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(exchange.getRequestBody(), StandardCharsets.UTF_8));
                    StringBuilder requestBody = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        requestBody.append(line);
                    }

                    // 解析JSON为Java对象
                    RequestData requestData = objectMapper.readValue(requestBody.toString(), RequestData.class);

                    // 业务处理示例:计算两数之和
                    int result = requestData.getNum1() + requestData.getNum2();
                    String responseText = "计算结果:" + result;

                    // 返回响应
                    exchange.getResponseHeaders().set("Content-Type", "text/plain; charset=UTF-8");
                    exchange.sendResponseHeaders(200, responseText.getBytes(StandardCharsets.UTF_8).length);
                    OutputStream output = exchange.getResponseBody();
                    output.write(responseText.getBytes(StandardCharsets.UTF_8));
                    output.flush();
                } catch (Exception e) {
                    // 异常处理:返回400表示请求参数错误
                    exchange.sendResponseHeaders(400, -1);
                }
            } else {
                // 非GET请求返回405方法不允许
                exchange.sendResponseHeaders(405, -1);
            }
            exchange.close();
        }));

        server.setExecutor(null);
        server.start();
    }
}

注意事项

  • 若使用Gson替代Jackson,只需替换依赖和解析代码,核心逻辑一致。
  • 必须处理JSON解析失败、IO异常等场景,避免服务器崩溃。
  • 生产环境优先遵循HTTP规范:用POST/PUT传递请求体,GET仅用于获取资源(参数放在URL查询串中)。

内容的提问来源于stack exchange,提问作者stanvooz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:54:19