Flutter网络请求插件http_client_hoc081098的使用

Flutter网络请求插件http_client_hoc081098的使用

http_client_hoc081098 是一个简单且强大的HTTP客户端插件,适用于Flutter和Dart应用。该插件提供了多种功能,包括重试机制、请求和响应拦截器等。

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  http_client_hoc081098: ^版本号

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

使用示例

以下是一个完整的示例,展示了如何使用 http_client_hoc081098 进行网络请求。

import 'dart:io';

import 'package:http_client_hoc081098/http_client_hoc081098.dart';
import 'package:http/retry.dart' as http_retry;

void main() async {
  // 创建一个简单的日志拦截器
  final loggingInterceptor = SimpleLoggingInterceptor(
    SimpleLogger(
      level: SimpleLogLevel.body,
      headersToRedact: {
        HttpHeaders.authorizationHeader,
      },
    ),
  );

  // 创建一个重试客户端
  final innerClient = http_retry.RetryClient(
    http.Client(),
    retries: 3,
    when: (response) {
      print(
          '[RetryClient] Checking response: request=${response.request} statusCode=${response.statusCode}');
      print('-' * 128);
      return response.statusCode == HttpStatus.unauthorized;
    },
    onRetry: (request, response, retryCount) async {
      print(
          '[RetryClient] Retrying request: request=$request, response=$response, retryCount=$retryCount');
      // 模拟刷新令牌
      await Future<void>.delayed(const Duration(seconds: 1));
      print('-' * 128);
    },
  );

  // 创建一个简单的HTTP客户端
  final client = SimpleHttpClient(
    client: innerClient,
    timeout: const Duration(seconds: 10),
    requestInterceptors: [
      (request) async {
        print('[requestInterceptors] request=$request');
        await Future<void>.delayed(const Duration(milliseconds: 100));

        final token = 'hoc081098';
        request.headers[HttpHeaders.authorizationHeader] = 'Bearer $token';

        return request;
      },
      loggingInterceptor.requestInterceptor,
    ],
    responseInterceptors: [
      loggingInterceptor.responseInterceptor,
    ],
  );

  // 执行GET请求示例
  await getExample(client);
  print('-' * 128);

  // 执行单个GET请求示例
  await getSingleExample(client);
  print('-' * 128);

  // 执行POST请求示例
  await postExample(client);
  print('-' * 128);

  // 关闭客户端
  client.close();
  print('Client closed gratefully.');
}

// GET请求示例
Future<void> getExample(SimpleHttpClient client) async {
  final cancelToken = CancellationToken();
  final uri = Uri.parse('https://jsonplaceholder.typicode.com/users/1');

  () async {
    await Future<void>.delayed(const Duration(milliseconds: 300));
    cancelToken.cancel();
    print('Cancelling...');
  }()
      .ignore();

  try {
    final json = await client.getJson(
      uri,
      headers: {},
      cancelToken: cancelToken,
    ) as Map<String, dynamic>;
    print(json);
  } catch (e) {
    print(e);
  }
}

// 单个GET请求示例
Future<void> getSingleExample(SimpleHttpClient client) async {
  final single = useCancellationToken<dynamic>(
    (cancelToken) => client.getJson(
      Uri.parse('https://jsonplaceholder.typicode.com/users/2'),
      headers: {},
      cancelToken: cancelToken,
    ),
  ).cast<Map<String, dynamic>>().map(User.fromJson);
  final subscription = single.listen(print, onError: print);

  () async {
    await Future<void>.delayed(const Duration(milliseconds: 120));
    await subscription.cancel();
    print('Cancelling single...');
  }()
      .ignore();

  await Future<void>.delayed(const Duration(seconds: 1));
}

// POST请求示例
Future<void> postExample(SimpleHttpClient client) async {
  try {
    final json = await client.postJson(
      Uri.parse('https://jsonplaceholder.typicode.com/users'),
      body: {
        'name': 'hoc081098',
        'username': 'hoc081098',
        'email': 'hoc081098@gmail.com',
      },
    ) as Map<String, dynamic>;
    print(json);
  } catch (e) {
    print(e);
  }
}

