You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Retrofit请求返回200但response.body()为空,如何获取返回的Barcode?

问题分析与解决方案

我来帮你拆解下这个问题:你POST请求返回200状态码说明接口调用成功,但拿不到响应体里的Barkod值,甚至response.body()为空,大概率是数据解析环节出了问题,咱们一步步排查:

可能的原因及对应解决办法

1. 实体类缺少无参构造函数,导致Gson无法解析

Gson在序列化/反序列化Java对象时,默认要求类有一个公共的无参构造函数,但你的EtiketItemPostModelEtiketItemModels都只写了带参数的构造函数,这会让Gson无法实例化对象,直接导致解析失败,响应体为空。

解决办法:给两个实体类添加无参构造函数:

// EtiketItemPostModel添加
public EtiketItemPostModel() {}

// EtiketItemModels添加
public EtiketItemModels() {}

2. 字段名与后端返回的JSON不匹配

如果后端返回的JSON字段名和你实体类里的字段名不一致(比如后端返回barkod小写,你类里是Barkod大写),Gson默认的精确匹配会解析失败,对应字段值为null,甚至整个对象解析为空。

解决办法:用@SerializedName注解做字段映射(把括号里的内容改成后端实际返回的字段名):

// EtiketItemPostModel的Barkod字段示例
import com.google.gson.annotations.SerializedName;

public class EtiketItemPostModel {
    @SerializedName("EtiketItemModels")
    List<EtiketItemModels> EtiketItemModels;
    @SerializedName("FaturaNo")
    private String FaturaNo;
    @SerializedName("Barkod") // 这里写后端返回的实际字段名,比如如果是小写就写"barkod"
    private String Barkod;
    
    // 构造函数、getter方法...
}

其他字段如果存在名称不匹配的情况,也用同样方式处理。

3. Retrofit转换器顺序导致解析优先级错误

你同时添加了ScalarsConverterFactoryGsonConverterFactory,而且把Scalars放在了前面。如果后端返回的是JSON格式,Scalars会优先尝试把响应解析成字符串,导致Gson转换器无法生效,用EtiketItemPostModel接收时就会解析失败。

解决办法:把GsonConverterFactory放在前面,让它优先处理JSON响应:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("myURL")
        .addConverterFactory(GsonConverterFactory.create()) // Gson在前
        .addConverterFactory(ScalarsConverterFactory.create())
        .build();

4. 先确认后端返回的原始数据(排查利器)

如果上面的方法都没解决,建议先打印后端返回的原始响应内容,确认是否真的返回了Barkod字段,以及格式是否符合预期。

临时调试代码:修改接口返回类型为Call<String>,打印原始响应:

public interface Etiket_Post {
    @POST("api/r_etiket")
    Call<String> post_etiket(@Body EtiketItemPostModel items);
}

// 回调里打印原始数据
call.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        if (response.isSuccessful()) {
            System.out.println("后端原始响应:" + response.body()); // 直接输出返回内容
        }
    }
    
    @Override
    public void onFailure(Call<String> call, Throwable t) {
        t.printStackTrace();
    }
});

通过这个方式,你能直观看到后端返回的JSON结构,再针对性调整实体类的字段映射。


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

火山引擎 最新活动