Retrofit请求返回200但response.body()为空,如何获取返回的Barcode?
我来帮你拆解下这个问题:你POST请求返回200状态码说明接口调用成功,但拿不到响应体里的Barkod值,甚至response.body()为空,大概率是数据解析环节出了问题,咱们一步步排查:
可能的原因及对应解决办法
1. 实体类缺少无参构造函数,导致Gson无法解析
Gson在序列化/反序列化Java对象时,默认要求类有一个公共的无参构造函数,但你的EtiketItemPostModel和EtiketItemModels都只写了带参数的构造函数,这会让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转换器顺序导致解析优先级错误
你同时添加了ScalarsConverterFactory和GsonConverterFactory,而且把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




