Я написал некоторый код Python, который входит в систему и считывает некоторые данные с сервера Polarion ALM через API (дополнительная информация о API Polarion: https://almdemo.polarion.com/polarion/sdk/index.html). В моем коде я использовал пакет Zeep Python для обработки SOAP.
Мой алгоритм прост:
1) Войдите в систему через веб-сервис входа в систему (https://almdemo.polarion.com/polarion/sdk/doc/javadoc/com/polarion/alm/ws/client/session/SessionWebService.html#logIn-java.lang.String-java.lang.String-)
2) Добавьте текущий сеанс в заголовок - чтобы текущий сеанс оставался живым.
3) Попробуйте прочитатьнекоторые данные, например, через веб-сервис getRootProjectGroup (https://almdemo.polarion.com/polarion/sdk/doc/javadoc/com/polarion/alm/ws/client/projects/ProjectWebService.html#getRootProjectGroup--).
4) Независимо от того, что происходит, я закрываю текущий сеанс через веб-сервис endSession (https://almdemo.polarion.com/polarion/sdk/doc/javadoc/com/polarion/alm/ws/client/session/SessionWebService.html#endSession--).
То, что я наблюдал: иногда, в точке 3 я получаю ответ с ошибкой авторизации (фрагмент с ответом):
<soapenv:Fault>\n <faultcode>soapenv:Server.generalException</faultcode>\n <faultstring>Not authorized.</faultstring>\n <detail>\n <ns1:stackTrace xmlns:ns1="http://xml.apache.org/axis/">Not authorized.\n\tat com.polarion.alm.ws.providers.DoAsUserWrapper.invoke(DoAsUserWrapper.java:37)\n\tat org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)\n\t..
или все хорошо, и я получаю:
{
'groupURIs': {
'SubterraURI': [
'subterra:data-service:objects:/default/${ProjectGroup}Group'
]
},
'location': None,
'name': 'ROOT_CTX_NAME',
'parentURI': None,
'projectIDs': None,
'uri': 'subterra:data-service:objects:${ProjectGroup}Group',
'unresolvable': False
}
Что меня больше всего удивляет:
- Я всегда использую одни и те же учетные данные (имя пользователя и пароль) - идентификатор сеанса в запросе (пункт 3) такой же, как в ответе сервера во время входа в систему (пункт 1), поэтому сеанс должен оставатьсяalive
- если я поместил свой код в цикл (например, 1000 выполнений), результат для всех попыток всегда будет одинаковым (1000 успехов или 1000 неудач), даже если я добавлю ожидание (например, 1 с) между попытками
Я хотел бы знать, почему сервер отклоняет некоторые запросы. Это какая-то проблема с сервером Polarion? Как можно обойти эту проблему, чтобы каким-то образом подключиться к серверу и иметь возможность считывать некоторые данные с сервера, даже если он отклоняет мой первый запрос.