使用 Retrofit 和 Back4app Api Rest 获取 401 错误

问题描述

我在 back4app 中有一个应用程序,我正在尝试通过改造获取数据,但收到 401 响应。

添加了这些标题参数

  • X-Parse-Application-Id
  • X-Parse-REST-API-Key
  • 内容类型

我尝试添加 X-Parse-Session-Token 但有相同的响应。 当我通过邮递员检查时,我正确地获得了数据

这是我的代码

APIService

@GET("users")
fun getPlayers(): Call<PlayersResponse>

玩家回应:

class PlayersResponse {

    @Serializedname("results")
    var players: List<PlayerResponse>? = null

    inner class PlayerResponse {

        private val objectId: String? = null

        private val username: String? = null
    }
}

改造服务

fun <S> createService(serviceClass: Class<S>): S {
    val httpClient = OkHttpClient.Builder()
    val builder = Retrofit.Builder().addConverterFactory(GsonConverterFactory.create())
    httpClient.addInterceptor { chain -> return@addInterceptor addHeaderParams(chain) }
    httpClient.connectTimeout(HTTP_TIMEOUT_SECS.toLong(),TimeUnit.SECONDS)
    httpClient.readTimeout(HTTP_TIMEOUT_SECS.toLong(),TimeUnit.SECONDS)
    val retrofit: Retrofit = builder
        .baseUrl(URL_BACKEND)
        .client(httpClient.build())
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .build()

    return retrofit.create(serviceClass)
}

private fun addHeaderParams(chain: Interceptor.Chain): Response {
    val request = chain.request().newBuilder()
    val originalHttpUrl = chain.request().url
    val newUrl = originalHttpUrl.newBuilder().apply {
        addQueryParameter(HEADER_APP_ID,APP_ID)
        addQueryParameter(HEADER_API_KEY,API_KEY)
        addQueryParameter(HEADER_CONTENT_TYPE,CONTENT_TYPE)
    }.build()
    request.url(newUrl)

    return chain.proceed(request.build())
}

获取玩家的功能

override suspend fun getPlayers(mapper: PlayersMapper): DataResult<List<Player>> {

    val client: ApiService = RetrofitService.createService(ApiService::class.java)
    val players = withContext(dispatchers.IO) { client.getPlayers().execute() }
    return if (players.isSuccessful) {
        DataResult.Success(mapper.map(players.body()))
    } else {
        DataResult.Error(Exception(players.message()))
    }
}

解决方法

我将 addHeadersParams 更改为这个函数,现在它可以工作了

private fun addHeaderParams(chain: Interceptor.Chain): Response {
    val request = chain.request().newBuilder().apply {
        addHeader(HEADER_APP_ID,APP_ID)
        addHeader(HEADER_API_KEY,API_KEY)
        addHeader(HEADER_CONTENT_TYPE,CONTENT_TYPE)
    }
    return chain.proceed(request.build())
}