我正在与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字符串。
抱歉,如果这是有点模糊;我所发现的大部分都是试错,因为文档不幸地跳过了任何重要的点。