Flutter与IDEMPIERE集成插件idempiere_rest的使用
Flutter与IDEMPIERE集成插件idempiere_rest的使用
标题
Flutter与IDEMPIERE集成插件idempiere_rest的使用
内容
一个用于简化对IDEMPIERE REST API(https://github.com/bxservice/idempiere-rest)消费的Dart客户端。
特性
此包实现了官方文档中列出的一些API调用(https://wiki.idempiere.org/en/REST_Web_Services)
- 一步登录
- 正常登录
- 请求PO集合
- 请求单个PO ID
- 创建PO
- 删除PO
- 更新PO
- 流程
使用方法
主类是IdempiereClient
,它是一个单例。一旦实例化,必须调用setBaseUrl
方法。
// 实例化单例IDEMPIERE客户端并设置API URL
IdempiereClient().setBaseUrl("https://mundodocafe.brerp.cloud/api/v11");
之后,您可以根据情况选择一步登录或正常登录。
如果已经知道参数(Client, Role, Org, Warehouse, Lang),可以使用一步登录:
IdempiereClient().oneStepLogin("/auth/tokens", "superuser @ brerp.com.br",
"cafe123", "1000000", "1000000")
要创建或更新PO,需要创建一个扩展抽象类ModelBase
的子类,并实现其方法:
import 'package:idempiere_rest/src/model_base.dart';
class MBPartner extends ModelBase {
late String name;
MBPartner(Map<String, dynamic> json) : super(json) {
id = json['id'];
name = json['Name'];
}
[@override](/user/override)
Map<String, dynamic> toJson() {
return {'Name' : name};
}
[@override](/user/override)
MBPartner fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['Name'];
return this;
}
}
然后,我们可以进行PO请求:
// 获取记录
List<MBPartner> records = await IdempiereClient().get<MBPartner>(
"/models/c_bpartner", (json) => MBPartner(json))
// 创建记录
MBPartner newRecord = MBPartner();
IdempiereClient().post<MBPartner>("/models/c_bpartner", newRecord);
// 更新记录
IdempiereClient().put<MBPartner>("/models/c_bpartner", newRecord);
完整示例
包括正常登录和GET请求中的查询选项,请参阅example/idempiere_rest_example.dart
。
贡献
如果您发现任何bug或有任何建议,请随时创建问题或提交pull request。
示例代码
import 'package:idempiere_rest/idempiere_rest.dart';
import 'package:test/test.dart';
void main() async {
// 实例化单例IDEMPIERE客户端并设置API URL
IdempiereClient().setBaseUrl("https://mundodocafe.brerp.cloud/api/v11");
// 第一次令牌请求
LoginResponse login = await IdempiereClient()
.login("/auth/tokens", "superuser @ brerp.com.br", "cafe123");
// 使用第一次客户端ID(仅示例目的)
int clientId = login.clients.first.id!;
List<Role> roles = await IdempiereClient().getRoles(clientId);
// 使用第一个角色ID(仅示例目的)
int roleId = roles.first.id!;
List<Organization> orgs =
await IdempiereClient().getOrganizations(clientId, roleId);
// 使用第一个组织ID(仅示例目的)
int orgId = orgs.first.id!;
List<Warehouse> warehouses =
await IdempiereClient().getWarehouses(clientId, roleId, orgId);
// 使用第一个仓库ID(仅示例目的)
int whId = warehouses.first.id!;
// 初始化会话
IdempiereClient().initSession(
"/auth/tokens", login.token, login.clients.first.id!, roleId,
organizationId: orgId, warehouseId: whId);
FilterBuilder filter = FilterBuilder();
filter
.addFilter('C_BP_Group_ID', Operators.eq, 1000000)
.and()
.addFilter('COF_SituacaoComercial', Operators.eq, 'PA')
.and()
.addFilter('lbr_IE', Operators.contains, '1');
ExpandBuilder expand = ExpandBuilder();
FilterBuilder childFilter = FilterBuilder();
childFilter.addFilter('Name', Operators.contains, 'a');
expand.expand("AD_User",
columnName: ['Name', 'Phone'],
filter: childFilter,
orderBy: ['Name', 'EMail'],
top: 10,
skip: 5);
List<MBPartner> records = await IdempiereClient().get<MBPartner>(
"/models/c_bartner", (json) => MBPartner(json),
filter: filter,
expand: expand,
orderBy: ['COF_SituacaoComercial', 'Name'],
select: ['Name', 'Name2'],
top: 10,
skip: 2,
showsql: true);
print(records);
MBPartner newRecord = MBPartner.newTest(1000000, 'BParner Test');
MBPartner? record =
await IdempiereClient().post<MBPartner>("/models/c_bartner", newRecord);
print(record);
record = await IdempiereClient().getRecord<MBPartner>(
"/models/c_bartner", record.id!, (json) => MBPartner(json));
print(record);
record!.name = 'BPartner Test Put';
MBPartner updatedRecord =
await IdempiereClient().put<MBPartner>("/models/c_bartner", record);
print(updatedRecord);
bool isDeleted =
await IdempiereClient().delete("/models/c_bartner", record.id!);
print(isDeleted);
ProcessSummary ps = await IdempiereClient().runProcess(
"/processes/ad_role_accessupdate",
params: {'AD_Role_ID': 1000000, 'ResetAccess': 'N'});
print(ps.logs);
}
class MBPartner extends ModelBase {
late int cBPGroupId;
late String name;
MBPartner.newTest(this.cBPGroupId, this.name) : super({});
MBPartner(Map<String, dynamic> json) : super(json) {
id = json['id'];
name = json['Name'];
}
[@override](/user/override)
Map<String, dynamic> toJson() {
Map<String, dynamic> data = {};
if (id != null) {
data['id'] = id;
}
data['Name'] = name;
data['C_BP_Group_ID'] = cBPGroupId;
data['AD_Language'] = 'en_US';
return data;
}
[@override](/user/override)
MBPartner fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['Name'];
return this;
}
}
更多关于Flutter与IDEMPIERE集成插件idempiere_rest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter与IDEMPIERE集成插件idempiere_rest的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中集成并使用IDEMPIERE的REST API插件idempiere_rest
的示例代码。这个示例将展示如何设置Flutter项目、配置依赖项、以及如何使用插件来与IDEMPIERE进行交互。
1. 设置Flutter项目
首先,确保你已经安装了Flutter和Dart SDK,并且已经配置好了开发环境。然后,创建一个新的Flutter项目:
flutter create my_idempiere_app
cd my_idempiere_app
2. 添加idempiere_rest
依赖项
打开pubspec.yaml
文件,在dependencies
部分添加idempiere_rest
插件:
dependencies:
flutter:
sdk: flutter
idempiere_rest: ^latest_version # 替换为实际的最新版本号
然后运行flutter pub get
来安装依赖项。
3. 配置IDEMPIERE的API URL
在你的Flutter项目中,你需要在某个地方配置IDEMPIERE的REST API的URL。这通常可以在应用的初始化部分完成。
4. 使用idempiere_rest
插件
下面是一个简单的示例,展示了如何使用idempiere_rest
插件来获取IDEMPIERE中的数据。
import 'package:flutter/material.dart';
import 'package:idempiere_rest/idempiere_rest.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter IDEMPIERE Integration',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: IdempiereScreen(),
);
}
}
class IdempiereScreen extends StatefulWidget {
@override
_IdempiereScreenState createState() => _IdempiereScreenState();
}
class _IdempiereScreenState extends State<IdempiereScreen> {
final IdempiereRestClient idempiereClient = IdempiereRestClient(
baseUrl: 'https://your-idempiere-instance-url/Adempiere/ServletRest', // 替换为你的IDEMPIERE实例的URL
user: 'your-username', // 替换为你的IDEMPIERE用户名
password: 'your-password', // 替换为你的IDEMPIERE密码
);
String _responseData = '';
@override
void initState() {
super.initState();
_fetchData();
}
Future<void> _fetchData() async {
try {
// 假设我们想要获取某个表的数据,比如BPartner(商业伙伴)
final response = await idempiereClient.get('/AD_BPartner', parameters: {
'p_ClientID': '100', // 根据你的IDEMPIERE实例配置调整参数
});
if (response.isSuccessful) {
setState(() {
_responseData = response.body.toString();
});
} else {
setState(() {
_responseData = 'Error: ${response.statusCode}';
});
}
} catch (e) {
setState(() {
_responseData = 'Error: ${e.message}';
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('IDEMPIERE Data'),
),
body: Center(
child: Text(_responseData),
),
);
}
}
5. 运行应用
确保你的IDEMPIERE实例正在运行,并且REST API已经启用。然后,通过以下命令运行你的Flutter应用:
flutter run
这个示例展示了如何使用idempiere_rest
插件来从IDEMPIERE获取数据。根据你的实际需求,你可能需要调整API路径和请求参数。插件的文档和IDEMPIERE的API文档将为你提供更多的细节和选项。