Dio: bu nima, Flutter uchun HTTP-klientining xususiyatlari

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

Dio — Dart va Flutter uchun kuchli HTTP-klient bo'lib, xitoylik muhandis Venda Vang tomonidan yaratilgan. Kutubxona tutib oluvchilar, FormData, fayllarni yuklash va so'rovlarni bekor qilishni qo'llab-quvvatlovchi ilg'or API-ni taqdim etadi. pub.dev, 2025 ma'lumotlariga ko'ra, Dio Flutter ekotizimidagi eng mashhur HTTP-klient bo'lib, GitHub'da 8 mingdan ortiq yulduzga ega.

Asosiy

  • Dio — Dart va Flutter uchun tutib oluvchilar va transformatorlar bilan kuchli HTTP-klient
  • Interceptorlar — so'rovlar, javoblar va xatolarni qayd qilish va avtorizatsiya uchun tutib olish mexanizmi
  • FormData — fayllarni yuklash uchun multipart/form-data ni ichki qo'llab-quvvatlash
  • So'rovlarni bekor qilish — CancelToken istalgan vaqtda bajarilayotgan so'rovlarni to'xtatishga imkon beradi
  • Transformatorlar — yuborishdan oldin va qabul qilgandan keyin ma'lumotlarni maxsus o'zgartirish

Dio nima?

Dio — Dart tili uchun kuchli HTTP-klient kutubxonasi bo'lib, Flutter ilovalarida eng keng qo'llaniladi. Dio tutib oluvchilar, global konfiguratsiya, transformatorlar, FormData, fayllarni yuklash va moslashuvchan vaqt chegaralarini boshqarishni qo'llab-quvvatlovchi boy API-ni taqdim etadi, bu uni Flutter jamoasida tarmoq aloqasi uchun asosiy tanlovga aylantiradi.

Kutubxona Venda Vang tomonidan 2018-yilda o'rnatilgan dart:io HttpClient-ga muqobil sifatida yaratilgan, chunki unda zamonaviy imkoniyatlar yo'q edi: barcha so'rovlar uchun yagona konfiguratsiya, tutib oluvchilar va avtomatik serializatsiya. 2025-yilga kelib, Dio mashhurlik bo'yicha Dart jamoasining http paketini ortda qoldirib, pub.dev ma'lumotlariga ko'ra Flutter ekotizimidagi HTTP-klientlar orasida birinchi o'rinni egalladi.

Dio uchta adapterni qo'llab-quvvatlaydi: DartNativeAdapter (Android, iOS, Desktop-da standart), BrowserAdapter (Web-da) va IOAdapter. Adapter platformaga qarab avtomatik tanlanadi. Dio shuningdek barcha Flutter platformalari — Android, iOS, Web, macOS, Windows va Linux — uchun yagona interfeysni taqdim etadi.

Dio qanday ishlaydi

Dio arxitekturasi ishlov beruvchilar zanjiriga (handler chain) asoslangan. Har bir so'rov so'rovni (InterceptorsWrapper.onRequest), javobni (onResponse) o'zgartira oladigan yoki xatoni (onError) boshqara oladigan interceptorlar ketma-ketligidan o'tadi. Interceptorlardan keyin so'rov yuborishdan oldin ma'lumotlarni o'zgartiruvchi transformatorlarga (Transformer) keladi.

Dio namunasi BaseOptions obyekti orqali konfiguratsiya qilinadi, u asosiy URL, standart sarlavhalar, vaqt chegaralari, javob turi (JSON, stream, plain), so'rov parametrlari va ma'lumot formatini o'z ichiga oladi. Ushbu sozlamalar barcha so'rovlarga qo'llaniladi, lekin ma'lum bir so'rovda o'zgartirilishi mumkin. BaseOptions butun ilova uchun yagona konfiguratsiya nuqtasini ta'minlaydi, bu API endpointini o'zgartirish yoki global sarlavhalarni qo'shishni soddalashtiradi.

