如何在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
相关产品推荐
相关产品推荐

