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

Android端Retrofit对接Spring Boot上传图片返回400 Bad Request错误

400错误排查原因及解决方案

核心问题1:非文件Part的Content-Type不匹配

你客户端用@Part("newService")直接传ServiceApiData对象时,Retrofit默认不会给这个part设置application/json的Content-Type,Spring Boot端的@RequestPart无法识别该part的类型,无法将其反序列化为ServiceServer对象,直接抛出参数解析异常返回400。

修复方案

将Retrofit接口的newService参数改为RequestBody类型,手动指定JSON类型:

// 修改Retrofit接口定义
@Multipart
@POST("/api/v1/services/add")
suspend fun addServiceAsync(
    @Part("newService") service: RequestBody,
    @Part imageFile:MultipartBody.Part?,
    @Header("Authorization") jwt:String?
): StatusAndStrApi?

构造请求时先将ServiceApiData对象转为JSON字符串,再生成对应RequestBody:

// 先把service对象转成JSON串,用你项目里的Gson/Jackson都行
val serviceJson = Gson().toJson(serviceObj)
val serviceRequestBody = serviceJson.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
// 再传入Retrofit接口调用

核心问题2:可选文件参数未标注非必填

你服务端的imageFileFromClient参数没有加required = false配置,默认是必填项,如果客户端传入的imageFile为null,不会携带该part,服务端检测不到必填参数直接返回400。

修复方案

修改服务端接口参数注解:

@RequestPart(name = "imageFileFromClient", required = false) MultipartFile imageFile

其他排查点

  • 校验ServiceApiData和ServiceServer的字段名、字段类型完全匹配,日期、枚举等特殊类型的序列化/反序列化规则一致,避免反序列化失败。
  • 确认请求时Authorization头没有传空值,如果服务端开启了鉴权校验,空的JWT也可能触发400错误。
  • 可在Spring Boot配置文件中添加logging.level.org.springframework.web=DEBUG开启详细请求日志,直接定位具体参数解析失败的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:27:04