Модификация с помощью kotlin throws Не удалось подключиться к {ServerName / IpAddress} - PullRequest
0 голосов
/ 23 апреля 2020

Я сталкиваюсь со странной проблемой при использовании retrofit2 и kotlin. Я новичок в Kotlin. Когда я обращаюсь к API более 6 раз, я получаю Ошибка подключения к {ServerName / IpAddress} ошибка.

Вот код для интерфейса

 companion object {
    lateinit var context: Context
    private fun getHttpClient(): OkHttpClient.Builder {
       return OkHttpClient.Builder()
                .readTimeout(60, TimeUnit.SECONDS)
                .connectTimeout(60, TimeUnit.SECONDS)
                .addInterceptor(HttpLoggingInterceptor().apply {
                    level = if(BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
                })
    }
    fun retrofitBuilder(): Retrofit.Builder {
        val gson = GsonBuilder().setLenient().create()
        return Retrofit.Builder()
                .baseUrl(AppConstants.BASE_URL)
                //.addConverterFactory(ToStringConverterFactory())
                .addConverterFactory(GsonConverterFactory.create(gson))
    }

    fun create(): ApiInterface {
        val gson = GsonBuilder().setLenient().create()
        val retrofit = retrofit2.Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(AppConstants.BASE_URL)
                .client(getHttpClient().build())
                .build()

        return retrofit.create(ApiInterface::class.java)
    }

    fun createWithAuth(context: Context, token: String?): ApiInterface {
        this.context = context
        val httpClient = getHttpClient()

        httpClient.addInterceptor { chain ->
            val req = chain.request()
            val request = chain.request().newBuilder()
                    .addHeader("Authorization", "Bearer $token")
                    .addHeader("Accept-Encoding", "None")
                    .method(req.method, req.body)
                    .build()
            chain.proceed(request)
        }

        val retrofits = retrofitBuilder().client(httpClient.build()).build()
        return retrofits.create(ApiInterface::class.java)
    }
}

Я проверил, есть ли проблема с сервером, но я проверил в Почтальоне, используя Runner, чтобы 100 раз выполнить один и тот же API за l oop. Почтальон каждый раз возвращает успешный ответ.

Пожалуйста, помогите мне.

Спасибо.

1 Ответ

0 голосов
/ 23 апреля 2020

В приведенном выше вопросе код в Companion Object {} написан в классе Interface, где присутствуют мои конечные точки.

И создал этот класс, аналогичный приведенному выше коду, но как отдельный класс .

class ApiClient private constructor() {
companion object {
    private val retrofit: Retrofit? = null
    private var context: Context? = null


    private val httpClient: OkHttpClient.Builder = OkHttpClient.Builder()
            //.addInterceptor(LoggingInterceptor())


    private val builder: Retrofit.Builder = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())

    fun  createService(ctx: Context): ApiInterface {
        context = ctx
        val retrofit: Retrofit = builder.client(httpClient.build()).build()
        return retrofit.create(ApiInterface::class.java)
    }


    fun createServiceWithAuth(ctx: Context, authToken: String?): ApiInterface {
        context = ctx
        if (authToken != null) {
            httpClient.addInterceptor(object : Interceptor {
                @Throws(IOException::class)
                override fun intercept(chain: Interceptor.Chain): Response {
                    val original: Request = chain.request()
                    val request: Request = original.newBuilder() //.header("User-Agent", "Your-App-Name")
                            .header("Authorization", "bearer $authToken")
                            .header("Accept-Encoding", "None")
                            .method(original.method, original.body)
                            .build()return chain.proceed(request)
                }
            })
        }
        val retrofit: Retrofit = builder.client(httpClient.build()).build()
        return retrofit.create(ApiInterface::class.java)
    }
  }
}

Я до сих пор не понимаю, в чем проблема в этих двух кодах {Вопрос задан, и этот ответ}. Но этот ответ не дает мне такой проблемы.

Если кто-нибудь сможет мне объяснить, это будет полезно и мне, и другим.

Спасибо

...