HttpServletRequest 如何读取JSON请求体

适用场景:用于 Java Web / SpringBoot 项目中,读取客户端(前端、接口调用方)发送的 POST / PUT 请求体数据(JSON、纯文本、XML 等)。

1. 核心代码

1.1. 原生一行读取代码

java 复制代码
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.stream.Collectors;

// 读取请求体全部内容,拼接为完整字符串
String postData = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

1.2. 封装工具方法(推荐生产使用)

java 复制代码
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.Reader;
import java.util.stream.Collectors;

/**
 * 工具类:读取 HTTP 请求体
 * @param request 请求对象
 * @return 请求体字符串
 */
public static String getRequestBody(HttpServletRequest request) throws IOException {
    // 设置UTF-8编码,防止中文乱码(必须在getReader前执行)
    request.setCharacterEncoding("UTF-8");
    try (Reader reader = request.getReader()) {
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
}

2. 支持的数据格式

支持

  • JSON 字符串(最常用,如 {"username":"admin","pwd":"123"}

  • 纯文本

  • XML 格式

  • 自定义文本报文

不支持

  • application/x\-www\-form\-urlencoded(表单默认格式,用 getParameter

  • multipart/form\-data(文件上传,用文件解析工具)

  • 图片、文件等二进制数据

3. 使用规则

3.1. 绝对不能混用的方法

以下方法一旦调用,getReader() 就会读不到数据!

  • request.getParameter("xxx")

  • request.getParameterMap()

  • request.getParameterNames()

  • request.getParameterValues()

原理:这些方法会一次性读完请求体并关闭流,getReader() 无法重复读取。

3.2. 只能读取一次

request.getReader() 全局只能调用一次,第二次调用会报错 / 读空。

3.3. 必须处理异常

getReader() 会抛出 IOException,必须捕获或抛出。

4. 正确使用示例

4.1.读取 JSON 请求体

java 复制代码
@PostMapping("/login")
public void login(HttpServletRequest request) throws IOException {
    // 读取JSON请求体 {"username":"admin","pwd":"123"}
    String jsonStr = getJsonRequestBody(request);
    System.out.println("接收JSON报文:" + jsonStr);
}

4.2.普通 Servlet 中使用

java 复制代码
@WebServlet("/api/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 读取请求体
        String body = getRequestBody(request);
        System.out.println("接收到数据:" + body);
        
        response.getWriter().write("success");
    }
}
相关推荐
血小溅4 分钟前
Spring AI 对 Skill/MCP 的支持全景整理
后端
晓杰'15 分钟前
从0到1实现Balatro游戏后端(8):Skip Blind与Tag奖励机制设计与实现
后端·websocket·typescript·项目实战·nestjs·状态管理·游戏服务器
叫我:松哥19 分钟前
基于Flask框架的校园二手书籍交易平台,注重校园场景的特殊需求,通过学号认证保障用户真实性
后端·python·sqlite·flask·bootstrap
终将老去的穷苦程序员1 小时前
基于SpringBoot的餐饮管理系统
java·spring boot·后端
心之伊始1 小时前
Spring AI Tool Calling 实战:让 Java Agent 调用本地 Bean 工具方法
java·spring boot·agent·spring ai·tool calling
张忠琳1 小时前
【Go 1.26.4】Golang Map 深度解析
开发语言·后端·golang
一条泥憨鱼2 小时前
Java开发效率神器:Lombok从入门到精通!
java·后端·学习·开发·lombok
熠熠仔2 小时前
Spring Boot 与 MyBatis-Plus 空间几何数据集成指南
spring boot·后端·mybatis
AI 小老六2 小时前
Google AX 控制面拆解:分布式 Agent 如何把断点恢复、审计策略和执行调度收进同一条链路
人工智能·分布式·后端·ai·架构·ai编程
YHHLAI2 小时前
从零搭建一个 RESTful Todo 服务 —— Bun + TypeScript 全栈最小闭环
后端·typescript·restful