← Назад к вопросам
Что такое interceptor?
1.7 Middle🔥 192 комментариев
#Архитектура Flutter#Работа с сетью
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Interceptor в Flutter — перехватчик HTTP запросов
Interceptor — это паттерн для перехвата и обработки HTTP запросов и ответов перед тем, как они достигнут целевого обработчика. В Flutter это чаще всего используется с библиотекой dio для работы с API.
Основная концепция
Interceptor позволяет:
- Добавить заголовки (авторизацию, токены, custom headers)
- Логировать запросы и ответы для дебага
- Обработать ошибки единообразно
- Переиспользовать код для общей логики
- Трансформировать данные перед отправкой или после получения
Использование с Dio
import 'package:dio/dio.dart';
final dio = Dio();
// Добавляем interceptor
dio.interceptors.add(LoggingInterceptor());
Создание собственного interceptor
class AuthInterceptor extends Interceptor {
final String token;
AuthInterceptor({required this.token});
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
// Добавляем токен к каждому запросу
options.headers['Authorization'] = 'Bearer $token';
return handler.next(options);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
// Обработка успешного ответа
print('Status: ${response.statusCode}');
return handler.next(response);
}
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
// Обработка ошибок
if (err.response?.statusCode == 401) {
print('Unauthorized - refresh token');
}
return handler.next(err);
}
}
Логирование с LoggingInterceptor
class LoggingInterceptor extends Interceptor {
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
print('REQUEST: ${options.method} ${options.path}');
print('Headers: ${options.headers}');
print('Body: ${options.data}');
return handler.next(options);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
print('RESPONSE: ${response.statusCode}');
print('Body: ${response.data}');
return handler.next(response);
}
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
print('ERROR: ${err.message}');
return handler.next(err);
}
}
Практический пример с несколькими interceptors
class ApiClient {
late final Dio _dio;
ApiClient({required String token}) {
_dio = Dio();
// Добавляем несколько interceptors
_dio.interceptors.add(LoggingInterceptor());
_dio.interceptors.add(AuthInterceptor(token: token));
_dio.interceptors.add(RetryInterceptor());
}
Future<Response> get(String path) => _dio.get(path);
}
Типичные использования
- Авторизация — добавление JWT токена
- Логирование — отслеживание всех запросов
- Обработка ошибок — единая обработка 401, 500 и т.д.
- Retry логика — автоматический повтор при сбое
- Преобразование данных — сериализация/десериализация
Порядок выполнения
Interceptors выполняются в порядке добавления:
- Request → Interceptor 1 → Interceptor 2 → ... → HTTP запрос
- HTTP ответ → ... → Interceptor 2 → Interceptor 1 → Response
Interceptor — это ключевой паттерн для написания чистого и масштабируемого кода при работе с API в Flutter.