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");
    }
}
相关推荐
Bs_MoneyMagnet27 分钟前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
IT_陈寒1 小时前
Vue的响应式更新把我坑惨了,原来问题出在这
前端·人工智能·后端
陌シ未央ゞ2 小时前
基于BM25算法和RRF实现的混合索引(java版)
人工智能·spring boot·后端·算法
第五页的你2 小时前
SpringBoot基础设施配置(Redis序列化,JJWT新版)
后端
吃饱了得干活2 小时前
RabbitMQ 原理解析(下):存储、集群与可靠投递
后端·rabbitmq
SelectDB2 小时前
某头部保险公司基于 SelectDB 的统一 OLAP 架构实践
后端
ServBay3 小时前
ServBay 1.33.0 来了:AI Gateway 一键接管主流 AI CLI 与多模型
后端·aigc·ai编程
行者全栈架构师3 小时前
Spring Boot 接入 MaxKey 单点登录:6 个内部系统,一次登录全通行
java·vue.js·后端
JuiceFS3 小时前
卓驭:百 PB 级智驾数据存储架构演进
后端·自动驾驶
鱼弦3 小时前
跨模态迁移的极限:语言模型的逻辑能力能否完全迁移到视觉?
后端