适用场景:用于 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");
}
}