【问题标题】:Get 401 error using Retrofit and Back4app Api Rest使用 Retrofit 和 Back4app Api Rest 得到 401 错误
【发布时间】:2021-03-30 06:40:30
【问题描述】:

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

【问题讨论】:

    标签: android kotlin parse-platform retrofit back4app


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      • 2015-02-02
      • 2020-01-10
      • 2018-02-05
      • 2020-12-01
      • 2013-08-04
      • 1970-01-01
      相关资源
      最近更新 更多