无法使用 rest api 和 python 获取并发布到 alm。总是得到 401 状态码

Posted

技术标签:

【中文标题】无法使用 rest api 和 python 获取并发布到 alm。总是得到 401 状态码【英文标题】:Not able to get and post to alm using rest api and python. Always getting 401 status code 【发布时间】:2020-05-07 07:57:59 【问题描述】:

我正在使用 rest api 和 python 自动化 alm。我现在所能做的就是登录和注销。只有用于登录和注销的 api 会给出正确的响应。所有其他都给出 500/401 错误。

import requests
from requests.auth import HTTPBasicAuth
from xml.etree.ElementTree import Element, SubElement, tostring, parse
ALM_USER_NAME = "XXXX"
ALM_PASSWORD = "XXXX"
ALM_DOMAIN = "XXXX"
ALM_PROJECT="XXXX"

ALM_URL ="http://xxxxxxxxx/qcbin/"
QC_LOGOUT_END_POINT = ALM_URL + "authentication-point/logout"
session = requests.Session()
session.verify = False

auth = session.post(ALM_URL + "authentication-point/authenticate",
                    auth=HTTPBasicAuth(ALM_USER_NAME, ALM_PASSWORD))
print("Authentication ", auth, auth.text, session.cookies)

site_session = session.post(ALM_URL + "rest/site-session")
print("Session ", site_session, site_session.text, session.cookies)

check = session.get(ALM_URL + "rest/is-authenticated")
print("Check ", check, check.text)

# Enforce JSON output
session.headers.update( 'Accept': 'application/json','Cookie': check.headers['set-cookie'])
#projects = session.get(hpqc_server + "rest/domains/"+ALM_DOMAIN+"/projects")
# Post a New Defect
defect = dict()
defect['Type'] = 'defect'
defect['name'] = '***'
defect['user-10'] = 'Content'  # User defined field
defect['severity'] = '1-Low'
defect['priority'] = '1-Low'
defect['detected-by'] = 'userid'
defect['creation-time'] = '2017-11-13'

# Call the generic method to build the xml data
defect_payload = generate_xml_data(defect)

deft=session.get(ALM_URL + "rest/domains/"+ALM_DOMAIN+"/projects/"+ALM_PROJECT+"/content/defects")
print(deft.status_code)


if session:
            res = session.post(QC_LOGOUT_END_POINT)
            if res.status_code == 200:
                print ("ALM: Logged out")

登录响应:200 会话响应:201 缺陷响应:401

【问题讨论】:

我在使用 Python 时遇到了同样的问题,尽管我可以让它在 Postman 中正常工作 【参考方案1】:

您的请求似乎缺少 cookie。请调试它/打印出所有 cookie。在我的情况下(也使用带有 ALM 12.55 的 python 请求 API)以下 cookie 随每个请求一起发送(例如读取缺陷):

ALM_USER
LWSSO_COOKIE_KEY
QCSession
XSRF-TOKEN
JSESSIONID

所需步骤总结:

    authentication-point/authenticate 发布身份验证请求。保存返回的LWSSO_COOKIE_KEY cookie。 向rest/site-session 发送一个会话请求并发送LWSSO_COOKIE_KEY cookie。保存返回的ALM_USERQCSessionXSRF-TOKENJSESSIONID cookie 将所有 cookie 合并到一个 cookie 容器中 (RequestsCookieJar.update(self, other))

在您的 "# Enforce JSON output" 行中,您更新标头中的 cookie。您设置了check 的cookies。可能site_session 的cookie 丢失了。

【讨论】:

我希望早点看到这条消息。你是对的,虽然显然只需要 QCSession 和 LWSSO_COOKIE_KEY 。其他 cookie 不是。【参考方案2】:

我设法让它工作。我需要对登录 URL 进行初始调用以获取 LWSSO_COOKIE_KEY 和 QCSession 的 cookie。在此之后,我得到了我需要的响应。

这是我的代码,出于安全原因,网址和密码略有更改。另外,我通过查看Postman生成的python代码得到了加密的授权基本密码:

url_signin = "http://????????????/qcbin/api/authentication/sign-in"
url_defects = "http://??????????/qcbin/api/domains/Domain name/projects/project_name/defects"
payload  = 

headers1 = 
    "Authorization": "Basic ?????????"

si = requests.get(url_signin, headers = headers1)
QCsession = si.cookies.items()[2][1]
lwsso = si.cookies.items()[1][1]

headers = 
    "Authorization": "Basic ??????????",
    'Cookie': "QCSession="+ QCsession + "; "+"LWSSO_COOKIE_KEY=" +lwsso


response = requests.request("GET", url, headers=headers, data = payload)

print(response.text)

如果您有任何问题,请告诉我

【讨论】:

以上是关于无法使用 rest api 和 python 获取并发布到 alm。总是得到 401 状态码的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress 如何使用 python 和 REST API 获取高级自定义字段内容

Rest API C# 和 Python:无法理解或解决状态码 308

REST api/postman - 无法获取/路由错误

ReactJS 应用程序无法使用 REST API 调用获取数据

无法使用restful api从数据库中获取照片

如何在 Python 单元测试中获取和断言以及 REST API?