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);
}
}
代码解释
-
创建日志拦截器:
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请求:
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); } }
-
关闭客户端:
client.close(); print('Client closed gratefully.');
更多关于Flutter网络请求插件http_client_hoc081098的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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
还支持 POST
、PUT
、DELETE
等其他请求方法。以下是一个 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();