调用Mojang认证接口遇400错误及JsonMappingException问题排查
解决Mojang认证服务器400 Bad Request(JsonMappingException)问题
看起来你遇到的核心问题是服务器无法正确解析你的JSON请求体,从错误信息里能看到,它把整个JSON字符串当成了一个单一的字符串值来尝试反序列化到CaptchaCredentials类,这明显不对——说明你的请求在传输过程中格式或者编码出了问题。
问题根源
你的代码里创建StringEntity的时候没有指定编码格式,默认情况下StringEntity会使用ISO-8859-1编码,而JSON规范要求用UTF-8编码。这种编码不匹配会导致服务器无法正确解析请求体,最终抛出JsonMappingException。
解决方案
修改StringEntity的创建代码,明确指定UTF-8编码,同时在请求头里也明确字符集:
import java.nio.charset.StandardCharsets; import org.apache.http.util.EntityUtils; // ... 你的其他代码 ... Gson gson = new Gson(); CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpPost post = new HttpPost(server); // 关键修改:指定UTF-8编码创建StringEntity StringEntity postingString = new StringEntity(gson.toJson(payload), StandardCharsets.UTF_8); post.setEntity(postingString); // 在Content-Type头里明确指定字符集,避免服务器误解 post.setHeader("Content-Type", "application/json; charset=UTF-8"); HttpResponse response = httpClient.execute(post); // 改用EntityUtils.toString来正确获取响应内容,原response.toString()只能拿到代理对象的描述 this.authResponse = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
额外调试建议
- 打印实际发送的JSON内容:在创建
StringEntity之前,输出gson.toJson(payload),确认它的格式和你预期的完全一致,没有语法错误(比如多余的逗号、缺失的括号)。 - 用Postman/curl手动验证请求:把你生成的JSON作为请求体,发送POST到目标地址,看看是否能正常响应。如果手动请求没问题,那问题肯定出在代码的请求构建逻辑上。
- 注意API限制:Mojang的旧用户名密码认证API可能会触发验证码机制,如果你修改编码后仍然报错,要检查响应内容里是否包含验证码相关的要求,需要额外处理验证码流程。
关于之前的Method Not Allowed错误
这个应该是你最初测试时的请求方式错误导致的,现在你使用HttpPost是符合API要求的,只要请求格式正确就不会再出现这个问题。
内容的提问来源于stack exchange,提问作者Gamer818
相关产品推荐
相关产品推荐

