Flutter网络请求插件morpheme_http的使用
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
更多关于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
来安装依赖。
基本用法
- 导入插件
在你的Dart文件中导入morpheme_http
:
import 'package:morpheme_http/morpheme_http.dart';
- 配置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));
}
- 发送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'),
),
),
),
);
}
}
- 发送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'),
)
- 处理更多类型的请求
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方法、处理请求和响应的不同格式等。记得在正式项目中管理好网络请求的生命周期,特别是在处理异步操作时,以避免内存泄漏和其他潜在问题。