发送端代码
@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());