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

使用Retrofit在Multipart PUT请求中传递数据失败求助

解决Retrofit PUT请求中Java对象参数无法被后端接收的问题

看起来你遇到的核心问题是**@Multipart注解的使用场景和参数传递方式不匹配**,导致后端收不到Java对象里的参数,下面给你几个针对性的解决方案:

1. 先确认是否真的需要@Multipart

@Multipart主要用于同时上传文件和表单数据的场景,如果你的PUT请求只是提交普通业务数据(没有文件上传需求),完全不需要用@Multipart,改用以下两种更合适的方式:

方案1:用@Body传递JSON格式的对象

直接把你的Java对象通过@Body注解传递,Retrofit会自动帮你序列化为JSON(前提是你已经配置了GsonConverterFactory):

@PUT(WORKING_SESSION_PATH)
Observable<Response<WorkingSession>> updateWorkingSession(
    @Path(LOCATION_ID_VARIABLE) String locationId,
    @Body WorkingSession workingSession // 直接传递Java对象
);

这样后端只要配置了JSON解析器,就能直接接收并解析出对象里的a和其他参数。

方案2:用@FieldMap传递表单格式的参数

如果后端期望接收表单格式的参数,可以把Java对象转成HashMap,用@FieldMap传递:

@FormUrlEncoded
@PUT(WORKING_SESSION_PATH)
Observable<Response<WorkingSession>> updateWorkingSession(
    @Path(LOCATION_ID_VARIABLE) String locationId,
    @FieldMap Map<String, String> params // 把Java对象转成键值对Map
);

调用时可以用Gson把对象转成Map,或者手动构建包含a等参数的HashMap。

2. 如果确实需要@Multipart(比如要上传文件)

如果你的请求必须用@Multipart(比如同时要上传文件),不能直接把Java对象或HashMap作为Part传递,需要把对象序列化为JSON字符串,再封装成RequestBody:

示例代码:

首先修改接口定义:

@Multipart
@PUT(WORKING_SESSION_PATH)
Observable<Response<WorkingSession>> updateWorkingSession(
    @Path(LOCATION_ID_VARIABLE) String locationId,
    // 其他Part参数(比如文件)
    @Part MultipartBody.Part filePart,
    // 把Java对象转成JSON格式的RequestBody
    @Part("working_session_pauses_attributes") RequestBody pausesBody
);

然后在调用接口时,把你的Java对象转成RequestBody:

// 假设你的Java对象是WorkingSessionPauses
WorkingSessionPauses pauses = new WorkingSessionPauses();
pauses.setA("your value");
// 用Gson把对象转成JSON字符串
String pausesJson = new Gson().toJson(pauses);
// 封装成RequestBody,指定MediaType为application/json
RequestBody pausesBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), pausesJson);

// 然后调用接口即可
apiService.updateWorkingSession(locationId, filePart, pausesBody);

这样后端就能正确解析到这个Part里的JSON参数了。

3. 额外调试建议

  • 用OkHttp的Interceptor打印请求日志,确认你的参数是否真的被包含在请求里:
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(logging)
        .build();
    
    查看日志里的请求体,就能知道参数有没有被正确发送。
  • 确认后端的接口接收方式:如果是Multipart请求,后端需要支持解析Multipart中的JSON字段;如果是JSON请求,后端要配置对应的JSON解析器(比如Spring的@RequestBody注解)。

内容的提问来源于stack exchange,提问作者Muhammad Abol Fotouh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:56