使用xmlrpc2包整合R与Odoo时嵌套列表报错的解决问询
R与Odoo XML-RPC整合问题解决
不用手动编写XML-RPC调用体的简便方案
直接使用专门为Odoo设计的R客户端包odooR,它已经封装了所有XML-RPC的底层调用逻辑,完全不用自己拼接请求体:
- 先安装包(需要依赖
devtools):
devtools::install_github("abresler/odooR")
- 初始化Odoo连接:
library(odooR) odoo_conn <- odoo_setup( url = "http://你的Odoo服务器地址", db = "你的数据库名", username = "登录账号", password = "登录密码" )
- 直接调用
search_read获取数据:
model_data <- odoo_search_read( odoo = odoo_conn, model = "ir.model", fields = c("id", "model", "name") )
全程无需处理XML-RPC的请求构造和响应解析,直接拿到结构化结果。
坚持使用xmlrpc2包的修正方法
针对你遇到的两个错误,调整参数构造方式即可解决:
- 第一个错误
TypeError: execute() argument after ** must be a mapping, not list:Odoo的execute_kw要求search_read的最后一个参数是键值对映射(字典),而非普通列表; - 第二个错误
Error in list_to_array(unname(x)) : nested lists are not supported!:xmlrpc2处理嵌套列表时,需要用xmlrpc_data包装嵌套结构,明确这是映射类型而非普通列表。
修正后的代码:
library(xmlrpc2) library(httr) # 替换为你的实际参数 db <- "你的数据库名" uid <- "你的用户ID" # 可通过common.authenticate接口获取 password <- "你的密码" odoo_object_url <- "http://你的Odoo服务器地址/xmlrpc/2/object" # 正确构造execute_kw的参数 rpc_body <- to_xmlrpc( method = "execute_kw", params = list( db, uid, password, "ir.model", "search_read", list(), # 空domain表示查询所有记录 xmlrpc_data(list(fields = c("id", "model", "name"))) # 用xmlrpc_data包装映射参数 ) ) # 发送请求并解析结果 response <- POST(odoo_object_url, body = rpc_body, content_type_xml()) result <- from_xmlrpc(content(response, as = "text"))
内容的提问来源于stack exchange,提问作者Abdu Kikhia
相关产品推荐
相关产品推荐

