改造数据发送

问题描述 投票:0回答:1

这是我第一次尝试使用 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错误

android kotlin retrofit
1个回答
0
投票

您可以使用拦截器应用标头。

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)
    }
}

参考https://square.github.io/okhttp/features/interceptors/

© www.soinside.com 2019 - 2024. All rights reserved.