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");
    }
}
相关推荐
前端兰博8 小时前
05-Redis
redis·后端
databook9 小时前
从手动检查到自动监控:一个数据质量工作流的实现
后端·python·数据分析
【JAVA】玩家9 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
东风破_10 小时前
从 Neo4j 到 GraphRAG:用 Text-to-Cypher 构建图检索 RAG
人工智能·后端
llqbzllll11 小时前
Spring AI 工具调用不是反射一下就结束:用 2.0.1 跑通失败恢复与调用上限
人工智能·后端
狼爷12 小时前
Rust/Go/Java/Python/PHP 大比拼:负载下后端框架到底差多少?
java·后端·编程语言
mantou13213 小时前
我给 AI Agent 做了个「油猴」:让 Claude Code / Codex 直接用你已登录的浏览器
前端·javascript·后端
程序员老赵13 小时前
Docker 部署 DeepSeek Harness:轻松搭建局域网里的 AI Agent 平台
后端·ai编程·deepseek
YIAN13 小时前
实战|用 DeepSeek + SQLite 从零搭建轻量 Text2SQL 查询助手
后端·sqlite·deepseek
王中阳Go13 小时前
自己摸了 2 个月零 offer,补底子只用了 3 块:Go 后端转 AI 最难的不是技术
后端·agent·ai编程