对接仅支持data-form的登录API时@Multipart方案失效求助
解决Retrofit调用form-data格式登录接口无效的问题
你当前用@Multipart注解的方式不对,@Multipart是用于多部分文件上传的场景,而普通的form-data键值对表单请求,应该用@FormUrlEncoded配合@Field来实现。
正确的Retrofit接口定义
@FormUrlEncoded @POST("oauth/token") suspend fun loginUser( @Field("username") username: String, @Field("password") password: String, @Field("grant_type") grantType: String ): Response<Any>
对应的调用代码
val pass = "password" lifecycleScope.launch { val request = movieService.loginUser( username = userName, password = password, grantType = pass ) Log.i("login", request.body().toString()) }
为什么原来的方式不生效?
@Multipart会将每个@Part封装成独立的请求部分,这和常规的form-data键值对表单结构不符,API无法正确解析参数。- 使用
@FormUrlEncoded时,Retrofit会自动将参数编码为application/x-www-form-urlencoded格式(这是form-data表单的标准编码方式),同时正确设置请求头,让API能正常识别参数。
如果你的API确实要求严格的multipart/form-data(而非application/x-www-form-urlencoded),可以保留@Multipart但调整参数为@PartMap形式,不过绝大多数登录接口用上面的@FormUrlEncoded方式即可解决问题。
内容的提问来源于stack exchange,提问作者Farshad Molazeinali
相关产品推荐
相关产品推荐

