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");
    }
}
相关推荐
Devin~Y1 小时前
大厂Java面试实录:Spring Boot + JVM + Redis/Kafka + 微服务治理 + Spring AI/RAG 一条龙
java·jvm·spring boot·redis·spring cloud·kafka·openfeign
小李云雾1 小时前
慧校坊-二手校园交易平台-------项目总结
数据库·后端·程序人生·fastapi·项目
IT_陈寒1 小时前
被JavaScript的隐式类型转换坑到怀疑人生,记录这次离谱经历
前端·人工智能·后端
wzl202612132 小时前
流量浪费的底层原因:基于SpringBoot构建企微客户精细化运营系统
spring boot·后端·企业微信
楼田莉子2 小时前
Linux网络:多路转接IO
服务器·c++·后端·软件构建
fengxin_rou2 小时前
MySQL 索引高频面试题全解析:B + 树、联合索引、索引失效
后端·mysql
橘子海全栈攻城狮2 小时前
【最新源码】基于springboot的快递物流平台的设计与实现C102
java·开发语言·spring boot·后端·spring·web安全
梦梦代码精2 小时前
开源智能体平台 BuildingAI 深度解析:Monorepo 架构、MCP 集成及 GPT-Image-2 接入实测
前端·人工智能·后端·gpt·开源·github
fanzhonghong2 小时前
javaWeb开发之前端实战(Tlias案例-部门管理)
前端·后端·web·前后端分离