我编写了一些Python代码,用于通过API登录Polarion ALM服务器并读取一些数据(有关Polarion API的更多信息:https://almdemo.polarion.com/polarion/sdk/index.html)。在我的代码中,我使用 zeep Python 包来处理 SOAP。
我的算法很简单:
1) 通过 logIn Web 服务登录 ( https://almdemo.polarion.com/polarion/sdk/doc/javadoc/com/polarion/alm/ws/client/session/SessionWebService.html#logIn-java.lang.String-java.lang.String- )
2) 将当前 session 添加到 header - 以便当前 session 保持事件状态。
3) 尝试读取一些数据,例如通过 getRootProjectGroup Web 服务 ( https://almdemo.polarion.com/polarion/sdk/doc/javadoc/com/polarion/alm/ws/client/projects/ProjectWebService.html#getRootProjectGroup-- )。
4) 无论发生什么,我都会通过 endSession Web 服务 ( https://almdemo.polarion.com/polarion/sdk/doc/javadoc/com/polarion/alm/ws/client/session/SessionWebService.html#endSession-- ) 关闭当前 session 。
我观察到的:
有时,在第 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
}
最让我惊讶的是:
- 我总是使用相同的凭据(用户名和密码)
- 请求中的 session ID(第 3 点)与登录期间服务器响应中的 session ID(第 1 点)相同,因此 session 应保持事件状态
- 如果我将代码放入循环中(例如 1000 次执行),则所有尝试的结果始终相同(1000 次成功或 1000 次失败),即使我在尝试之间添加等待(例如 1 秒)
我想知道为什么服务器拒绝某些请求。这是某种 Polarion 服务器问题吗?我怎样才能解决以某种方式与服务器连接并能够从服务器读取一些数据,即使它拒绝我的第一个请求。
最佳答案
看来这是 SOAP 客户端(也是相对流行的客户端)的问题。为了解决这个问题,我关闭了 TLS 验证。更多详情请参见: https://python-zeep.readthedocs.io/en/master/transport.html
关于Polarion ALM的API有时不授权任何请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58641754/