从Azure DevOps REST API中获取项目的所有工作项

12
我正在使用Azure DevOps API和AWS Lambda Node.js创建通知机器人。目前,我需要检查每个任务工作项是否附加到父用户故事。
第一步是获取“给定”项目上的所有任务工作项,为此我阅读了Azure DevOps API文档,并找到了这个链接:Work Items - List API要求我提供我想获取的工作项的ID,但如果我需要获取“给定”项目中的所有工作项呢?
GET https://dev.azure.com/{organization}/{project}/_apis/wit/workitems?ids={ids}&api-version=5.1

或者还有其他方法可以从给定项目中获取所有工作项的ID吗?

4个回答

10
你可以使用 工作项 - 批量获取工作项 API,它不需要 id,但结果中最多只能返回 200 个工作项。
但是,如果你需要检查任务,为什么需要获取项目中的所有工作项呢?你可以使用 Wiql - 使用 Wiql 查询 API 仅获取任务:
POST https://dev.azure.com/{organization}/{project}/{team}/_apis/wit/wiql?api-version=5.1

在HTML文档的body部分进行查询:
{
  "query": "Select [System.Id], [System.Title], [System.State] From WorkItems Where [System.WorkItemType] = 'Task'"
}

你如何发起这个POST请求?我正在使用Python并且有一个PAT...但是我无法弄清楚。PAT将放在哪里? - Abhishek Rai
不知道Python怎么做,但在Node中,我们将PAT作为授权头传递。 - Jayesh_naik
3
工作项 - 获取工作项批处理API现在需要请求正文中的ids参数。 - BandoKal

2

有一个适用于C#的客户端:

        public IEnumerable<int> GetIdList()
        {
            var connection = new VssConnection(new Uri("http://yourazuredevopsurl/"), new VssBasicCredential(string.Empty, personalAccessToken));
            var workItemTrackingHttpClient = connection.GetClient<WorkItemTrackingHttpClient>();
            var wiql = new Wiql
            {
                Query =  $@"Select [System.Id] From WorkItems Where [System.WorkItemType] = 'Test Case'"
            };
            
            var worItemsIds = workItemTrackingHttpClient.QueryByWiqlAsync(wiql, "Project name").Result;

            return worItemsIds.WorkItems.Select(reference => reference.Id);

2

在进一步回应Shayki有关使用WIQL查询的建议时,我建议您可以通过执行工作项链接查询来实现两全其美,该查询查找没有父用户故事的任务:

POST https://dev.azure.com/{organization}/{project}/{team}/_apis/wit/wiql?api-version=5.1

请求有效载荷:

{
  "query": "SELECT [System.Id] FROM workitemLinks WHERE ([Source].[System.WorkItemType] = 'Task') AND ([System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Reverse') AND ([Target].[System.WorkItemType] = 'User Story') MODE (DoesNotContain)"
}

这样,您就不必循环遍历每个工作项,然后检查它是否有父项。
注意:WIQL查询限制返回结果为20K,并且如果查询结果超过此数量的工作项,则会返回错误。如果适用,使用上述查询的进一步原因。

0

这个很有效 - 记得先声明 url、body 以及 PAT 变量(可以使用 getpass 来获取 PAT):

r = requests.post(url, json=body,
    headers = {'Content-Type': 'application/json'},
    auth = ('', PAT))
print(r.content)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接