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

