如何在Java中使用XML-RPC协议登出到OpenERP服务器



我正在与Eclipse的Android应用程序工作,该应用程序使用XML-RPC协议与OpenERP服务器连接。我的问题是如何登出到服务器,或者如果它是不必要的。

我试过用与"login"方法相同的方式来做,但它不起作用。我抓住了

java.lang.ClassCastException (java.lang.String cannot be cast to java.lang.Integer)

at client.execute() line.

这是完整的堆栈:

07-17 10:18:42.271: E/Conector OpenERP(19595):  Error while logging out
07-17 10:18:42.271: E/Conector OpenERP(19595):  java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.parser.XmlRpcResponseParser.addResult(XmlRpcResponseParser.java:55)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.parser.RecursiveTypeParserImpl.endValueTag(RecursiveTypeParserImpl.java:71)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.parser.XmlRpcResponseParser.endElement(XmlRpcResponseParser.java:164)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.harmony.xml.ExpatParser.endElement(ExpatParser.java:156)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.harmony.xml.ExpatParser.appendBytes(Native Method)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:513)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:474)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:316)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:279)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:172)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:149)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:95)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:39)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:53)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:166)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:136)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:125)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at com.example.nfcreader.JavaOpenerpConnector.disconnect(JavaOpenerpConnector.java:459)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at com.example.nfcreader.MainActivity$ReadDBTask.doInBackground(MainActivity.java:1198)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at com.example.nfcreader.MainActivity$ReadDBTask.doInBackground(MainActivity.java:1)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-17 10:18:42.271: E/Conector OpenERP(19595):  at java.lang.Thread.run(Thread.java:841)  

我在网上搜索,但我没有找到任何关于如何实现这个"登出"方法。我认为问题是在client.execute()方法中发送的参数。

下面是我的代码:
public void disconnect() {
    try{
        XmlRpcClient client = new XmlRpcClient();
        XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
        config.setServerURL(new URL("http",host,port,"/xmlrpc/common"));
        client.setConfig(config);
        Object result = client.execute("logout", new Object[] {database,user,password});
    }catch(MalformedURLException ex){
        Log.e(TAG, "Wrong URL", ex);
    }catch (XmlRpcException ex){
        Log.e(TAG, "Error XML-RPC", ex);
    }catch (Exception ex) {
        Log.e(TAG, "Error while logging out", ex);          
    }
    return;
}

"login"方法的代码运行成功,与上面的代码相同,只是将"logout"改为"login"。

谢谢你的建议!

我在PHP中使用XML-RPC, login()方法验证用户凭据并返回用户ID。

对后续方法的每次调用都需要用户ID和密码—似乎不需要实际上登录—它只是在那里验证用户凭据。我找不到任何关于这方面的文档,但似乎XML-RPC API是无状态的-没有必要登录和注销。

然而,有一个通过API可用的会话接口,但不清楚它是否与XML-RPC有任何用途。logout()可能与会话交互,以将经过身份验证的用户连接/删除到会话。会话ID是UUID字符串。

抱歉,如果这是有点模糊;我所发现的大部分都是试错,因为文档不幸地跳过了任何重要的点。

最新更新