其他分享
首页 > 其他分享> > 有没有人与Android整合ODOO?

有没有人与Android整合ODOO?

作者:互联网

我正在为一个坚持使用Odoo for API的客户开发一个Android应用程序.我对它没有任何一个想法我甚至在提到这个link之后都没有得到它.它们提供了一个URL,数据库名称,用户名和密码.如果以前有人用Android做过Odoo,你能提出任何建议吗?

解决方法:

有很多方法可以将Android连接到Odoo.他们来了:

> Json-RPC
> XML-RPC(特别是aXMLRPC,这就是我正在使用的)
>还有一个名为Odoo Mobile Framework的框架.我已经尝试过,但发现了很多问题而且我无法正常工作.您可以找到文档here.

Odoo有一个Web Service API,可用于Python,Ruby,PHP和Java.我强烈建议你去看看.

对于我的情况,我克隆了aXMLRPC git存储库,在我的项目中创建了一个包并调整了原始包名.但是最近我在Stack Overflow上发现了this,解释了如何使用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)和路径(‘db’,’common’或’object’).

checkServer方法返回一个对象,该对象实际上是一个包含可用数据库列表的数组.

登录mehtod返回一个Integer,它是经过身份验证的用户的Id.

对于Odoo CRUD mehtods(search_read,search_count,search,write,create,unlink),您可以查看与您想要的方法匹配的Odoo Web Service API Java代码.

以下是search_read方法的示例.我假设你有一个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;
}

哪里

> object是一个Odoo模型,例如“res.partner”
> conditions是域(filter),类似于: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 documentation轻松找到它们的工作方式.

我希望这会给你一些见解.

标签:xml-rpc,android,openerp,odoo-mobile
来源: https://codeday.me/bug/20190727/1551220.html