从Azure DevOps OData查询读取数据时遭遇授权错误
从Azure DevOps OData查询读取数据时遭遇授权错误
你现在的代码里藏着两个关键问题,咱们一步步拆解解决:
1. 授权方式用错了(核心问题)
Azure DevOps的PAT(个人访问令牌)不认Bearer格式的认证头,得用Basic认证才行:
- 把你的PAT当密码,用户名可以随便填(甚至直接用空字符串就行)
- 把
用户名:PAT这个字符串做Base64编码,再放到Authorization: Basic前缀后面
2. 响应处理的代码逻辑错误
你写的json.loads(open(response.text,encoding='utf-8-sig'))完全搞错了:response.text是API返回的JSON字符串,不是本地文件路径,根本不需要用open()打开,直接传给json.loads()就可以了。
修正后的完整代码
import requests import json import base64 endpoint_url = "https://analytics.dev.azure.com/pbi0280/TestOdata/_odata/v4.0-preview/WorkItems?$select=WorkItemId,WorkItemType,Title,State" pat = "vch3ufmtbnimclfumrms5vgulcktrtakhp2hig3p7v3cs3ormi7q" # 构建Basic认证内容:用户名留空,后面跟冒号加PAT auth_str = f":{pat}" # 转成字节后做Base64编码,再转回字符串 auth_bytes = auth_str.encode('utf-8') auth_base64 = base64.b64encode(auth_bytes).decode('utf-8') headers = {"Authorization": f"Basic {auth_base64}"} response = requests.get(endpoint_url, headers=headers) # 先检查响应状态码,方便快速排查问题 if response.status_code == 200: data = json.loads(response.text) print(data) else: print(f"请求失败,状态码:{response.status_code}") print(f"错误详情:{response.text}")
额外提醒
- 确认你的PAT权限足够:至少要包含Analytics Read权限,以及目标项目的访问权限
- 测试时优先看响应状态码,能更快定位是授权问题还是其他请求错误
备注:内容来源于stack exchange,提问作者at9063
相关产品推荐
相关产品推荐

