-1

I have and app in back4app and I'm trying to get data with retrofit but I'm getting 401 response.

I add these header params

  • X-Parse-Application-Id
  • X-Parse-REST-API-Key
  • Content-Type

I try to add X-Parse-Session-Token but has the same response. When I check by postman I get the data correctly

Here is my code:

ApiService

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

PlayerResponse:

class PlayersResponse {

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

    inner class PlayerResponse {

        private val objectId: String? = null

        private val username: String? = null
    }
}

RetrofitService

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

Function to get Players

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()))
    }
}
Pablo Garcia
  • 361
  • 6
  • 23

1 Answers1

0

I changed addHeadersParams to this function and now it works

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())
}
Pablo Garcia
  • 361
  • 6
  • 23