You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将BufferedReader读取的请求体转为String时出现URL编码字符,如何处理?

解决Servlet中请求体URL编码字符的清理问题

嘿,这个问题我之前也踩过坑!你看到的%22、%3A这些字符其实都是URL编码后的特殊字符——比如%22对应双引号",%3A对应冒号:,%2C对应逗号,,之所以会出现在读取的内容里,是因为请求体是以URL编码的格式传递的,而你直接用getReader()读取了原始的编码内容。

下面给你两种靠谱的解决方法:

方法一:用URLDecoder直接解码整个请求体

这是最直接的方式,读取完原始内容后,用Java自带的URLDecoder类对字符串进行解码,记得指定正确的字符集(一般是UTF-8),避免解码后出现乱码。

修改后的代码示例:

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
// 其他必要导入...

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    StringBuilder buffer = new StringBuilder();
    BufferedReader reader = req.getReader();
    String line;
    while ((line = reader.readLine()) != null) {
        buffer.append(line);
    }
    // 核心解码步骤
    String decodedContent = URLDecoder.decode(buffer.toString(), StandardCharsets.UTF_8.name());
    // 现在decodedContent就是正常可读的内容了,比如会变成 {"eventType":"created","transactionId":"573975943"...}
    System.out.println(decodedContent);
}

注意:如果你的JDK版本低于1.7,StandardCharsets.UTF_8不可用,直接用字符串"UTF-8"代替即可。

方法二:利用ServletRequest的参数解析(针对特定Content-Type)

如果你的请求Content-Type是application/x-www-form-urlencoded(常见的表单提交格式),其实可以不用手动读请求体,直接用Servlet提供的参数方法获取解码后的值:

// 比如获取eventType参数
String eventType = req.getParameter("eventType");
// 获取所有参数的Map
Map<String, String[]> paramMap = req.getParameterMap();

不过这种方法只适用于请求体是键值对格式的情况,如果请求体是一个完整的URL编码后的JSON字符串,还是方法一更适用。

内容的提问来源于stack exchange,提问作者user1163234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:44:19