Dio-dagi har bir so'rov Response<T> qaytaradi, bu erda T — transformatorlar tomonidan qayta ishlanganidan keyin ma'lumot turi. Standart bo'yicha Dio avtomatik ravishda JSON javobini Map<String, dynamic> ga aylantiradi. Tiplangan javoblar uchun Dio serializatsiya paketlari bilan birga ishlatiladi: json_serializable, freezed yoki built_value. Response data, headers, statusCode, requestOptions va qo'shimcha ma'lumotlarni o'z ichiga oladi.

Dio-ning global konfiguratsiyasi

Asosiy konfiguratsiya Dio(BaseOptions) orqali yaratiladi. Barcha so'rovlar uchun baseUrl, connectTimeout va receiveTimeout, content-type va accept sarlavhalari, shuningdek queryParameters o'rnatilishi mumkin. Ushbu parametrlarning barchasi har bir so'rovga qo'llaniladi, bu kod takrorlanishini yo'q qiladi va tarmoq sozlamalarini boshqarishni markazlashtiradi.

Dio ikki serializatsiya rejimini qo'llab-quvvatlaydi: standart JSON (responseType: ResponseType.json) va oqim (ResponseType.stream). Oqim rejimida Response.data qismlarga bo'lib o'qilishi mumkin bo'lgan ResponseBody-ni qaytaradi. Bu katta yuk fayllari uchun qulay, to'liq xotiraga yuklash istalmaganda. Plain rejimi avtomatik JSON parsingsiz xom satrni qaytaradi.

Dio interceptorlari

Interceptorlar — Dio-ning so'rovlar, javoblar va xatolarni tutib olish va o'zgartirish uchun asosiy mexanizmi. Ular OkHttp-dagi Interceptor va Ktor-dagi plaginlarni to'liq almashtiradi, lekin Dart-spesifik API va Future orqali asinxron qo'llab-quvvatlash bilan. Interceptorlar ham Dio-ning global konfiguratsiyasida, ham alohida so'rovlar uchun qo'shilishi mumkin.

Interceptor metodiMaqsadFoydalanish misoli
onRequestSo'rovni yuborishdan oldin o'zgartirishAvtorizatsiya tokenini qo'shish
onResponseMuvaffaqiyatli javobni qayta ishlashMa'lumotlarni DTO obyektlariga aylantirish
onErrorSo'rov xatosini qayta ishlash503 da avtomatik qayta urinish

LogInterceptor

