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
相关产品推荐
相关产品推荐

