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

为什么HTTP状态码204在Moshi中会被判定为REST请求调用失败

204状态码被Moshi判定为请求失败的原因及解决方案

核心原因

首先要澄清:204 No Content 本身属于HTTP标准定义的2xx成功类状态码,原生OkHttp的response.isSuccessful()方法判断逻辑为code >= 200 && code < 300,默认是会将204判定为请求成功的。

你遇到的204被判定为失败,问题出在Moshi反序列化的默认逻辑:

  • 多数REST客户端(比如常见的Retrofit+OkHttp+Moshi技术栈)会默认配置Moshi作为全局响应转换器,所有请求返回后都会自动尝试将响应Body反序列化为你定义的目标Java类型。
  • 204响应的Body为空,Moshi默认不允许空内容反序列化为非空的目标对象,会直接抛出反序列化异常。该异常会被上层客户端框架捕获,最终将整个请求标记为失败,甚至会让逻辑进入你代码中的!response.isSuccessful()分支。

可行解决方案

  • 方案1:针对明确会返回204的接口,将响应的目标接收类型声明为Void。Moshi和上层框架识别到目标类型为Void时,会自动跳过Body反序列化步骤,直接将204判定为成功。
  • 方案2:手动调整请求处理逻辑,在执行Moshi反序列化前先判断状态码,如果是204直接走成功逻辑,不需要解析Body:
Request request = new Request.Builder()
    ...
    .put(body)
    .build();                                     
try(Response response = client.newCall(request).execute()){
    // 优先处理204特殊场景
    if (response.code() == 204) {
        // 执行无返回值的成功逻辑
        return;
    }
    if(!response.isSuccessful()){
         int responseCode = response.code();
         // 其他错误逻辑处理
     }
     // 正常2xx非204响应的反序列化逻辑
     MyResult result = moshi.adapter(MyResult.class).fromJson(response.body().source());
}
  • 方案3:自定义Moshi响应转换器,全局添加204状态码的特殊处理逻辑:检测到响应状态码为204时,直接返回空对象/Null,不执行反序列化流程。

内容的提问来源于stack exchange,提问作者Rainbow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:15:04