Flutter网络请求插件morpheme_http的使用

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

Flutter网络请求插件morpheme_http的使用

morpheme_http 是一个基于 http 库的Flutter网络请求插件,提供了更高级的功能如自动处理Token、刷新Token等。本文将介绍如何使用该插件进行网络请求。

依赖安装

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

dependencies:
  morpheme_http: ^latest_version
  get_it: ^7.0.0
  flutter_secure_storage: ^6.0.0
  morpheme_inspector: ^latest_version

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

初始化MorphemeHttp

我们需要先初始化 MorphemeHttp 并将其注册到服务定位器(Service Locator)中。这里我们使用 get_it 插件来管理服务定位器。

import 'package:get_it/get_it.dart';
import 'package:morpheme_http/morpheme_http.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

final locator = GetIt.instance;

void setupLocator() {
  locator.registerLazySingleton(
    () => MorphemeHttp(
      timeout: 30000,
      showLog: true,
      morphemeInspector: locator(),
      authTokenOption: AuthTokenOption(
        typeHeader: 'Authorization',
        prefixHeader: 'Bearer',
        getToken: () => locator<FlutterSecureStorage>().read(key: 'token'),
        authCondition: (request, response) =>
            request.url == MorphemeEndpoints.login,
        onAuthTokenResponse: (response) async {
          final map = jsonDecode(response.body);
          await locator<FlutterSecureStorage>().write(
            key: 'token',
            value: map['token'],
          );
          await locator<FlutterSecureStorage>().write(
            key: 'refresh_token',
            value: map['refresh_token'],
          );
        },
        clearCondition: (request, response) =>
            request.url == MorphemeEndpoints.logout,
        onClearToken: () =>
            locator<FlutterSecureStorage>().delete(key: 'token'),
        excludeEndpointUsageToken: [
          MorphemeEndpoints.login,
          MorphemeEndpoints.register,
        ],
      ),
      refreshTokenOption: RefreshTokenOption(
        method: RefreshTokenMethod.post,
        url: MorphemeEndpoints.refreshToken,
        condition: (request, response) =>
            request.url != MorphemeEndpoints.login && response.statusCode == 401,
        getBody: () async {
          final refreshToken =
              await locator<FlutterSecureStorage>().read(key: 'refresh_token');

          return {
            'refresh_token': refreshToken ?? '',
          };
        },
        onResponse: (response) async {
          // handle response refresh token
          final map = jsonDecode(response.body);
          locator<FlutterSecureStorage>().write(
            key: 'token',
            value: map['token'],
          );
        },
      ),
    ),
  );

  locator.registerLazySingleton(
    () => MorphemeInspector(
      showNotification: true, // default true
      showInspectorOnShake: true, // default true
      saveInspectorToLocal: true, // default true
      notificationIcon: '@mipmap/ic_launcher', // default '@mipmap/ic_launcher' just for android
    ),
  );
}

在应用启动时调用 setupLocator() 方法完成初始化。

基本请求方法

GET 请求

final http = locator<MorphemeHttp>();

try {
  final response = await http.get(Uri.parse('https://api.morpheme.id'));
  print(response.body);
} catch (e) {
  print(e.toString());
}

POST 请求

final http = locator<MorphemeHttp>();

try {
  final response = await http.post(
    Uri.parse('https://reqres.in/api/login'),
    body: {"email": "eve.holt@reqres.in", "password": "cityslicka"},
  );
  print(response.body);
} on MorphemeException catch (e) {
  final failure = e.toMorphemeFailure();
  print(failure.toString());
} catch (e) {
  print(e.toString());
}

PUT 请求

final http = locator<MorphemeHttp>();

try {
  final response = await http.put(
    Uri.parse('https://api.morpheme.id/update'),
    body: {"key": "value"},
  );
  print(response.body);
} catch (e) {
  print(e.toString());
}

DELETE 请求

final http = locator<MorphemeHttp>();

try {
  final response = await http.delete(
    Uri.parse('https://api.morpheme.id/delete'),
    body: {"key": "value"},
  );
  print(response.body);
} catch (e) {
  print(e.toString());
}

Multipart POST 请求

final http = locator<MorphemeHttp>();
final File file = getImage();

try {
  final response = await http.postMultipart(
    Uri.parse('https://api.morpheme.id/upload'),
    files: {'image': file},
    body: {"key": "value"},
  );
  print(response.body);
} catch (e) {
  print(e.toString());
}

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

1 回复

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


当然,关于Flutter网络请求插件morpheme_http的使用,下面是一个详细的代码案例来展示其基本用法。

首先,确保你的Flutter项目中已经添加了morpheme_http依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  morpheme_http: ^x.y.z  # 请将x.y.z替换为最新版本号

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

基本用法

  1. 导入插件

在你的Dart文件中导入morpheme_http

import 'package:morpheme_http/morpheme_http.dart';
  1. 配置MorphemeHttpClient

通常,你会希望配置一个全局的MorphemeHttpClient实例来管理你的网络请求。你可以在应用的入口文件(比如main.dart)中完成这个配置:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 配置MorphemeHttpClient
  final client = MorphemeHttpClient(
    baseURL: 'https://api.example.com', // 你的API基础URL
    timeout: const Duration(seconds: 30), // 请求超时时间
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
      // 其他全局headers
    },
  );

  // 你可以将client实例存储在一个全局变量中,以便在其他地方使用
  // 例如,通过依赖注入(dependency injection)的方式

  runApp(MyApp(client: client));
}
  1. 发送GET请求
class MyApp extends StatelessWidget {
  final MorphemeHttpClient client;

  MyApp({required this.client});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('MorphemeHttp Example')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              try {
                final response = await client.get('/endpoint');
                if (response.statusCode == 200) {
                  final data = response.data;
                  // 处理响应数据
                  print(data);
                } else {
                  // 处理错误状态码
                  print('Error: ${response.statusCode}');
                }
              } catch (e) {
                // 处理请求异常
                print('Exception: $e');
              }
            },
            child: Text('Send GET Request'),
          ),
        ),
      ),
    );
  }
}
  1. 发送POST请求
ElevatedButton(
  onPressed: () async {
    try {
      final body = {
        'key1': 'value1',
        'key2': 'value2',
      };
      final response = await client.post('/endpoint', data: body);
      if (response.statusCode == 200) {
        final data = response.data;
        // 处理响应数据
        print(data);
      } else {
        // 处理错误状态码
        print('Error: ${response.statusCode}');
      }
    } catch (e) {
      // 处理请求异常
      print('Exception: $e');
    }
  },
  child: Text('Send POST Request'),
)
  1. 处理更多类型的请求

morpheme_http插件还支持PUT、DELETE等HTTP方法,使用方式与GET和POST类似:

// PUT请求示例
final responsePut = await client.put('/endpoint', data: body);

// DELETE请求示例
final responseDelete = await client.delete('/endpoint');

总结

上述代码展示了如何在Flutter项目中使用morpheme_http插件来发送网络请求。你可以根据实际需要扩展这些示例,比如添加更多的错误处理、使用不同的HTTP方法、处理请求和响应的不同格式等。记得在正式项目中管理好网络请求的生命周期,特别是在处理异步操作时,以避免内存泄漏和其他潜在问题。

回到顶部