代码解释

  1. 创建日志拦截器

    final loggingInterceptor = SimpleLoggingInterceptor(
      SimpleLogger(
        level: SimpleLogLevel.body,
        headersToRedact: {
          HttpHeaders.authorizationHeader,
        },
      ),
    );
    
  2. 创建重试客户端

    final innerClient = http_retry.RetryClient(
      http.Client(),
      retries: 3,
      when: (response) {
        print('[RetryClient] Checking response: request=${response.request} statusCode=${response.statusCode}');
        print('-' * 128);
        return response.statusCode == HttpStatus.unauthorized;
      },
      onRetry: (request, response, retryCount) async {
        print('[RetryClient] Retrying request: request=$request, response=$response, retryCount=$retryCount');
        await Future<void>.delayed(const Duration(seconds: 1));
        print('-' * 128);
      },
    );
    
  3. 创建HTTP客户端

    final client = SimpleHttpClient(
      client: innerClient,
      timeout: const Duration(seconds: 10),
      requestInterceptors: [
        (request) async {
          print('[requestInterceptors] request=$request');
          await Future<void>.delayed(const Duration(milliseconds: 100));
          final token = 'hoc081098';
          request.headers[HttpHeaders.authorizationHeader] = 'Bearer $token';
          return request;
        },
        loggingInterceptor.requestInterceptor,
      ],
      responseInterceptors: [
        loggingInterceptor.responseInterceptor,
      ],
    );
    
  4. 执行GET请求

    Future<void> getExample(SimpleHttpClient client) async {
      final cancelToken = CancellationToken();
      final uri = Uri.parse('https://jsonplaceholder.typicode.com/users/1');
    
      () async {
        await Future<void>.delayed(const Duration(milliseconds: 300));
        cancelToken.cancel();
        print('Cancelling...');
      }()
          .ignore();
    
      try {
        final json = await client.getJson(
          uri,
          headers: {},
          cancelToken: cancelToken,
        ) as Map<String, dynamic>;
        print(json);
      } catch (e) {
        print(e);
      }
    }
    
  5. 执行单个GET请求

    Future<void> getSingleExample(SimpleHttpClient client) async {
      final single = useCancellationToken<dynamic>(
        (cancelToken) => client.getJson(
          Uri.parse('https://jsonplaceholder.typicode.com/users/2'),
          headers: {},
          cancelToken: cancelToken,
        ),
      ).cast<Map<String, dynamic>>().map(User.fromJson);
      final subscription = single.listen(print, onError: print);
    
      () async {
        await Future<void>.delayed(const Duration(milliseconds: 120));
        await subscription.cancel();
        print('Cancelling single...');
      }()
          .ignore();
    
      await Future<void>.delayed(const Duration(seconds: 1));
    }
    
  6. 执行POST请求

    Future<void> postExample(SimpleHttpClient client) async {
      try {
        final json = await client.postJson(
          Uri.parse('https://jsonplaceholder.typicode.com/users'),
          body: {
            'name': 'hoc081098',
            'username': 'hoc081098',
            'email': 'hoc081098@gmail.com',
          },
        ) as Map<String, dynamic>;
        print(json);
      } catch (e) {
        print(e);
      }
    }
    
  7. 关闭客户端

    client.close();
    print('Client closed gratefully.');
    

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

1 回复

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


http_client_hoc081098 是一个用于Flutter的网络请求插件,它基于Dart的 http 包,并提供了更高的可扩展性和灵活性。使用这个插件,你可以轻松地进行网络请求,并且可以自定义拦截器、转换器等。

1. 安装插件

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

dependencies:
  flutter:
    sdk: flutter
  http_client_hoc081098: ^1.0.0  # 请确保使用最新版本

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

2. 基本用法

使用 http_client_hoc081098 进行网络请求非常简单。以下是一个基本的GET请求示例:

import 'package:http_client_hoc081098/http_client_hoc081098.dart';

void main() async {
  final client = HttpClient();

  try {
    final response = await client.get('https://jsonplaceholder.typicode.com/posts/1');
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  } finally {
    client.close();
  }
}

3. 添加拦截器

http_client_hoc081098 允许你添加拦截器来进行请求或响应的预处理。以下是一个添加拦截器的示例:

import 'package:http_client_hoc081098/http_client_hoc081098.dart';

void main() async {
  final client = HttpClient(
    interceptors: [
      // 添加请求拦截器
      (request) async {
        print('Request: ${request.method} ${request.url}');
        return request;
      },
      // 添加响应拦截器
      (response) async {
        print('Response: ${response.statusCode}');
        return response;
      },
    ],
  );

  try {
    final response = await client.get('https://jsonplaceholder.typicode.com/posts/1');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  } finally {
    client.close();
  }
}

4. 自定义转换器

你可以通过自定义转换器来处理响应数据。以下是一个将JSON响应转换为Dart对象的示例:

import 'package:http_client_hoc081098/http_client_hoc081098.dart';

class Post {
  final int userId;
  final int id;
  final String title;
  final String body;

  Post({required this.userId, required this.id, required this.title, required this.body});

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      userId: json['userId'],
      id: json['id'],
      title: json['title'],
      body: json['body'],
    );
  }
}

void main() async {
  final client = HttpClient(
    responseConverters: [
      // 自定义转换器
      (response) async {
        final json = response.body as Map<String, dynamic>;
        return Post.fromJson(json);
      },
    ],
  );

  try {
    final post = await client.get('https://jsonplaceholder.typicode.com/posts/1');
    print('Post title: ${post.title}');
  } catch (e) {
    print('Error: $e');
  } finally {
    client.close();
  }
}

5. 其他请求方法

除了 GET 请求,http_client_hoc081098 还支持 POSTPUTDELETE 等其他请求方法。以下是一个 POST 请求的示例:

import 'package:http_client_hoc081098/http_client_hoc081098.dart';

void main() async {
  final client = HttpClient();

  try {
    final response = await client.post(
      'https://jsonplaceholder.typicode.com/posts',
      body: {
        'title': 'foo',
        'body': 'bar',
        'userId': 1,
      },
    );
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
  } catch (e) {
    print('Error: $e');
  } finally {
    client.close();
  }
}

6. 关闭客户端

在使用完 HttpClient 后,记得调用 close() 方法来释放资源。

client.close();
回到顶部