Flutter网络请求增强插件sturdy_http的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter网络请求增强插件sturdy_http的使用

SturdyHttp

pub package Build status License: MIT Maintenance

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

1 回复

更多关于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请求,以及如何配置客户端和处理取消请求。你可以根据你的具体需求进一步自定义这些代码。

回到顶部