我目前正在为坚持将 Odoo 用于 API 的客户开发一个 android 应用程序。我对此一无所知。即使在引用此链接后我也没有得到它。他们提供了一个 URL、数据库名称、用户名, 和密码。如果有人以前在 Android 上做过 Odoo,你能给点建议吗?
3 回答
有很多方法可以将 Android 连接到 Odoo。他们来了:
- json-RPC
- XML-RPC(尤其是aXMLRPC,这是我正在使用的)
- 还有一个名为Odoo Mobile Framework的框架。我已经尝试过了,但发现了很多问题,我无法让它正常工作。您可以在此处找到文档。
Odoo 有一个可用于 Python、Ruby、PHP 和 Java的Web 服务 API 。我强烈建议看看。
就我而言,我克隆了 aXMLRPC git 存储库,在我的项目中创建了一个包并修改了原始包名。但最近我在 Stack Overflow 上发现了这个,解释了如何使用 Gradle 将 aXMLRPC 添加到您的 Android 项目中(我还没有尝试过)。
Odoo 提供了三个端点:
xmlrpc/2/db
要获取服务器上可用数据库的列表,不需要进行身份验证;xmlrpc/2/common
登录服务器,无需认证;xmlrpc/2/object
, 用于通过execute_kw
RPC 函数调用 odoo 模型的方法。public class OdooConnect { String url; private XMLRPCClient client; public OdooConnect(String serverAddress, String path) { url = serverAddress + "/xmlrpc/2/" + path; client = new XMLRPCClient(url); } public Object login(String db, String username, String password) { Object object; try { object = client.call("login", db, username, password); return object; } catch (XMLRPCException e) { e.printStackTrace(); } return null; } public Object checkServer() { Object object; try { object = client.call("list", new Object[]{}); return object; } catch (XMLRPCException e) { e.printStackTrace(); } return null; } }
在这个类中,构造函数作为参数的服务器地址(它可以是http(s)://your_ip_address:the_port_number
)和path ('db', 'common' or 'object')
.
checkServer 方法返回一个对象,该对象实际上是一个包含可用数据库列表的数组。
登录方法返回一个整数,它是经过身份验证的用户的 Id。
对于 Odoo CRUD 方法(search_read、search_count、search、write、create、unlink),您可以查看与您想要的方法匹配的 Odoo Web Service API Java 代码。
这是 search_read 方法的示例。我假设您有一个名为 client 的 XMLRPCClient。
public Object search_read(String db, int user_id, String password, String object, List conditions, Map<String, List> fields) {
Object result = null;
try {
result = client.call("execute_kw", db, user_id, password, object, "search_read", conditions, fields);
} catch (XMLRPCException e) {
e.printStackTrace();
}
return result;
}
在哪里
- 例如,对象是一个 Odoo 模型
"res.partner"
- 条件是这样的域(过滤器):
Collections.singletonList(Collections.singletonList(Arrays.asList("supplier", "=", true)));
字段,你想得到的字段,
fields = new HashMap() {{put("fields", Arrays.asList("id","name","is_company","street")); }};
您必须将该方法的结果转换为 Object[] ,这将为您提供一个数组,其中包含一个对象列表,每个对象代表一条记录。
Object[] objects = (Object[]) result;
if (objects.length > 0) {
for (Object object : objects) {
String name= OdooUtil.getString((Map<String, Object>) object, "name");
boolean is_company= OdooUtil.getBoolean((Map<String, Object>) object, "is_company");
String street = OdooUtil.getString((Map<String, Object>) object, "street");
int id= OdooUtil.getInteger((Map<String, Object>) object, "id");
}
}
这里是 OdooUtil 类
public class OdooUtil {
public static String getString(Map<String, Object> map, String fieldName) {
String res = "";
if (map.get(fieldName) instanceof String) {
res = (String) map.get(fieldName);
}
return res;
}
public static Integer getInteger(Map<String, Object> map, String fieldName) {
Integer res = 0;
if (map.get(fieldName) instanceof Integer) {
res = (Integer) map.get(fieldName);
}
return res;
}
public static Double getDouble(Map<String, Object> map, String fieldName) {
Double res = 0.0;
if (map.get(fieldName) instanceof Double) {
res = (Double) map.get(fieldName);
}
return res;
}
public static Boolean getBoolean(Map<String, Object> map, String fieldName) {
Boolean res = false;
if (map.get(fieldName) instanceof Boolean) {
res = (Boolean) map.get(fieldName);
}
return res;
}
public static Float getFloat(Map<String, Object> map, String fieldName) {
Float res = 0f;
if (map.get(fieldName) instanceof Float) {
res = (Float) map.get(fieldName);
}
return res;
}
}
如果您有一个 many2one 字段,您只能访问相关记录的 id 和名称。您可以使用以下类来获取 many2one 记录的 id 和名称。
public class Many2One {
private int id;
private String name;
public Many2One() {
}
public static Many2One getMany2One(Map<String, Object> stringObjectMap, String fieldName) {
Integer fieldId = 0;
String fieldValue = "";
Many2One res = new Many2One();
if (stringObjectMap.get(fieldName) instanceof Object[]) {
Object[] field = (Object[]) stringObjectMap.get(fieldName);
if (field.length > 0) {
fieldId = (Integer) field[0];
fieldValue = (String) field[1];
}
}
res.id = fieldId;
res.name = fieldValue;
return res;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
}
Many2One 类的使用示例
String partner_name= Many2One.getMany2One((Map<String, Object>) object, "partner_id").getName();
int partner_id= Many2One.getMany2One((Map<String, Object>) object, "partner_id").getId();
对于其他剩余的 CRUD 方法,您可以通过阅读Odoo Web Service API 文档轻松找到它们的工作方式。
我希望这能给你一些见解。
这只是一个从 odoo 访问联系人/合作伙伴的示例:
#!/usr/bin/env python
import csv
from xmlrpclib import ServerProxy
SERVER = 'http://localhost:8069'
DATABASE = 'testcompany'
USERNAME = 'admin'
PASSWORD = 'password'
FILE_PATH = 'ODOO_clientsMain2_test.csv'
server = ServerProxy('http://localhost:8069/xmlrpc/common')
user_id = server.login(DATABASE, USERNAME, PASSWORD)
server = ServerProxy('http://localhost:8069/xmlrpc/object')
def search(list, key):
for item in list:
return item[key]
reader = csv.reader(open(FILE_PATH,'rb'))
for row in reader:
#print row
partner_template = {
'name': row[0],
#'company_id': row[1],
}
if row[2] is not None and row[2]<>'':
partner_template.update({'email': row[2]})
if row[5] is not None and row[5]<>'':
partner_template.update({'tin': row[5]})
if row[6] is not None and row[6]<>'':
partner_template.update({'ref': row[6]})
if row[8] is not None and row[8]<>'':
partner_template.update({'phone': row[8]})
if row[9] is not None and row[9]<>'':
partner_template.update({'mobile': row[9]})
print partner_template
partner_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'res.partner', 'create', [partner_template])
#create External ID
external_ids = {
'model': 'res.partner',
'name': row[11],
'res_id': partner_id,
}
external_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'ir.model.data', 'create', [external_ids])
# update related fields
if row[7] is not None and row[7]<>'':
#look up and update payment term
payment_term_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'account.payment.term', 'search_read', [[['name','=',row[7]],['active', '=', True]]],{'fields': ['id'], 'limit': 1})
if payment_term_id is not None:
id = server.execute_kw(DATABASE, user_id, PASSWORD, 'res.partner', 'write', [[partner_id],{'property_payment_term': search(payment_term_id,'id')}])
if row[10] is not None and row[10]<>'':
#look up and update pricelist
pricelist_id = server.execute_kw(DATABASE, user_id, PASSWORD, 'product.pricelist', 'search_read', [[['name','=',row[10]],['active', '=', True]]],{'fields': ['id'], 'limit': 1})
if pricelist_id is not None:
id = server.execute_kw(DATABASE, user_id, PASSWORD, 'res.partner', 'write', [[partner_id],{'property_product_pricelist': search(pricelist_id,'id')}])
如果您是从拉伸创建应用程序并且只需要用于 Odoo 的 Android API,这里是开源 API https://github.com/oogbox/odoo-mobile-api (Odoo android api)
要在 android 中使用,首先将以下依赖项添加到您的应用级别build.gradle
compile 'com.oogbox.api:odoo:1.0.0'
文档:https ://github.com/oogbox/odoo-mobile-api#getting-started
谢谢