微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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())
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。