Retrofit上传Multipart文件携带RequestParam报400是哪端问题
问题定性
这个问题属于客户端问题。HTTP 400 Bad Request错误的根因是客户端发送的请求参数不符合服务端定义的接收规则,导致服务端无法解析到必填的email参数。
具体原因
- 服务端Spring Boot接口的
email参数通过@RequestParam声明,属于必填参数,缺失会直接返回400错误 - 客户端Retrofit接口使用
@Part注解传递字符串类型的email参数时,若没有提前配置ScalarsConverterFactory,Retrofit无法直接将String类型序列化为Multipart请求的普通字段内容,最终导致email参数没有被正确发出,服务端校验不通过。
修复方案
方案1:将email作为查询参数传递(最简单)
修改Retrofit服务接口,将@Part改为@Query,让email作为URL查询参数传递,服务端无需做任何改动:
@POST("uploadPhoto") @Multipart suspend fun uploadPhoto(@Query("email") email: String, @Part img: MultipartBody.Part): String
方案2:将email转为RequestBody类型传递
如果需要把email放在Multipart请求体中传递,可以把参数类型改为RequestBody:
- 先修改Retrofit接口定义:
@POST("uploadPhoto") @Multipart suspend fun uploadPhoto(@Part("email") email: RequestBody, @Part img: MultipartBody.Part): String
- 调用接口时将字符串转为text/plain类型的RequestBody:
val email = "bekjan.omirzak98@gmail.com" val emailBody = RequestBody.create(MediaType.parse("text/plain"), email) viewModel.uploadPhoto(emailBody, fileToUpload)
内容的提问来源于stack exchange,提问作者разия Утегенова
相关产品推荐
相关产品推荐