O'rnatilgan LogInterceptor har bir so'rovni qayd qiladi: metod, URL, sarlavhalar, mazmun va bajarilish vaqti. U ikki rejimga ega: compact (so'rov boshiga bir qator) va full (mazmun bilan to'liq ma'lumot). LogInterceptor ayniqsa rivojlanish vaqtida foydali, lekin uni shartli import yoki global bayroq orqali release versiyalarida o'chirish tavsiya etiladi.

Maxsus interceptorlar InterceptorsWrapper sinfi orqali yaratiladi. Bir, ikki yoki uchala metodni (onRequest, onResponse, onError) bekor qilish mumkin. Dio interceptorlarni ularning interceptors ro'yxatiga qo'shilish tartibida qat'iy bajaradi. Agar interceptor handler.next() ni chaqirmasa, zanjir uziladi va javob/xato ilovaga etib bormaydi.

Dio-da avtorizatsiya uchun Authorization sarlavhasiga Bearer token qo'shadigan interceptor ishlatiladi. Agar server 401 qaytarsa, interceptor onError-da refresh so'rovi orqali tokenni yangilashga harakat qiladi va asl so'rovni yangi token bilan takrorlaydi. Ushbu naqsh token refresh interceptor deb ataladi va response?.statusCode == 401 tekshiruvi bilan DioException orqali amalga oshiriladi.

Dio qayta urinish mantig'ini ichki qo'llab-quvvatlashni dio_smart_retry paketi yoki maxsus RetryInterceptor orqali taqdim etadi. Qayta urinish mobil ilovalar uchun muhim: 2–3 soniya aloqa uzilishida Dio connectionTimeout yoki connectionError turi bilan DioException tashlaydi. RetryInterceptor bu istisnoni tutib oladi va so'rovni eksponensial kechikish bilan (1s, 2s, 4s) 3 martagacha takrorlaydi, bu beqaror tarmoq sharoitida ilova ishonchliligini oshiradi.

Dart-da Dio kod misollari

Asosiy GET so'rovini Dio orqali ko'rib chiqamiz. BaseOptions bilan namuna yaratiladi, asosiy URL va vaqt chegaralari o'rnatiladi. So'rov get() metodi orqali bajariladi, Map formatida ma'lumotlar bilan Response qaytaradi.

dart
final dio = Dio(BaseOptions(
    baseUrl: 'https://api.github.com',
    connectTimeout: Duration(seconds: 15),
    receiveTimeout: Duration(seconds: 15),
    headers: {
        'Accept': 'application/vnd.github.v3+json',
    },
))

final response = await dio.get('/users/octocat')
print(response.data['kirish'])

JSON mazmunli POST so'rovi uchun Map obyekti yoki maxsus DTO uzatiladi. Dio avtomatik ravishda Map-ni jsonEncode orqali JSON-ga serializatsiya qiladi. Tiplangan DTO uchun queryParameters opsiyasi, data maydoni yoki maxsus Transformer ishlatiladi.

dart
final data = {
    'name': 'my-project',
    'description': 'Created via Dio',
    'private': false,
}

final response = await dio.post(
    '/user/repos',
    data: data,
    options: Options(
        contentType: ContentType.json.value,
    ),
)

print(response.data['id'])

Avtorizatsiya interceptorini qo'shish

Maxsus interceptor har bir so'rovga Bearer token qo'shadi. onRequest metodi yuborishdan oldin ishlaydi, sarlavhalarni o'zgartiradi. 401 javobida interceptor tokenni yangilab, dio.fetch(requestOptions) metodi orqali so'rovni takrorlashi mumkin.

dart
class AuthInterceptor extends InterceptorsWrapper {
    final String token

    AuthInterceptor(this.token)

    @override
    void onRequest(
        RequestOptions options,
        RequestInterceptorHandler handler,
    ) {
        options.headers['Authorization'] = 'Bearer $token'
        handler.next(options)
    }
}

dio.interceptors.add(AuthInterceptor('ghp_abc123'))

Dio orqali fayllarni yuklash va yuklab olish

Dio soddalashtiradi fayllarni FormData orqali yuklashni. Fayl yuborish uchun File, Bytes yoki AssetBundle-dan MultipartFile yaratiladi. FormData avtomatik ravishda to'g'ri chegara va kodlash bilan multipart/form-data sarlavhasini o'rnatadi. Dio onSendProgress orqali yuklash jarayonini qo'llab-quvvatlaydi.

Fayllarni yuklab olish uchun download() metodi ishlatiladi, u ma'lumot oqimini to'g'ridan-to'g'ri faylga saqlaydi. Dio uzilgan yuklab olishlarni davom ettirishni (resume) Range sarlavhasi orqali qo'llab-quvvatlaydi, bu ayniqsa katta fayllar uchun foydali. Yuklab olish jarayoni onReceiveProgress orqali kuzatiladi, UI-da yuklash chizig'ini ko'rsatishga imkon beradi.

dart
final formData = FormData.fromMap({
    'file': await MultipartFile.fromFile(
        '/path/to/photo.jpg',
        filename: 'photo.jpg',
    ),
    'description': 'Profile photo',
})

await dio.post(
    '/upload',
    data: formData,
    onSendProgress: (sent, total) {
        final progress = sent / total * 100
        print('Yuklash: $progress%')
    },
)

// Faylni yuklab olish
await dio.download(
    'https://example.com/file.zip',
    '/storage/emulated/0/Download/file.zip',
    onReceiveProgress: (received, total) {
        print('Yuklab olish: ${received / total * 100}%')
    },
)

Dio bilan ishlashda odatiy xatolar

Xatolarni noto'g'ri qayta ishlash — eng keng tarqalgan muammo. Dio har qanday muammoda DioException (ilgari DioError) tashlaydi: tarmoq yo'qligi, vaqt chegarasi, HTTP 4xx/5xx xatolari. Ko'pgina dasturchilar faqat umumiy Exception-ni tutib, xato turi va uni maxsus qayta ishlash imkoniyati haqidagi ma'lumotni yo'qotadilar. DioException.type dan nosozlik sababini aniqlash uchun foydalaning.

CancelToken-ni e'tiborsiz qoldirish so'rov oqishiga olib keladi. Agar foydalanuvchi ekranni tark etsa, lekin so'rov bajarilishda davom etsa, Dio resurslarni sarflaydi va yo'q qilingan State-ni yangilashga urinishi mumkin. Har doim har bir so'rov uchun CancelToken yarating va uni dispose()-da bekor qiling. CancelToken bekor qilish turi bilan DioException yaratadi, uni to'g'ri boshqarish kerak.

Vaqtinchalik nosozliklar uchun qayta urinish mantig'ining yo'qligi. Mobil qurilmalarda tarmoq ko'pincha qisqa muddatga mavjud bo'lmaydi. Vaqt chegarasi yoki 503/502 javobida avtomatik qayta urinadigan interceptor-ni amalga oshiring. dio_smart_retry paketidan RetryInterceptor foydalaning yoki urinishlar orasida eksponensial kechikish bilan maxsus interceptor yozing.

Tez-tez so'raladigan savollar

Dio Dart-ning http paketidan nima bilan farq qiladi?

Dio interceptorlar, BaseOptions global konfiguratsiyasi, FormData, yuklash jarayoni va CancelToken-ni ta'minlaydi. Dart jamoasining http paketi — minimalist, interceptorlar va global konfiguratsiyasiz. Dio katta loyihalarda, http esa oddiy skriptlarda ishlatiladi.

Dio-da JSON-ni qanday serializatsiya qilish kerak?

Dio standart bo'yicha JSON-ni jsonDecode orqali Map-ga aylantiradi. Tiplangan serializatsiya uchun json_serializable yoki freezed paketlaridan foydalaning. onResponse-da response.data-ni fromJson() orqali DTO-ga aylantiradigan maxsus interceptor yarating.

Dio-da so'rovni qanday bekor qilish kerak?

CancelToken yarating va uni so'rov opsiyalariga o'tkazing. token.cancel() chaqiruvi so'rovni to'xtatadi va bekor qilish turi bilan DioException yaratadi. CancelToken bir vaqtning o'zida bir nechta so'rovni bekor qilishni qo'llab-quvvatlaydi, bu ekrandan chiqishda barcha so'rovlarni bekor qilish uchun qulay.

Dio Flutter-ning barcha platformalarida ishlaydimi?

Ha, Dio Flutter-ning olti platformasida ishlaydi: Android, iOS, Web, macOS, Windows va Linux. Har bir platforma uchun moslashuvchan HTTP-klient ishlatiladi: DartNativeAdapter (native platformalar) va BrowserAdapter (Web). Barcha platformalar uchun yagona API — Dio-ning Flutter loyihalaridagi asosiy ustunligi.

Dio cookie-ni qanday boshqaradi?

Dio cookie-ni avtomatik boshqarmaydi. Cookie qo'llab-quvvatlash uchun dio_cookie_manager paketi cookie_jar bilan birga ishlatiladi. CookieManager Set-Cookie va Cookie sarlavhalarini tutib oladi va cookie-larni bir xil domenga keyingi so'rovlarda avtomatik yuborish uchun PersistCookieJar da saqlaydi.

Xulosa

  • Dio — Flutter-da interceptorlar va transformatorlar bilan eng mashhur HTTP-klient
  • Interceptorlar onRequest, onResponse va onError so'rov va javoblarni o'zgartiradi
  • FormData va MultipartFile fayllarni serverga yuklashni soddalashtiradi
  • CancelToken xotira oqishini oldini olish uchun so'rovlarni to'g'ri bekor qiladi
  • BaseOptions URL, sarlavhalar va vaqt chegaralari konfiguratsiyasini markazlashtiradi
  • DioException nosozliklarni batafsil qayta ishlash uchun xato turini o'z ichiga oladi
  • Jarayon onSendProgress va onReceiveProgress yuklash holatini ko'rsatadi

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