这是我第一次尝试使用 Retrofit 从 Kotlin 中的服务器获取数据,所以如果这个问题对你来说听起来很愚蠢,我很抱歉。
API接口
@POST("/api/finger-print")
suspend fun createFingerPrint(
@Query("databaseName") name: String,
@Body type: FingerPrint,
@Header("Authorization") token:String,
): CheckResponse
API函数
suspend fun check(dbName:String, token:String, checkType:String): CheckResponse {
return withContext(Dispatchers.IO) {
try {
// Call the Retrofit API method
val type = FingerPrint(checkType)
val response = apiService.createFingerPrint(dbName, type, token)
println(response)
// Process response here if needed
response
} catch (e: HttpException) {
// Handle HTTP errors
throw IOException("error 53: $e")
} catch (e: IOException) {
// Handle IO errors
throw IOException("error 56: ${e.message}")
}
}
}
活动
private suspend fun checkInOut(type: String, callback: (String) -> Unit) {
try {
val response = api.check(dbName, token, type)
println(response)
val status = response.status
// Check if the API returned "true" status
if (status == "true") {
withContext(Dispatchers.Main) {
// Success
callback.invoke("Success")
}
} else {
// Failed
callback.invoke("CA Error 523")
}
} catch (e: Exception) {
// Catch any unknown errors
e.printStackTrace()
callback.invoke("CA Error 532")
}
}
数据类
data class FingerPrint (
val type:String
)
data class CheckResponse(
val status:String,
val data: CheckData
)
data class CheckData(
val name:String,
val userID:String,
val email:String,
val time:String,
val date:String,
val type:String,
val _id:String,
)
但我不断收到此错误: java.io.IOException:错误 53:retrofit2.HttpException:HTTP 500 内部服务器错误
服务器期望这样(这就是我在 Postman 上所做的)
URL: {{URL}}指纹?databaseName=myDB 身体原始:{"type":"签到"} 授权:不记名令牌
所有数据均已正确发送,但我认为问题在于我如何设置授权标头
我检查了一些在线问题,例如this,但我不知道如何设置令牌
另外,在那个错误之前,我得到了这个
java.io.IOException:错误 53:retrofit2.HttpException:HTTP 400 错误请求
但是当我将主体部分提取到数据类(就像这样@Body type:String)之后,我得到了代码500错误
您可以使用拦截器应用标头。
class HeaderInterceptor() : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val builder = Headers.Builder()
builder.add("Authorization", yourToken)
val request = chain.request().newBuilder()
.headers(builder.build())
.build()
return chain.proceed(request)
}
}
然后,如下构建您的改造客户端。
object RetrofitBuilder {
fun build(): ApiService {
val headerInterceptor = HeaderInterceptor()
val clientBuilder = OkHttpClient.Builder()
.addInterceptor(headerInterceptor)
val client = clientBuilder.build()
val retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(converterFactory)
.client(client)
.build()
return retrofit.create(ApiService::class.java)
}
}