Retrofit: bu nima, Android HTTP-klientining xususiyatlari

Muallif: IT Sectr Nashr etilgan: 2026-03-07 O'qish vaqti: 8 daq

Retrofit — Square kompaniyasi tomonidan ishlab chiqilgan Android va Kotlin uchun tiplangan HTTP-klientidir. Kutubxona annotatsiyalar yordamida REST API-ni Java yoki Kotlin interfeysiga aylantirish imkonini beradi. Square, 2025 ma'lumotlariga ko'ra, Retrofit minglab ilovalarda HTTP so'rovlari bilan ishlash uchun standart vosita sifatida ishlatiladi.

Asosiy ma'lumotlar

  • Retrofit — Square-dan Android va Kotlin uchun deklarativ API bilan tiplangan HTTP-klienti
  • Annotatsiyalar @GET, @POST, @Path, @Query HTTP so'rovlarini boilerplate kodsiz tasvirlaydi
  • Konvertorlar Gson, Moshi va Kotlinx Serialization JSON-ni Kotlin obyektlariga o'zgartiradi
  • OkHttp — Retrofit ostida barcha HTTP so'rovlarini bajaradigan majburiy transport qatlami
  • Suspend funksiyalari asinxron chaqiruvlar uchun Retrofit-ni Kotlin korutinlari bilan integratsiyalaydi

Retrofit nima?

Retrofit — Square kompaniyasi tomonidan ishlab chiqilgan Android platformasida REST API bilan tiplangan o'zaro aloqa uchun kutubxonadir. U annotatsiyalar bilan Java yoki Kotlin interfeyslari orqali HTTP so'rovlarini tasvirlashning deklarativ usulini taqdim etadi, dasturchini JSON-ni qo'lda pars qilish va HTTP ulanishlarini boshqarishdan butunlay ozod qiladi.

Kutubxona 2013-yilda AsyncTask va HttpURLConnection kabi noqulay echimlarga muqobil sifatida paydo bo'ldi. 2025-yilga kelib Retrofit soddaligi va tip xavfsizligi tufayli Android ilovalarida tarmoq aloqasi uchun de-fakto standart bo'lib qolmoqda. JetBrains Developer Ecosystem 2024 so'roviga ko'ra, Retrofit tijorat loyihalarida Android dasturchilarning 65% dan ortig'i tomonidan ishlatiladi.

