Android Java中Retrofit POST传数组仅保存最后一个元素如何解决
排查解决步骤
第一步:优先排查Retrofit服务接口定义
你的问题90%以上出在Service类中createJob方法的注解配置上:
- 如果你当前用了
@FormUrlEncoded+@Field("tags")传数组参数,表单传参默认会把数组元素拼接覆盖,最终只会保留最后一个值,和你遇到的现象完全吻合。 - 如果你是拆分参数拼接请求体,没有使用结构化的Body传参,也会导致数组序列化错误。
第二步:推荐最优修复方案(直接传POJO作为请求体)
你已经定义好了draftedJobPostModel实体类,直接用它作为整个JSON请求体即可,Gson会自动把tags字段序列化为标准数组格式:
- 修改
Service接口的createJob定义:
// 替换成你的实际接口请求路径 @POST("job/create") Call<createJobPostModel> createJob( @Header("Authorization") String auth, @Body draftedJobPostModel postModel );
- 调整请求调用代码,先构造POJO再传入:
// 构造请求实体,最后一个参数填你实际的post_type值 draftedJobPostModel postModel = new draftedJobPostModel( title, jobtype, fieldId, arrayTags, date, description, budget, "draft" ); Service service = Client.retrofit.create(Service.class); Call<createJobPostModel> call = service.createJob("Bearer " + token, postModel); // 后续enqueue逻辑保持不变
可选校验方案:打印请求报文确认参数格式
如果修改后还是有问题,可以接入OkHttp的日志拦截器,打印完整的请求体确认tags格式:
// 构建OkHttpClient时添加拦截器 HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .build(); // 构建Retrofit时传入该client
查看日志中请求体的tags字段,如果已经是数组格式但服务端返回还是字符串,那就是服务端解析逻辑的问题,需要和后端联调。
额外注意点
你给出的示例JSON中category_id和budget是字符串类型,而POJO中定义的是int类型,如果后续服务端报参数类型错误,可以把这两个字段的类型调整为String匹配接口要求。
内容的提问来源于stack exchange,提问作者Nadim Mahmud Ovi
相关产品推荐
相关产品推荐

