Connect to Odoo REST API Using xml_rpc in Flutter
XML-RPC is a remote procedure call protocol that uses XML to encode the parameters and return values. It is a popular protocol for exchanging data between servers and clients and is used by many programming languages.
Flutter includes a library for making XML-RPC calls, which makes it easy to connect to Odoo servers from your Flutter app.
class OdooClient { String? url; String? db; String? username; String? pass; int? uid; OdooClient(this.url, this.db, this.username, this.pass, this.uid); OdooClient.withUser(User user) { uid = user.id; url = user.url; db = user.database; username = user.username; pass = user.password; } Future<OdooResponse> fetchData(String table, List<dynamic> args, Map<String, Object> params) async { //default params if(!params.containsKey("offset")){ params["offset"] = 0; } if(!params.containsKey("limit")){ params["limit"] = 100; } OdooResponse response = OdooResponse.empty(); await searchRead(table, [args], params).then((items) async { for (var i = 0; i < items.length; i++) { response.jsonData!.add(items[i]); } response.success = ResponseStatus.success; }).onError((error, stackTrace) { response.success = ResponseStatus.failed; response.message = error.toString(); }); return response; } /*Base*/ String? get formattedBaseURL { String fUrl = url!; if (!fUrl.endsWith('/')) { fUrl = fUrl + '/'; } return fUrl; } Uri get commonURL { return Uri.parse(formattedBaseURL! + 'xmlrpc/2/common'); } Uri get objectURL { return Uri.parse(formattedBaseURL! + 'xmlrpc/2/object'); } Future<List<dynamic>> search(String model, List<dynamic> args) async { return await xml_rpc.call(objectURL, 'execute_kw', [db, uid, pass, model, 'search', args]); } Future<List<dynamic>> searchRead(String model, List<dynamic> args, Map<String, Object> params) async { return await xml_rpc.call(objectURL, 'execute_kw', [db, uid, pass, model, 'search_read', args, params]); } Future<dynamic> create(String model, List<dynamic> params) async { return await xml_rpc.call(objectURL, 'execute_kw', [db, uid, pass, model, 'create', params]); } Future<dynamic> write(String model, List<dynamic> params) async { return await xml_rpc.call(objectURL, 'execute_kw', [db, uid, pass, model, 'write', params]); } Future<dynamic> action(String model, String action, List<dynamic> params) async { return await xml_rpc.call(objectURL, 'execute_kw', [db, uid, pass, model, action, params]); } Future<dynamic> authenticate() async { return await xml_rpc.call(commonURL, 'authenticate', [db, username, pass, '']); } Future<dynamic> getFields(String model) async { //Map<String, List<dynamic>> params = {'attributes': ['string', 'help', 'type']}; Map<String, List<dynamic>> params = { 'attributes': ['string'] }; return await xml_rpc.call(objectURL, 'execute_kw', [db, uid, pass, model, 'fields_get', [], params]); } }
class OdooResponse { ResponseStatus? success; String? message; List<dynamic>? jsonData; OdooResponse(this.success, this.message, this.jsonData); OdooResponse.empty() { success = ResponseStatus.failed; message = ""; jsonData = []; } bool get isSuccess => success == ResponseStatus.success; }