使用jodd.http调用Windows服务器Java API出现乱码问题求助
问题分析与解决方案
可能原因
虽然你手动指定了UTF-8编码,但jodd-http在解析响应时,会优先遵循服务器返回的Content-Type响应头中的charset参数。如果服务器返回的响应头未明确指定charset=utf-8,jodd会默认使用ISO-8859-1编码解析响应体,导致乱码。而Apipost这类工具会自动识别响应体的UTF-8编码,所以不会出现乱码。
另外,你在send()之后设置resp.charset()的时机可能存在问题——jodd可能已经在send()过程中完成了响应体的编码解析,后续设置无法覆盖原有解析结果。
解决方案
方案1:直接用字节数组转字符串(最可靠)
绕开jodd的自动编码解析逻辑,直接获取响应字节数组,用UTF-8编码手动转换为字符串:
public static String post(String url, String jsonStr) { HttpResponse resp = HttpRequest.post(url) .connectionTimeout(60000) .timeout(60000) .contentType("application/json", StandardCharsets.UTF_8) .bodyText(jsonStr, "application/json", StandardCharsets.UTF_8) .send(); // 直接用字节数组转换,强制指定UTF-8 return new String(resp.bodyBytes(), StandardCharsets.UTF_8); }
方案2:提前强制设置响应编码(覆盖响应头逻辑)
在获取响应体之前,先强制设置响应的编码,并确保jodd不使用响应头的charset:
public static String post(String url, String jsonStr) { HttpResponse resp = HttpRequest.post(url) .connectionTimeout(60000) .timeout(60000) .contentType("application/json", StandardCharsets.UTF_8) .bodyText(jsonStr, "application/json", StandardCharsets.UTF_8) .send(); // 先移除响应头中可能存在的charset参数,再设置编码 resp.header("Content-Type", "application/json"); resp.charset(StandardCharsets.UTF_8); return resp.bodyText(); }
方案3:检查服务器响应头
确认Windows服务器上的Java API返回的Content-Type响应头是否包含charset=utf-8。如果没有,建议修改服务器端代码,在响应时明确指定编码:
// 服务器端示例(Spring Boot为例) response.setContentType("application/json;charset=utf-8");
验证步骤
- 用jodd发送请求后,打印
resp.headers()查看Content-Type的具体内容,确认是否包含charset参数; - 对比Apipost请求时的响应头,看两者是否一致。
内容的提问来源于stack exchange,提问作者36499
相关产品推荐
相关产品推荐

