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

Android Retrofit调用Moffi API报错USER_MUST_BE_CONNECTED但Python请求正常

问题排查与解决:Retrofit调用Moffi API返回USER_MUST_BE_CONNECTED

核心原因:Authorization头格式不匹配

Python代码中会自动为认证token添加Bearer 前缀:

ciheaders["Authorization"] = f"Bearer {auth_token}"

而你的Retrofit方法定义里,@Header("Authorization")接收的token参数如果直接传入原始token值(未加Bearer 前缀),会导致API无法识别认证信息,返回USER_MUST_BE_CONNECTED错误。

修复方法

方式1:调用时手动添加前缀

// 调用接口时,在token前拼接"Bearer "
val authToken = "your_raw_token"
api.order("Bearer $authToken", order)

方式2:统一封装Header(更推荐)

在Retrofit接口方法中约定参数为完整的Authorization头值,或者用拦截器统一处理认证头,避免重复拼接逻辑:

// 修改接口定义(可选,保持原定义也可,只要调用时传入正确格式)
@Headers("Content-Type: application/json")
@POST("orders/add")
fun order(@Header("Authorization") authHeader: String, @Body order: Order): Call<JsonNode>

其他可能的差异排查点

如果上述修复后问题仍存在,逐一验证以下内容:

  • Accept头缺失:Python代码明确设置了Accept: application/json,Retrofit默认可能不携带该头,补充后尝试:
    @Headers(
        "Content-Type: application/json",
        "Accept: application/json"
    )
    @POST("orders/add")
    fun order(@Header("Authorization") authHeader: String, @Body order: Order): Call<JsonNode>
    
  • 请求体序列化不一致:检查Android端Order类的字段名、数据类型是否和Python的body_order完全匹配,比如是否存在大小写差异、日期格式不统一等问题,确保Gson/Moshi的序列化结果和Python的json输出一致。
  • BaseURL匹配:确认Retrofit的baseUrl是否和Python中MOFFI_API的地址完全一致(包含/api后缀等细节),避免路径错误触发非预期的认证逻辑。

调试技巧

用OkHttp拦截器打印完整请求日志,对比Android和Python请求的所有Headers、请求体、URL,精准定位差异:

// 添加日志拦截器到OkHttpClient
val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor)
    .build()

// 关联到Retrofit实例
val retrofit = Retrofit.Builder()
    .baseUrl("your_base_url")
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:52:39