簡體   English   中英

添加 okHttp 攔截器以檢查網絡連接后,Android 改造異步 api 調用將不起作用

[英]Android retrofit async api calls won't work after adding okHttp interceptor to check for network connection

我們使用改造和 Either 實現了異步和同步調用來映射成功/錯誤。 添加網絡攔截器后,異步調用返回錯誤響應(在郵遞員上工作正常)。 我嘗試添加一般錯誤 JSON 響應,認為要么無法捕獲異常,但仍然沒有運氣。 請提出修復或新方法

攔截器類-

override fun intercept(chain: Interceptor.Chain): Response {
    val request = chain.request()
    try {
        val response = chain.proceed(request)

        val bodyString = response.body!!.string()

        return response.newBuilder()
            .body(ResponseBody.create(response.body?.contentType(), bodyString))
            .build()
    } catch (e: Exception) {
        e.printStackTrace()
        var msg = ""
        when (e) {
            is SocketTimeoutException -> {
                msg = "Timeout - Please check your internet connection"
            }
            is UnknownHostException -> {
                msg = "Unable to make a connection. Please check your internet"
            }
            is ConnectionShutdownException -> {
                msg = "Connection shutdown. Please check your internet"
            }
            is IOException -> {
                msg = "Server is unreachable, please try again later."
            }
            is IllegalStateException -> {
                msg = "${e.message}"
            }
            else -> {
                msg = "${e.message}"
            }
        }

        return Response.Builder()
            .request(request)
            .protocol(Protocol.HTTP_1_1)
            .code(999)
            .message(msg)
            .body(ResponseBody.create(null, "{${e}}")).build()
    }
}`

客戶端- val client1 = OkHttpClient.Builder() .addInterceptor(Interceptor) .build()

ServiceConfig.kt - 添加客戶端如下

 @Singleton
@Provides
@BaseUrl(BaseUrlType.SERVICES)
fun provideSupportRetrofit(
    jsonConverters: Converter.Factory,
    @HttpClient(ClientType.OAUTH) client: Call.Factory
): ServicesFactory {
    return fakeServicesFactory ?: Retrofit.Builder()
        .callFactory(client)
        .baseUrl(baseUrlServices)
        .addCallAdapterFactory(EitherCallAdapterFactory())
        .addConverterFactory(EitherConverterFactory())
        .addConverterFactory(FiberErrorConverterFactory())
        .addConverterFactory(jsonConverters)
        .addConverterFactory(primitiveTypeConverters)
        .client(client1)
        .build()
        .asFactory
}

無論是Covertor.kt -

`override fun enqueue(callback: Callback<Either<*, *>>) {
    call.enqueue(object : Callback<Either<*, *>> {
        override fun onResponse(call: Call<Either<*, *>>, response: Response<Either<*, *>>) {
            callback.onResponse(this@EitherCall, response.asEither)
            }

        }

        override fun onFailure(call: Call<Either<*, *>>, t: Throwable) {
            when (t) {
                is Error -> {
                    Timber.e("Failure Error from API")
                    callback.onFailure(call, t)
                }
                else -> callback.onResponse(this@EitherCall, t.asEither)
            }
        }
    })
}`

獲取標題部分中的錯誤文本

 headers["Accept"] = "application/json"

並以json形式處理錯誤,這種方式對我有用

Response.ErrorListener { error: VolleyError? ->
                if (error is TimeoutError || error is NoConnectionError) {
                    Constants.checkInternet(context)
                } else if (error is ServerError) {
                    val responseBody = String(error.networkResponse.data, Charsets.UTF_8)
                    val errorMsg: String =
                        JSONObject(responseBody).getJSONObject(TAG_META).getJSONObject(
                            TAG_STATUS)
                            .getString(TAG_MESSAGE)
                    Toast.makeText(context, errorMsg + "", Toast.LENGTH_SHORT)
                        .show()

                    Log.e("responseBody", responseBody)
                    Log.e("errorMsg", errorMsg)
                }
                Loading.hide(loading)

            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM