Какие HTTP-клиенты для Dart/Flutter ты знаешь?

Ответ

В экосистеме Dart/Flutter есть несколько популярных HTTP-клиентов, каждый со своими сильными сторонами:

  1. package:http (официальный):

    • Плюсы: Простой, надежный, поддерживается командой Dart. Идеален для базовых запросов.
    • Минусы: Минималистичный, требует ручного написания boilerplate-кода для сложных сценариев.
      
      import 'package:http/http.dart' as http;

    var response = await http.get( Uri.parse('https://jsonplaceholder.typicode.com/posts/1'), ); if (response.statusCode == 200) { print('Response body: ${response.body}'); }

  2. dio:

    • Плюсы: Мощный клиент с поддержкой перехватчиков (Interceptors), глобальной конфигурации, FormData, отмены запросов (CancelToken), таймаутов, загрузки файлов с прогрессом.
    • Минусы: Больше зависимостей по сравнению с package:http.
      
      import 'package:dio/dio.dart';

    var dio = Dio(); // Глобальная настройка dio.options.connectTimeout = Duration(seconds: 5);

    // Запрос с перехватчиком для логирования dio.interceptors.add(LogInterceptor()); var response = await dio.get('/test?id=12&name=dio');

  3. chopper / retrofit:

    • Плюсы: Используют кодогенерацию для создания типизированного API-клиента на основе аннотаций, что сильно сокращает шаблонный код и повышает безопасность типов. Retrofit построен поверх dio.
    • Минусы: Требуют настройки кодогенерации (build_runner).

Выбор: Для большинства проектов я начинаю с dio из-за его богатой функциональности. Для простых задач или если важен минимальный размер приложения — package:http. Для больших проектов со строгим API-контрактом рассматриваю retrofit.

Ответ 18+ 🔞

А, ну это же классика, ёпта! Сидишь такой, пишешь приложение, и тут бац — надо на сервер сходить данные подтянуть. И тут начинается: а каким клиентом, блядь, пользоваться? Выбор, как в магазине — глаза разбегаются, а взять хочется всё и сразу, но нельзя.

Вот смотри, есть у нас несколько вариантов, и у каждого свой характер, прямо как люди.

Первый чувак — package:http (официальный). Это как старый, проверенный друг. Не подведёт, простой, как три копейки. Поддерживается самой командой Dart, что уже доверия ебать ноль, но в хорошем смысле. Идеален, если тебе надо просто ткнуть в сервер и получить ответ, без всяких выкрутасов. Но минус в том, что он минималистичный до безобразия. Хочешь что-то посложнее — готовься писать кучу своего, однотипного кода, который надоедает уже на втором запросе. Скучно, бля.

import 'package:http/http.dart' as http;

var response = await http.get(
  Uri.parse('https://jsonplaceholder.typicode.com/posts/1'),
);
if (response.statusCode == 200) {
  print('Response body: ${response.body}');
}

Второй персонаж — dio. Вот это уже не просто друг, а целый арсенал. Этот парень пришёл со всем своим барахлом: перехватчики (Interceptors), глобальные настройки, FormData, отмена запросов, таймауты, загрузка файлов с прогресс-баром — овердохуища возможностей! Хочешь логировать каждый чих? Легко. Нужно глобально таймаут выставить? Пожалуйста. Правда, за такую крутость приходится платить: зависимостей у него побольше, чем у скромного http. Но оно того стоит, если проект не игрушечный.

import 'package:dio/dio.dart';

var dio = Dio();
// Настроил один раз и забыл
dio.options.connectTimeout = Duration(seconds: 5);

// Подключил перехватчик, чтобы видеть, что творится
dio.interceptors.add(LogInterceptor());
var response = await dio.get('/test?id=12&name=dio');

Третья категория — chopper и retrofit. Это уже не просто клиенты, это целая философия, блядь. Эти ребята используют кодогенерацию. То есть ты не пишешь запросы руками, как обезьяна. Ты описываешь API аннотациями — какой эндпоинт, какие параметры — а они тебе генерируют красивый, типизированный клиент. Retrofit, кстати, часто поверх dio строится, так что мощь dio остаётся. Плюс — безопасность типов и ноль boilerplate-кода. Минус — надо заморачиваться с настройкой build_runner, что иногда само по себе приключение. Но для большого, серьёзного проекта с кучей методов — это просто песня.

Так какого хуя выбирать? Лично я, если проект не на один вечер, почти всегда стартую с dio. Удобно, функционально, проблем с ним обычно не возникает. Если задача — наколотить прототип за пять минут и размер апки критичен — беру официальный http, он не подведёт. Ну а если вижу, что предстоит работать с огромным, строгим API и писать тонны однотипных методов — сразу смотрю в сторону retrofit, чтобы не ебать себе мозги потом. Выбор за тобой, чувак.