flutter - Flutter 中的通用 CRUD Http 函数
问题描述
我想让基本的 http crud 函数在我的颤振应用程序中通用。整个事情应该是这样的:
class HttpGenericClient {
static Future<T> create<T>(String path, {required T data}) async {
final Map<String, dynamic> parsedData = data.toJson();
final Response<Map<String, dynamic>> response = await httpClient.post<Map<String, dynamic>>(path, data: data);
final T preparedData = T.fromJson(response.data);
return preparedData;
}
}
HttpGenericClient.create<User>('/users', user);
我正在使用创建 fromJson 和 toJson 方法的 json_serializable 包。问题是我不能在 T 型上调用它们。有谁知道如何最好地解决这个问题?
此外,如果您必须在每次调用时都给出路径,我认为这不是很好。这里没有更好的解决方案,我可以以某种方式定义模型中的路径并访问它吗?
解决方案
有很多方法可以做到这一点,例如,您可以将 HTTP 调用作为方法添加到模型类。在以下示例中,有一个简单的MyObject
类和一个create
可以调用以在数据库中创建的方法。
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:io';
class MyObject {
int? id;
String name;
MyObject({required this.name}) : super();
MyObject.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'];
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
};
Future<bool> create() async {
try {
final response = await http.post(Uri.https(<YOUR_API_BASE_URL>, '/myobject'),
headers: {'authorization': <YOUR_AUTH_TOKEN>}, // if needed
body: jsonEncode(<String, dynamic>{
'data': this.toJson(),
}));
if (response.statusCode == 200) {
// let's say you get back id of the created record
// in "data" tag
id = jsonDecode(response.body)["data"];
return true;
} else {
// handler errors
return false;
}
} on SocketException {
// do something when there is a network error
return false;
}
}
}
之后,您可以创建一个新实例并像这样保存它:
final myObject = MyObject(name: 'SomeNewName');
if (!await myObject.create()) {
// handle errors
}
如果成功,您将拥有新数据myObject
,包括id
从POST
调用返回的数据。这只是一个示例,请根据您的逻辑进行调整。
推荐阅读
- eslint - ESlint 说一个变量未使用,但我认为它正在被使用
- html - IE10+ FullScreen.js 不在全屏模式下滚动
- angularjs - react-google-maps 中当前位置的蓝点
- google-cloud-firestore - Firestore 投诉 Hipaa
- spring-security - 如何使用 keycloak 保护 Spring Cloud 数据流服务器?
- sql - 查找两列重复记录的唯一记录
- javascript - 在 Angular 项目中添加自定义脚本的最佳方式(Materialize 示例)
- javascript - 如何在数组中的字符串之间插入单词?
- python - 如何用另一个数组调用数组中的特定元素?
- python - 具有类变量继承的子类