BUG记录——Request接传Json数据中文乱码

发布于:2025-08-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

发送端代码

@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());


网站公告

今日签到

点亮在社区的每一天
去签到