Retrofit-ning analoglardan asosiy farqi — deklarativ yondashuv: dasturchi nima qilishni (qaysi endpoint-ni chaqirish, qanday parametrlarni uzatish) tasvirlaydi, qanday qilishni emas (ulanishni qanday ochish, InputStream-ni qanday o'qish, JSON-ni qanday pars qilish). Bu HttpURLConnection-ni qo'lda ishlatish bilan solishtirganda boilerplate kod miqdorini 60–70% kamaytiradi.

Retrofit qanday ishlaydi

Ishlash prinsipi — Retrofit Java dinamik proksilariga asoslanadi. Dasturchi annotatsiyalar bilan belgilangan interfeys metodini chaqirganda, Retrofit Proxy.newProxyInstance mexanizmi orqali chaqiruvni tutib oladi va uni HTTP so'roviga aylantiradi. Butun jarayon kompilyatsiya bosqichida kod generatsiyasisiz runtime-da sodir bo'ladi.

Retrofit.Builder namunasi yaratilganda bazaviy URL va konvertor fabrikasi ko'rsatiladi. Builder OkHttpClient-ni konfiguratsiyalaydi — taymoutlar, interceptorlar, ulanishlar hovuzi va keshni o'rnatadi. create(Class) metodi interfeys implementatsiyasini yaratadi, oddiy sinf kabi chaqirilishi mumkin bo'lgan proksi-obyektni qaytaradi.

So'rovning bajarilish zanjiri quyidagicha: annotatsiyalar HTTP metodini chiqaradi, parametrlar URL yoki so'rov tanasiga joylashtiriladi, konvertor tanani serializatsiyalaydi, OkHttp so'rovni bajaradi, konvertor javobni deserializatsiyalaydi, natija ko'rsatilgan turda qaytariladi. Har bir bosqich izolyatsiya qilingan va maxsus implementatsiya bilan almashtirilishi mumkin, masalan, test uchun OkHttpClient-ni MockWebServer bilan almashtirish yoki API o'zgarishida konvertorni o'zgartirish.

Muhim xususiyat — Retrofit to'g'ridan-to'g'ri ma'lumotlar oqimini uzatishni qo'llab-quvvatlamaydi. Oqim uchun interfeys metodining qaytarish turi sifatida OkHttp ResponseBody ishlatiladi. Retrofit, shuningdek, so'rovlarni bekor qilishni avtomatik boshqarmaydi — bekor qilish uchun Call-ga havolani saqlab, cancel() chaqirish kerak. Kotlin-da suspend funksiyalari bilan so'rovni bekor qilish ota-korutin bekor qilinganda avtomatik sodir bo'ladi.

Call obyektining hayotiy sikli

Call<T> — bitta HTTP so'rovini ifodalovchi obyektdir. Bajarilishdan so'ng (execute yoki enqueue) Call qayta ishlatilmaydi — takroriy so'rov uchun interfeys metodini chaqirish orqali yangi Call yaratilishi kerak. Bu bir xil so'rovning tasodifan ikki marta yuborilishidan himoya qiladi, bu serverda operatsiyalarning takrorlanishiga olib kelishi mumkin.

Kotlin-da Call o'rniga avtomatik boshqaruvchi suspend funksiyalari ishlatiladi. Retrofit o'zi bajarishni Dispatchers.IO-ga o'tkazadi va natijani korutinga qaytaradi. Bu Call va Callback versiyasi bilan solishtirganda kodni 30–40% qisqartiradi.

HTTP metodlari uchun Retrofit annotatsiyalari

Annotatsiyalar — Retrofit-da HTTP so'rovlarini konfiguratsiyalashning asosiy mexanizmidir. Har bir annotatsiya standart HTTP metodiga mos keladi va endpoint-ga nisbiy yo'lni qabul qiladi. Retrofit GET, POST, PUT, DELETE, PATCH, HEAD va OPTIONS-ni qo'llab-quvvatlaydi.

AnnotatsiyaHTTP metodiMaqsadi
@GETGETServerdan ma'lumot olish
@POSTPOSTYangi resurs yaratish
@PUTPUTResursni to'liq yangilash
@DELETEDELETEResursni o'chirish
@PATCHPATCHResursni qisman yangilash

So'rov parametrlari annotatsiyalari

@Path qiymatni URL segmentida almashtiradi: @Path(id) Int id {id}-ni yo'lda almashtiradi. @Query query-parametr qo'shadi: @Query(page) Int page ?page=5-ga aylanadi. @Body tanlangan konvertor orqali avtomatik serializatsiya bilan obyektni so'rov tanasida uzatadi. @Header va @Headers statik yoki dinamik HTTP sarlavhalarini boshqaradi.

Bu annotatsiyalarni birlashtirib, istalgan REST endpoint-ni tasvirlash mumkin. Masalan, POST /api/users/{id}/posts?limit=10 endpoint uchun @POST, id uchun @Path, limit uchun @Query va uzatiladigan obyekt uchun @Body kerak bo'ladi. Retrofit avtomatik to'g'ri HTTP so'rovini yig'adi. Qo'shimcha ravishda @Url (dinamik URL), @Field (form-encoded body), @Part va @PartMap fayllar bilan multipart so'rovlar uchun qo'llab-quvvatlanadi.

Kotlin-da Retrofit kod namunalari

Amaliy misolni ko'rib chiqaylik — GitHub API uchun interfeys. Repozitoriyalar ro'yxatini olish metodi bilan Kotlin interfeysi yaratiladi. Data class Repo JSON javobining strukturasini tasvirlaydi.

kotlin
data class Repo(
    val name: String,
    val description: String?,
    val stargazersCount: Int,
    val forksCount: Int
)

interface GitHubApi {
    @GET("users/{user}/repos")
    suspend fun getRepos(
        @Path("user") user: String,
        @Query("sort") sort: String = "updated"
    ): List<Repo>
}

Interfeys tasvirlangandan so'ng Builder orqali Retrofit namunasi yaratiladi. Bazaviy URL, konvertor va OkHttpClient bir marta konfiguratsiyalanadi va dependency injection orqali qayta ishlatiladi.

kotlin
val retrofit = Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .addConverterFactory(GsonConverterFactory.create())
    .client(OkHttpClient.Builder()
        .connectTimeout(30, TimeUnit.SECONDS)
        .build())
    .build()

val api = retrofit.create(GitHubApi::class.java)

Response bilan javobni qayta ishlash

HTTP statuslarini moslashuvchan qayta ishlash uchun Response<T> o'ramidan foydalaning. U javob kodiga, sarlavhalarga va tanaga kirish imkonini beradi, 4xx va 5xx xatolarida istisno tashlamaydi. Bu 404 va 500-ni try-catchsiz qayta ishlash imkonini beradi.

kotlin
interface GitHubApi {
    @GET("users/{user}/repos")
    suspend fun getRepos(
        @Path("user") user: String
    ): Response<List<Repo>>
}

val response = api.getRepos("octocat")
if (response.isSuccessful) {
    println(response.body()?.size)
} else {
    Log.e("API", "Xato: ${response.code()}")
}

Retrofit-da konvertorlar va serializatsiya

Konvertorlar — obyektlarni HTTP tanasiga va aksincha o'zgartirish uchun mas'ul bo'lgan Retrofit komponentlaridir. Retrofit serializatsiyani yadroga o'rnatmaydi — buning o'rniga Converter.Factory orqali modulli yondashuv ishlatiladi, istalgan serializatsiya kutubxonasini ulash imkonini beradi.

Eng mashhur konvertor — Google-dan GsonConverterFactory Gson kutubxonasi asosida. Aksariyat loyihalar uchun mos keladi, maxsus TypeAdapter va JsonDeserializer-ni qo'llab-quvvatlaydi. Biroq Gson refeksiyadan foydalanadi va Kotlin-ning null safety-ni hisobga olmaydi, bu kutilmagan null maydonlarida NPE-ga olib kelishi mumkin.

Muqobil — Square-dan MoshiConverterFactory: turlarga nisbatan qattiqroq, Kotlin-ni yaxshiroq qo'llab-quvvatlaydi (null safety, default values) va refeksiyasiz. Sof Kotlin loyihalari uchun optimal — kompilyatsiya bosqichida @Serializable annotatsiyalarida ishlaydigan Kotlinx Serialization Converter. Refeksiyadan foydalanmaydi, sealed class, default values va multiplatformani qo'llab-quvvatlaydi.

Konvertor tanlovi ishlash va xavfsizlikka ta'sir qiladi. Gson maxsus konfiguratsiyasiz null-ni Kotlin-ning non-null maydoniga deserializatsiyalashi mumkin, murojaatda NPE-ga sabab bo'ladi. Moshi bu muammoni @Json(name) annotatsiyasi va failOnUnknown orqali hal qiladi. Kotlinx Serialization eng xavfsiz — kompilyatsiya bosqichida kod yaratadi, runtime tip xatolarini butunlay istisno qiladi.

Retrofit bilan ishlashda odatiy xatolar

HTTP xatolarini qayta ishlamaslik suspend funksiyalarida — eng keng tarqalgan muammo. Agar server 4xx yoki 5xx qaytarsa, Retrofit HttpException tashlaydi. Try-catchsiz ilova ishdan chiqadi. Qaytarish turi sifatida Response<T> ishlatish bu muammoni hal qiladi, body-ga kirishdan oldin isSuccessful-ni tekshirish imkonini beradi.

Keshni noto'g'ri sozlash ortiqcha trafikka olib keladi. Retrofit javoblarni o'zi keshlaydi — bu vazifani OkHttpClient Cache orqali hal qiladi. Keshsiz har bir so'rov to'liq bajariladi, hatto ma'lumot o'zgarmagan bo'lsa ham. OkHttpClient-da 10 MB hajmdagi Cache qo'shish takroriy so'rovlarda trafikni 40–60% kamaytiradi.

Har bir so'rov uchun Retrofit yaratish — yangi boshlovchilarning keng tarqalgan xatosi. Retrofit.Builder runtime-da proksi-sinflar generatsiyasini o'z ichiga olgan resurs talab qiladigan operatsiyadir. To'g'ri amaliyot — bitta Retrofit namunasi yaratish va uni DI frameworklari orqali qayta ishlatishdir. Hilt, Koin yoki Dagger butun ilova uchun Retrofit-ning singleton namunasini ta'minlaydi, bu xotirani tejaydi va so'rovlarni tezlashtiradi.

Avtorizatsiya uchun Interceptor-ni e'tiborsiz qoldirish — to'rtinchi muammo. Har bir chaqiruvda Authorization sarlavhasini qo'lda qo'shish o'rniga OkHttpClient-da global Interceptor sozlang. Interceptor har bir so'rovni tutib oladi, Bearer token qo'shadi, Authenticator esa 401 javobini qayta ishlaydi, tokenni yangilab so'rovni avtomatik takrorlaydi. Bu autentifikatsiya mantiqini markazlashtiradi.

Tez-tez beriladigan savollar

Retrofit OkHttp-dan nimasi bilan farq qiladi?

Retrofit — annotatsiyalar orqali deklarativ API ta'minlovchi OkHttp ustidagi qo'shimcha. OkHttp — to'g'ridan-to'g'ri Request va Response bilan ishlaydigan past darajadagi HTTP-klienti. Retrofit OkHttp-ni transport sifatida ishlatib, tipizatsiyani, serializatsiyani va javoblarni qayta ishlashni soddalashtiradi.

Retrofit uchun qaysi konvertorni tanlash kerak?

Java loyihalari uchun — GsonConverterFactory. Moshi bilan Kotlin uchun — MoshiConverterFactory (turlar bo'yicha xavfsizroq). Sof Kotlin uchun optimal tanlov — Kotlinx Serialization Converter. Refeksiyasiz ishlaydi, sealed class va default values-ni qo'llab-quvvatlaydi.

Retrofit korutinlarni qo'llab-quvvatlaydimi?

Ha, 2.6.0 versiyasidan boshlab Retrofit suspend funksiyalarini qo'llab-quvvatlaydi. Metodni suspend deb e'lon qiling va Retrofit so'rovni Dispatchers.IO-da bajaradi, natijani korutinga qaytaradi. Call va enqueue ishlatish shart emas — kod ketma-ket bo'ladi.

Retrofit-da avtorizatsiyani qanday sozlash kerak?

Avtorizatsiya OkHttp Interceptor orqali qo'shiladi. Intercept() metodida Authorization sarlavhasini qo'shing. Dinamik token uchun OkHttp Authenticator-dan foydalaning — u 401 javobini tutib oladi va avtomatik tokenni yangilab, so'rovni yangi sarlavha bilan takrorlaydi.

Retrofit-ni OkHttp-siz ishlatish mumkinmi?

Mumkin emas — Retrofit har doim OkHttp-ni transport qatlami sifatida ishlatadi. OkHttpClient Builder.client() orqali uzatiladi va taymoutlar, interceptorlar, keshlash va ulanishlar hovuzini boshqaradi. OkHttp-siz Retrofit hech qanday so'rovni bajara olmaydi.

Xulosa

  • Retrofit — Square-dan Android va Kotlin uchun deklarativ annotatsiya API bilan tiplangan HTTP-klienti
  • Annotatsiyalar @GET, @POST, @Path, @Query va @Body REST so'rovlarini boilerplate kodsiz tasvirlaydi
  • Dinamik proksilar Java interfeys metod chaqiruvlarini runtime-da HTTP so'rovlariga aylantiradi
  • Konvertorlar Gson, Moshi va Kotlinx Serialization JSON-ni obyektlarga serializatsiyasini ta'minlaydi
  • OkHttp — interceptorlar, keshlash va ulanishlar hovuzi bilan majburiy transport qatlami
  • Suspend funksiyalari asinxron HTTP chaqiruvlarini Kotlin korutinlari bilan integratsiyalaydi
  • Response o'rami 4xx va 5xx HTTP xatolarini boshqarilmagan istisnolarsiz qayta ishlaydi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing