← Назад к вопросам

Что такое 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);
}

Типичные использования

  1. Авторизация — добавление JWT токена
  2. Логирование — отслеживание всех запросов
  3. Обработка ошибок — единая обработка 401, 500 и т.д.
  4. Retry логика — автоматический повтор при сбое
  5. Преобразование данных — сериализация/десериализация

Порядок выполнения

Interceptors выполняются в порядке добавления:

  1. Request → Interceptor 1 → Interceptor 2 → ... → HTTP запрос
  2. HTTP ответ → ... → Interceptor 2 → Interceptor 1 → Response

Interceptor — это ключевой паттерн для написания чистого и масштабируемого кода при работе с API в Flutter.