BUG记录——Request接传Json数据中文乱码
发送端代码
@PostMapping("/test")
public R purchase(@RequestBody XFTRequest xftRequest) {String url = "http://xxx.xx.xxx.x:12/api/payrollService/createOAProcess";// 1. 使用静态ObjectMapper实例提高性能ObjectMapper objectMapper = new ObjectMapper();objectMapper.enable(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature());try {// 2. 序列化请求对象String jsonRequest = objectMapper.writeValueAsString(xftRequest);// 3. 创建并配置HTTP请求HttpRequest request = HttpRequest.post(url).contentType("application/json; charset=UTF-8") // 修正为JSON格式.body(jsonRequest) // 直接使用JSON作为请求体.setConnectionTimeout(60 * 1000) // 60秒连接超时.setReadTimeout(300 * 1000) // 300秒读取超时.disableCookie();// 4. 执行请求并获取响应HttpResponse response = request.execute();// 5. 处理响应if (response.isOk()) {String responseBody = response.body();// 6. 可选:解析响应JSON// Map<String, Object> responseMap = objectMapper.readValue(responseBody, Map.class);return R.success(responseBody);} else {// 7. 详细错误处理String errorMsg = String.format("请求失败! 状态码: %d, 错误信息: %s",response.getStatus(), response.body());return R.fail(errorMsg);}} catch (Exception e) {// 8. 改进异常处理String errorMsg = String.format("请求异常: %s - %s",e.getClass().getSimpleName(), e.getMessage());return R.fail(errorMsg);}
}
接收端代码
public class PayrollServiceDoCreatePosting extends HttpServlet {@Path("/payrollService")public static class OAProcessHandle extends BaseBean {public OAProcessHandle() {}@POST@Path("/createOAProcess")public String createProcess(@Context HttpServletRequest request, @Context HttpServletResponse response) throws IOException {StringBuilder sb = new StringBuilder();try (BufferedReader reader = request.getReader()) {String line;while ((line = reader.readLine()) != null) {sb.append(line); // 直接追加,不进行URL解码}}String requestBody = sb.toString();this.writeLog("@@@ 原始请求体: " + requestBody);return JSONObject.toJSONString(apidatas);}}
}
如图中文乱码,搞了一下午,弄了四五个小时,一直以为是接收端的问题,反反复复修改,最后发现是发送端的问题。
发送端代码做修改如下
ObjectMapper objectMapper = new ObjectMapper();
// 添加下面这行代码就可以解决【中文乱码】
objectMapper.enable(JsonWriteFeature.ESCAPE_NON_ASCII.mappedFeature());