۲ علی خدری
چند Base Url
جامعه جاوا (اندروید) ایجاد شده در ۳۱ خرداد ۱۳۹۹

سلام اگر چند تا api مختلف داشته باشیم که مثلا خبر انگلیسی رو از گوگل نیوز بگیره و خبر فارسی را از خبرگزاری داخلی.

چطوری باید api service پیاده سازی کنیم؟

 

سلام خدمت شما یک کلاس به اسم ApiServiceProvider می‌سازیم

و داخلش دو متد که یکیش برای فارسی هست و دیگری برای انگلیسی.

بعد جایی که می‌خوایم استفاده کنیم از هر کدوم که مد نظرمون هست استفاده می‌کنیم.

 

وحید گروسی ۳۱ خرداد ۱۳۹۹، ۰۵:۳۳

سلام علی جان مشخصاً همه چیز دست خودته میتونی جدا جدا بسازی یا نه یه اینستنس نگه داری کنی و طبق نیازت ازش استفاده کنی من که همیشه داخل هر متد یه بار نمونه گرفتم و مشکلی نداشته مثل کد زیر:

object ApiServiceContainer {
    private var apiService: ApiService? = null
    private var authenticationApiService: AuthenticationApiService? = null
    fun getApiService(): ApiService {
        if (apiService == null) {
            val retrofit = Retrofit.Builder()
                .baseUrl(EndPoints.API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
            apiService = retrofit.create(ApiService::class.java)
        }
        return apiService!!
    }
    fun getAuthenticationApiService(): AuthenticationApiService {
        if (authenticationApiService == null) {
            val retrofit = Retrofit.Builder()
                .baseUrl(EndPoints.Authentication_API_BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
            authenticationApiService = retrofit.create(AuthenticationApiService::class.java)
        }
        return authenticationApiService!!
    }
}

نمونه پیشرفته ترشم میشه مثل زیر منتهی اینجا فقط یه url دارم:

object ApiServiceContainer {
    private var apiService: ApiService? = null
    fun getApiService(): ApiService {
        if (apiService == null) {
            val logging = HttpLoggingInterceptor()
            logging.level = HttpLoggingInterceptor.Level.BODY
            val httpClient = OkHttpClient.Builder()
            httpClient.addInterceptor { chain ->
                val original = chain.request()
                // Request customization: add request headers
                val requestBuilder = original.newBuilder()
                    .header("Authorization", "Bearer " + token) // <-- this is the important line
                    .header("Accept", "application/json")
                    .header("Content-Type", "application/json")
                val request = requestBuilder.build()
                chain.proceed(request)
            }
            httpClient.connectTimeout(30, TimeUnit.SECONDS)
            httpClient.readTimeout(30, TimeUnit.SECONDS)
            httpClient.addNetworkInterceptor(logging)
            val okHttpClient = httpClient.build()
            val gson = GsonBuilder()
                .setLenient()
                .create()
            val retrofit = Retrofit.Builder()
                .baseUrl(EndPoints.API_BASE_URL)
                .addConverterFactory(
                    GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .build()
            apiService = retrofit.create(ApiService::class.java)
        }
        return apiService!!
    }
}

 

وحید گروسی ۰۳ تیر ۱۳۹۹، ۱۳:۳۰