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

