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

对接仅支持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:39:15