Как я могу выйти из системы на сервер OpenERP, используя протокол XML-RPC в Java?

Я работаю в приложении для Android с Eclipse, которое подключается к серверу OpenERP с использованием протокола XML-RPC. У меня вопрос как сделать логаут на сервер или если это не нужно.

Я пытался сделать это так же, как метод «вход», но он не работает. я ловлю

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

в строке client.execute().

Вот полный стек:

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;
}

Код для метода «вход» работает успешно, и он такой же, как и выше, просто заменяет слово «выход из системы» на «вход».

Спасибо за ваши предложения!


person jelogar    schedule 15.07.2014    source источник
comment
Я предполагаю, что строка execute выдает ошибку? Пожалуйста, опубликуйте полную трассировку стека и метод входа.   -  person Christian St.    schedule 15.07.2014
comment
@Christian St. Да, ошибка в строке execute. Я рассмотрел свой вопрос и добавил полную трассировку стека.   -  person jelogar    schedule 17.07.2014
comment
Кажется, что нужно целое число, а не строка logout. Вы уверены, что вам нужно явно выполнить выход из системы, чтобы завершить сеанс? Откуда ваши примеры?   -  person Christian St.    schedule 17.07.2014


Ответы (1)


Я использую XML-RPC с PHP, и метод login() аутентифицирует учетные данные пользователя и возвращает идентификатор пользователя.

Для каждого вызова последующих методов требуется идентификатор пользователя и пароль — кажется, нет необходимости на самом деле входить в систему — это просто для проверки учетных данных пользователя. Я не могу найти никакой документации по этому поводу, но похоже, что XML-RPC API не имеет состояния — нет необходимости входить в систему и выходить из нее.

Однако есть интерфейс сеанса, доступный через API, но неясно, можно ли его использовать с XML-RPC. Вполне возможно, что logout() взаимодействует с сеансом для подключения/удаления аутентифицированного пользователя к сеансу. Идентификатор сеанса представляет собой строку UUID.

Извините, если это немного нечетко; большая часть того, что я узнал, является методом проб и ошибок, поскольку документация, к сожалению, пропускает все важные моменты.

person Jason    schedule 22.07.2014
comment
Я согласен с тобой @Jason. После поиска информации я пришел к выводу, что метод входа просто возвращает идентификатор пользователя, например, для администратора «1». Для других пользователей OpenERP это будет другое положительное целое число. Поэтому нет необходимости выходить из системы, так как сервер OpenERP не выполняет ее (и генерирует исключение ClassCastException). Метод входа используется только для поиска идентификатора текущего пользователя OpenERP, поскольку его необходимо затем использовать в других методах XML-RPC (чтение, запись, exec_workflow и т. д.). Большое спасибо за помощь в разъяснении. - person jelogar; 30.07.2014