Руководство по использованию Dio, альтернативы пакету http
во Flutter для упрощенного подхода к сетевым запросам и практики чистого кода.
Каждое мобильное приложение должно взаимодействовать с внешним API через Интернет, чтобы предоставлять дополнительные функции, улучшающие взаимодействие с пользователем и расширяющие набор функций приложения. Это может включать аутентификацию, настраиваемую бизнес-логику, загрузку файлов и т. Д.
Большинство разработчиков Flutter используют для этого пакет http
. Хотя это работает, существует более лучший, менее известный пакет под названием Dio.
Dio - это мощный HTTP-клиент для Dart, который поддерживает перехватчики, глобальную конфигурацию, FormData, отмену запроса, загрузку файлов, тайм-аут и т. Д.
Содержание -
- Установка и настройка
- Основные запросы
- FormData и загрузка файлов
- Перехватчики
- Шаблонный проект
1. Установка и настройка
Чтобы добавить Dio в свой проект флаттера, просто добавьте следующую строку в свой pubspec.yaml
файл -
dependencies: dio: ^3.0.9
А затем запустите - flutter pub get
, если ваш редактор кода не получает автоматически зависимости для вас.
Чтобы использовать Dio, просто создайте экземпляр Dio, вызвав конструктор -
import 'package:dio/dio.dart'; Dio dio = new Dio();
2. Основные запросы
Давайте сначала рассмотрим базовые запросы, GET
, POST
, PUT
и DELETE
. Я собираюсь создать отдельные функции для каждого типа запроса, чтобы мы могли повторно использовать их с дополнительными деталями во вспомогательном классе, который мы компилируем в конце этого поста.
void getHTTP(String url) async { try { Response response = await dio.get(url); // Do whatever } on DioError catch (e) { // Do whatever } }
void postHTTP(String url, Map data) async { try { Response response = await dio.post(url, data: data); // Do whatever } on DioError catch (e) { // Do whatever } }
void putHTTP(String url, Map data) async { try { Response response = await dio.put(url, data: data); // Do whatever } on DioError catch (e) { // Do whatever } }
void deleteHTTP(String url) async { try { Response response = await dio.delete(url); // Do whatever } on DioError catch (e) { // Do whatever } }
3. FormData и загрузка файлов
Большинству приложений необходимо отправлять файлы / изображения на сервер как multipart/form-data
, и этого очень легко добиться с помощью Dio благодаря всем классам и методам, доступным в пакете Dio.
// Single File with Additional DataFormData formData = FormData.fromMap({ "name": "Ryan Dsilva", "age": 21, "file": await MultipartFile.fromFile("PATH", filename:"OPTIONAL"), });
// Multiple Files with Additional DataFormData formData = FormData.fromMap({ "name": "Ryan Dsilva", "age": 21, "files": [ await MultipartFile.fromFile("PATH", filename:"OPTIONAL"), MultipartFile.fromFileSync("PATH", filename:"OPTIONAL") ], });
Для всех, кто хочет использовать синхронную версию чтения файла, есть функция
MultipartFile.fromFileSync()
, которую можно использовать без ключевого словаasync
.
Затем этот объект FormData может быть отправлен как полезная нагрузка в POST
и PUT
запросах, как обычно.
ПРЕДОСТЕРЕЖЕНИЯ - при отправке нескольких файлов ключ в formData отправляется как
files[]
, а неfiles
, т.е. квадратные скобки включены. Поэтому, если у вас возникнут проблемы с вашим API, не используйте конструкторfromMap()
для FormData, создайте его самостоятельно. Я потратил немало часов на выяснение этой крошечной детали.
4. Перехватчики
Почти каждый современный API защищен веб-токенами JSON, и практика прикрепления токена авторизации к заголовку сейчас считается стандартной. И Dio, и обычные пакеты http
позволяют добавлять заголовки к запросам, но у Dio есть кое-что более интересное под названием Перехватчики.
Перехватчики - это блоки кода, которые выполняются до ожидаемого действия, то есть перехватывают действие до завершения. Перехватчики можно запускать в 3 местах - onRequest
, onResponse
и onError
.
Перехватчики применяются к каждому запросу, ответу или ошибке, если они настроены, как показано ниже. Некоторые распространенные варианты использования перехватчиков - это авторизация с использованием веб-токенов JSON, анализ JSON и т. Д. Общая структура перехватчиков показана ниже -
dio.interceptors.add(InterceptorsWrapper(
onRequest:(RequestOptions options) async {
// Do something before the request is sent
return options;
},
onResponse:(Response response) async {
// Do something with response data
return response;
},
onError: (DioError e) async {
// Do something with response error
return e;
}
));
В случае присоединения веб-токена JSON перехватчик можно записать следующим образом:
Dio addInterceptors(Dio dio) { return dio ..interceptors.add(InterceptorsWrapper( onRequest: (RequestOptions options) => reqInterceptor(options), onError: (DioError e) async { return e.response.data; }), ); } dynamic reqInterceptor(RequestOptions options) async { // Fetching JWT logic const token = ''; options.headers.addAll({"Authorization": "Bearer: $token"}); return options; }
reqInterceptor()
извлекает JWT из приложения и добавляет его в заголовки запроса.
5. Boilerplate a.k.a Template.
Если вы прошли через все эти разделы, то знаете, что это может привести к появлению большого количества шаблонного кода даже с синтаксическим сахаром, который приносит Dio, и, следовательно, я почувствовал необходимость создания вспомогательного класса, который я мог бы повторно использовать для каждого проекта - подробнее сравнимо с своего рода шаблоном. Этот единственный файл может быть создан в каждом проекте Flutter, и у вас есть настройка Dio, и он готов к работе. Это также помогает сохранить код удобочитаемым и удобочитаемым.
Вот весь вспомогательный класс -
Вот важные разделы файла -
- BaseOptions - это глобальные настройки, которые можно использовать для всех запросов. Такие вещи, как базовый URL-адрес, тип ответа, таймауты и т. Д., Могут быть установлены здесь как глобальные переменные.
- Перехватчики - любые настраиваемые перехватчики, которые должны запускаться перед запросом / ответом / ошибкой. Прикрепить JWT почти не составляет труда для большинства людей и, вероятно, является наиболее распространенным вариантом использования для большинства приложений.
- Методы - стандартные HTTP-методы
GET
,POST
,PUT
иDELETE
, окруженные блокомtry..catch
, который улавливает объектDioError
. Таким образом Dio обертывает любые возникающие ошибки.
Чтобы использовать этот класс, просто создайте объект, а затем вызовите соответствующие методы везде, где вам нужно -
ApiBaseHelper api = ApiBaseHelper(); Response res = api.get('ENDPOINT_URL');
Вот и все! Надеюсь, вы узнали что-то новое и с нетерпением ждете возможности попробовать Дио в своем следующем проекте Flutter. Большое вам спасибо, если вы зашли так далеко. Поделитесь этой статьей, если она вам помогла, и мы будем благодарны за любые отзывы.
Я скоро вернусь с новым контентом! Следуйте за мной на GitHub, чтобы быть в курсе моих последних проектов -
[1] Dio от Flutter China - https://pub.dev/packages/dio