You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:22:34