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

Kotlin中Retrofit请求服务器遇500错误,授权头配置存疑

排查Retrofit请求HTTP 500错误的解决方案

核心排查方向

HTTP 500是服务器内部错误,但Postman能正常请求,说明你的客户端请求和Postman的请求存在差异,重点从以下几点排查:

1. 授权头格式错误(最可能的原因)

服务器要求Authorization头为Bearer Token格式,你需要确认传入的token参数是否包含Bearer 前缀:

  • 错误示例:直接传入abc123xyz
  • 正确示例:传入Bearer abc123xyz

修改调用逻辑,在传入token时拼接前缀:

// 在Activity调用checkInOut时,传入带前缀的token
val fullToken = "Bearer $yourActualToken"
checkInOut(type) { result -> /* 处理结果 */ }

或者在API调用函数中统一处理:

suspend fun check(dbName:String, rawToken:String, checkType:String): CheckResponse {
    return withContext(Dispatchers.IO) {
        try {
            val token = "Bearer $rawToken" // 拼接Bearer前缀
            val type = FingerPrint(checkType)
            val response = apiService.createFingerPrint(dbName, type, token)
            println(response)
            response
        } catch (e: HttpException) {
            throw IOException("error 53: $e")
        } catch (e: IOException) {
            throw IOException("error 56: ${e.message}")
        }
    }
}

2. 打印完整请求对比Postman

添加OkHttp日志拦截器,查看实际发送的请求细节(URL、Header、Body),和Postman的请求逐一对比,找出差异:

添加日志拦截器代码

// 创建日志拦截器,打印完整请求/响应内容
val loggingInterceptor = HttpLoggingInterceptor().apply {
    level = HttpLoggingInterceptor.Level.BODY
}

// 构建带日志拦截的OkHttpClient
val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(loggingInterceptor)
    .build()

// 初始化Retrofit时使用该客户端
val retrofit = Retrofit.Builder()
    .baseUrl(你的服务器基础地址)
    .client(okHttpClient)
    .addConverterFactory(GsonConverterFactory.create())
    .build()

查看Logcat日志,重点对比:

  • URL中的查询参数databaseName是否和Postman一致(大小写、值)
  • Authorization头的内容是否和Postman完全匹配
  • 请求体的JSON格式是否为{"type":"Check-in"}(注意字段名大小写、值的格式)

3. 确认请求体序列化正确性

确保FingerPrint数据类能被正确序列化为服务器期望的JSON:

  • 检查Retrofit是否添加了GsonConverterFactory(默认序列化工具)
  • 如果服务器字段名和数据类字段名不一致,添加@SerializedName注解(比如服务器用Type而不是type):
data class FingerPrint (
    @SerializedName("type")
    val type:String
)

4. 验证基础URL和接口路径

确认Retrofit的baseUrl是否以/结尾,接口路径是否正确:

  • 比如baseUrl是https://your-server.com/,接口@POST("/api/finger-print")会拼接成https://your-server.com/api/finger-print,需和Postman的URL完全一致。

内容的提问来源于stack exchange,提问作者Abdulrahman Hasanato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:11:09