Azure DevOps PAT调用SDK拉取工作项返回203但直接请求正常的原因?
第一段代码的疏漏点
- PAT赋值错误:你定义
personal_access_token时多写了前置冒号,值为:XXXX,但BasicAuthentication('', 你的PAT)的内部逻辑会自动将空用户名与PAT拼接为{用户名}:{PAT}的格式再做Base64编码,额外加的冒号会导致最终拼接结果为::XXXX,生成的认证凭证完全错误。 - 独立requests请求未携带认证信息:你前面初始化的Azure DevOps Python库连接、凭证对象,和最后调用的
requests.get没有任何关联,你没有给这个GET请求传入任何auth参数或者认证头,请求自然没有携带有效身份信息,返回203响应属于预期结果。
原生requests生效、Azure Python库看起来不生效的原因
Azure官方提供的DevOps Python库本身逻辑没有问题,你之前测试时感知到“库不生效”完全是错误用法导致的:
- 你给库传入的PAT本身带了多余的冒号,导致初始化的凭证是无效的,哪怕你用库本身的客户端发起请求也会认证失败,你代码里调用
core_client.get_projects()后没有做错误判断,没有发现这一步本身就已经认证失败了,误以为是库的能力有问题。 - 你测试库效果时用了独立的requests请求,没有用到库封装的请求能力,相当于库的初始化完全是无效代码,自然拿不到正确结果。
如果你修正PAT的冒号问题,直接用库提供的客户端就能完成工作项查询,不需要自己拼接URL、处理认证逻辑,示例逻辑如下:
from azure.devops.connection import Connection from msrest.authentication import BasicAuthentication PE_DEVOPS_NAME = "DevOpsArea" personal_access_token = 'XXXX' # 去掉前置冒号 organization_url = 'https://dev.azure.com/organization/' credentials = BasicAuthentication('', personal_access_token) connection = Connection(base_url=organization_url, creds=credentials) # 直接拿工作项跟踪客户端 wit_client = connection.clients.get_work_item_tracking_client() # 调用方法查询指定ID的工作项 work_item = wit_client.get_work_item(id=60814, project=PE_DEVOPS_NAME) print(work_item.fields)
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

