Flutter网络请求拦截插件basic_http_interceptor的使用

Flutter网络请求拦截插件basic_http_interceptor的使用

特性

  • HTTP日志拦截器
  • HTTP头部拦截器
  • HTTP请求/响应钩子
  • HTTP代理

开始使用

在你的 pubspec.yaml 文件中添加 basic_http_interceptor 包:

dart pub add basic_http_interceptor

使用示例

以下是一个完整的示例,展示了如何使用 basic_http_interceptor 插件来拦截HTTP请求。

示例代码

import 'dart:io';
import 'package:logging/logging.dart';
import 'package:http_interceptor/http_interceptor.dart';
import 'package:basic_http_interceptor/basic_http_interceptor.dart';

void main() async {
  // 设置日志级别
  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((record) {
    print('${record.time}: [${record.level}] [${record.loggerName}] ${record.message}');
  });

  // 创建一个日志记录器
  final logger = Logger('main');

  // 定义JWT令牌
  final jwt = '';
  final requestHeader = {
    'Authorization': 'Bearer $jwt',
  };

  // 定义拦截器列表
  final List<InterceptorContract> interceptors = [
    // 日志拦截器,输出请求和响应信息
    InterceptorLogger(logger, true),
    // 添加自定义头部拦截器
    InterceptorHeader(requestHeader: requestHeader),
  ];

  // 定义代理配置
  final proxy = {
    'no_proxy': 'localhost,127.0.0.1,::1',
    'https_proxy': 'https://127.0.0.1:7890/',
    'http_proxy': 'http://127.0.0.1:7890/',
    'all_proxy': 'socks5://127.0.0.1:7891/',
  };

  // 创建拦截后的客户端
  final interClient = interceptedClient(
    interceptors: interceptors,
    proxy: proxy,
  );

  // 构建URL
  final url = buildUrlString(
    'https://www.google.com',
    {'q': 'hello world'},
  );

  // 发送GET请求
  final uri = Uri.parse(url);
  interClient.get(uri).then((Response response) {
    logger.info('--- response ---');
    logger.info(response.request?.method);
    logger.info(response.request?.url.toString());
    logger.info(response.statusCode);
  }).catchError((error) {
    logger.severe('--- error ---');
    logger.severe(error.toString());
  });
}

// 辅助函数,用于构建带有参数的URL
String buildUrlString(String baseUrl, Map<String, String>? params) {
  if (params == null || params.isEmpty) {
    return baseUrl;
  }
  return '$baseUrl?${Uri(queryParameters: params).query}';
}

额外信息

HTTP头部拦截器

你可以通过添加 InterceptorHeader 拦截器来设置HTTP头部信息。例如:

final jwt = '';
final requestHeader = {
  'Authorization': 'Bearer $jwt',
};

final List<InterceptorContract> interceptors = [
  InterceptorHeader(requestHeader: requestHeader),
];

final interClient = interceptedClient(
  interceptors: interceptors,
);

HTTP代理

你可以通过配置代理选项来设置HTTP代理。例如:

final List<InterceptorContract> interceptors = [];

final proxy = {
  'no_proxy': 'localhost,127.0.0.1,::1',
  'https_proxy': 'https://127.0.0.1:7890/',
  'http_proxy': 'http://127.0.0.1:7890/',
  'all_proxy': 'socks5://127.0.0.1:7891/',
};

final interClient = interceptedClient(
  interceptors: interceptors,
  proxy: proxy,
);

HTTP钩子

你还可以通过添加 InterceptorHook 来处理请求和响应。例如:

BaseRequest requestHandle(BaseRequest request) {
  // 处理HTTP头部
  final header = request.headers;
  header.addAll({
    'appkey': '',
    'appid': '',
  });

  // 处理URL参数
  final url = request.url;
  url.addParameters({
    'timestamp': DateTime.now().microsecondsSinceEpoch.toString(),
  });

  final req = request.copyWith(
    headers: header,
    url: url,
  );

  return req;
}

BaseResponse responseHandle(BaseResponse response) {
  return response;
}

final interceptorHook = InterceptorHook(
  requestHook: requestHandle,
  responseHook: responseHandle,
);

final List<InterceptorContract> interceptors = [
  interceptorHook,
];

final interClient = interceptedClient(
  interceptors: interceptors,
);

更多关于Flutter网络请求拦截插件basic_http_interceptor的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络请求拦截插件basic_http_interceptor的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


basic_http_interceptor 是一个用于 Flutter 的网络请求拦截插件,它可以帮助你在应用程序中拦截和修改 HTTP 请求和响应。通过使用这个插件,你可以在请求发送之前或响应到达之后执行一些自定义操作,例如添加请求头、修改请求体、记录日志等。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 basic_http_interceptor 依赖:

dependencies:
  flutter:
    sdk: flutter
  basic_http_interceptor: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

使用 basic_http_interceptor

1. 创建拦截器

你可以通过继承 HttpInterceptor 类来创建自定义的拦截器。例如,创建一个简单的拦截器来记录请求和响应:

import 'package:basic_http_interceptor/basic_http_interceptor.dart';

class LoggingInterceptor extends HttpInterceptor {
  [@override](/user/override)
  Future<BaseRequest> onRequest(BaseRequest request) async {
    print('Request: ${request.method} ${request.url}');
    print('Headers: ${request.headers}');
    return request;
  }

  [@override](/user/override)
  Future<BaseResponse> onResponse(BaseResponse response) async {
    print('Response: ${response.statusCode} ${response.body}');
    return response;
  }
}

2. 使用拦截器

你可以将拦截器添加到 HttpClient 中,然后使用 HttpClient 发送请求:

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

void main() async {
  final client = BasicHttpClient(
    interceptors: [LoggingInterceptor()],
  );

  final response = await client.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

  print('Final Response: ${response.body}');
}

3. 多个拦截器

你可以添加多个拦截器,它们将按照添加的顺序依次执行:

final client = BasicHttpClient(
  interceptors: [
    LoggingInterceptor(),
    AnotherInterceptor(),
  ],
);

4. 修改请求和响应

你可以在 onRequestonResponse 方法中修改请求和响应。例如,添加一个自定义的请求头:

class AuthInterceptor extends HttpInterceptor {
  [@override](/user/override)
  Future<BaseRequest> onRequest(BaseRequest request) async {
    request.headers['Authorization'] = 'Bearer YOUR_TOKEN';
    return request;
  }
}

示例代码

以下是一个完整的示例,展示了如何使用 basic_http_interceptor 来拦截和修改 HTTP 请求和响应:

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

class LoggingInterceptor extends HttpInterceptor {
  [@override](/user/override)
  Future<BaseRequest> onRequest(BaseRequest request) async {
    print('Request: ${request.method} ${request.url}');
    print('Headers: ${request.headers}');
    return request;
  }

  [@override](/user/override)
  Future<BaseResponse> onResponse(BaseResponse response) async {
    print('Response: ${response.statusCode} ${response.body}');
    return response;
  }
}

class AuthInterceptor extends HttpInterceptor {
  [@override](/user/override)
  Future<BaseRequest> onRequest(BaseRequest request) async {
    request.headers['Authorization'] = 'Bearer YOUR_TOKEN';
    return request;
  }
}

void main() async {
  final client = BasicHttpClient(
    interceptors: [
      LoggingInterceptor(),
      AuthInterceptor(),
    ],
  );

  final response = await client.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));

  print('Final Response: ${response.body}');
}
回到顶部