Spring Boot API印地语文本在Postman正常 移动端请求时数据接收异常
问题根因
- 核心为字符编码不一致:Postman默认会自动给请求加
UTF-8编码标识,而移动应用发送请求时未统一使用UTF-8编码,导致印地语这类多字节Unicode字符被单字节编码(如ISO-8859-1、ASCII)截断转义,最终出现返回值中的\u0015这类不可见控制字符。 - 次要原因可能是Spring Boot侧未强制设置请求解码编码,当请求未指定编码时会使用服务器操作系统默认编码,无法正确解析印地语字符。
- 极端情况下是移动端序列化JSON时就用错误编码转字节流,数据传输到后端时已经损坏,无法正常解码。
修复方案
移动端侧(优先处理)
- 发送带请求体的接口请求时,必须在
Content-Type请求头中明确指定编码,值为Content-Type: application/json; charset=utf-8 - 检查所用网络请求库的配置,序列化JSON字符串时强制指定UTF-8编码转字节流,禁止使用系统默认编码。
- 可通过本地日志校验发送前的印地语原文和编码后的字节序列,确认发送环节无数据损坏。
Spring Boot后端侧(兜底兼容)
- 在配置文件中强制全局请求响应使用UTF-8编码,properties配置示例:
server.servlet.encoding.force=true server.servlet.encoding.charset=UTF-8 server.servlet.encoding.force-request=true server.servlet.encoding.force-response=true spring.http.encoding.force=true spring.http.encoding.charset=UTF-8
- 若使用自定义消息转换器,需给Jackson转换器明确设置默认UTF-8编码,代码示例:
@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setDefaultCharset(StandardCharsets.UTF_8); return converter; }
- 可新增全局请求过滤器,当请求头
Content-Type未指定charset时,强制使用UTF-8解码请求体。
验证方式
修复完成后先抓包确认移动端请求头携带了charset=utf-8标识,再打印后端接收到的原始请求体内容,确认和移动端发送的印地语原文一致即可。
内容的提问来源于stack exchange,提问作者Vivek Srivastava
相关产品推荐
相关产品推荐

