Flutter网络请求增强插件sturdy_http的使用
Flutter网络请求增强插件sturdy_http的使用
SturdyHttp
SturdyHttp
是一个基于 Dio
封装的强类型、事件驱动、可靠的HTTP客户端。
Features
SturdyHttp
提供了以下特性:
- 执行实际对象形式的请求(参见
NetworkRequest
) - 请求执行期间的事件通知(参见
SturdyHttpEventListener
) - 使用
Isolate
反序列化以避免阻塞主线程(参见Deserializer
) - 清晰枚举响应类型(参见
NetworkResponse
)
Note 在 Betterment,我们过去一年一直在内部使用
SturdyHttp
。它已经在应用程序中超过200个网络请求调用点上进行了测试,其强烈的风格是这种实验的直接结果。如果有必要,我们总是愿意让它更灵活;请随时开一个Issue来讨论!
Usage
创建实例
在应用程序启动时创建 SturdyHttp
实例:
return SturdyHttp(
baseUrl: '$baseUrl/api/',
eventListener: eventListener,
interceptors: interceptors,
);
执行请求
执行GET请求示例:
Future<Result<MyData>> fetch({required int id}) async {
return _client.execute<Json, MyData>(
GetRequest('/v6/data/${id}'),
onResponse: (r) => r.maybeWhen(
ok: (json) => Result.success(MyData.fromJson),
orElse: () => Result.failure(r),
),
);
}
处理异常
为了更好地处理异常,可以扩展 SturdyHttp
类:
extension SturdyHttpX on SturdyHttp {
Future<Result<M, NetworkError>> executeForResult<R, M extends Object>(
NetworkRequest request, {
required Result<M, NetworkError> Function(NetworkResponse<R> response) onResponse,
}) async {
return Result.fromAsync(
() => execute(
request,
onResponse: onResponse,
),
).match(ok: (o) => o, error: (e) => Result.error(NetworkError.forException(e)));
}
}
Warning 我们正在考虑开源我们的
Result
类型并将其集成到SturdyHttp
中。如果这样做,我们将可能更改execute
的返回类型为Result
,并提供executeUnsafe
作为非Result
(即抛出Exception
)的替代方法。这将是一个破坏性变化。
示例代码
以下是一个完整的示例,展示了如何设置和使用 SturdyHttp
:
import 'package:charlatan/charlatan.dart';
import 'package:sturdy_http/sturdy_http.dart';
void main(List<String> args) async {
// 设置一些假的HTTP响应
final charlatan = Charlatan()
..whenGet(
'/foo',
(request) => CharlatanHttpResponse(
body: 'Hello World!',
),
)
..whenPost(
'/foo',
(request) => CharlatanHttpResponse(statusCode: 204),
);
// 创建客户端
final client = SturdyHttp(
baseUrl: 'api/v1/',
customAdapter: charlatan.toFakeHttpClientAdapter(),
eventListener: ExampleEventListener(),
);
// GET请求。打印 'Hello World!'
await client.execute<Json, void>(
GetRequest('/foo'),
onResponse: (r) {
return switch (r) {
OkResponse(:final response) => print(response),
_ => print('GET /foo failed: $r'),
};
},
);
// POST请求。
// 打印:
// 'mutative request success' <-- 来自 ExampleEventListener
// 'success!'
await client.execute<void, void>(
PostRequest('/foo', data: NetworkRequestBody.empty()),
onResponse: (r) {
return switch (r) {
OkNoContent() => print('success!'),
_ => print('POST /foo failed: $r'),
};
},
);
}
class ExampleEventListener implements SturdyHttpEventListener {
@override
Future<void> onEvent(SturdyHttpEvent event) {
return event.when(
decodingError: (_, __, ___) async => print('decoding error'),
authFailure: (_) async => print('auth failure'),
mutativeRequestSuccess: (_) async => print('mutative request success'),
);
}
}
Contributing
如果您在使用 SturdyHttp
时遇到bug或限制,我们非常希望您能帮助解决这些问题。首先,请 打开一个issue 进行讨论。如果我们认为应该继续进行更改并且您愿意贡献代码,请创建 SturdyHttp
的分支并向主仓库提交PR。
以上就是 SturdyHttp
插件的使用介绍,希望对您有所帮助!
更多关于Flutter网络请求增强插件sturdy_http的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求增强插件sturdy_http的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用sturdy_http
插件进行网络请求的示例代码。sturdy_http
是一个用于增强网络请求功能的Flutter插件,它提供了重试机制、超时配置、请求取消等高级功能。
首先,你需要在你的pubspec.yaml
文件中添加sturdy_http
依赖:
dependencies:
flutter:
sdk: flutter
sturdy_http: ^最新版本号 # 请替换为实际的最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤使用sturdy_http
进行网络请求:
1. 导入包
在你的Dart文件中导入sturdy_http
包:
import 'package:sturdy_http/sturdy_http.dart';
2. 配置SturdyHttpClient
你可以根据需求配置SturdyHttpClient
,例如设置重试次数、超时时间等:
final SturdyHttpClient client = SturdyHttpClient(
baseUrl: 'https://api.example.com', // 你的API基础URL
retryPolicy: RetryPolicy(
maxRetries: 3, // 最大重试次数
retryDelay: Duration(seconds: 2), // 每次重试之间的延迟时间
),
timeout: Duration(seconds: 10), // 请求超时时间
);
3. 发送GET请求
void fetchData() async {
try {
final response = await client.get(
endpoint: '/endpoint', // 你的API端点
queryParams: {
'param1': 'value1',
'param2': 'value2',
},
);
if (response.isSuccessful) {
print('Response data: ${response.data}');
} else {
print('Error: ${response.statusCode}');
}
} catch (e) {
print('An error occurred: $e');
}
}
4. 发送POST请求
void postData() async {
try {
final response = await client.post(
endpoint: '/endpoint',
body: {
'key1': 'value1',
'key2': 'value2',
},
headers: {
'Content-Type': 'application/json',
},
);
if (response.isSuccessful) {
print('Response data: ${response.data}');
} else {
print('Error: ${response.statusCode}');
}
} catch (e) {
print('An error occurred: $e');
}
}
5. 取消请求
你可以使用SturdyHttpClient
提供的取消令牌功能来取消请求:
void cancelableRequest() async {
final cancelToken = CancelToken.source();
try {
final response = await client.get(
endpoint: '/endpoint',
queryParams: {
'param': 'value',
},
cancelToken: cancelToken.token,
);
if (response.isSuccessful) {
print('Response data: ${response.data}');
} else {
print('Error: ${response.statusCode}');
}
} catch (e) {
if (e is SturdyHttpClientCancelError) {
print('Request was canceled.');
} else {
print('An error occurred: $e');
}
} finally {
// 在这里你可以决定是否取消请求
// 例如,根据某些条件在一段时间后取消请求
Future.delayed(Duration(seconds: 5), () {
cancelToken.cancel('Request was manually canceled.');
});
}
}
这个示例展示了如何使用sturdy_http
插件进行基本的GET和POST请求,以及如何配置客户端和处理取消请求。你可以根据你的具体需求进一步自定义这些代码。