我们在 Azure DevOps 中有一个简单的查询,它查找特定迭代路径中的所有工作项,并在 Web GUI 中运行时返回 System.Id、System.WorkItemType、System.Title、System.AssignedTo、System.Tags、和系统.Parent。 通过使用这种形式的 API 调用:
https://dev.azure.com///_apis/wit/wiql/
我可以获得查询返回的列的列表以及每个工作项的链接。 这些链接不包含列中的信息。 据推测,我应该获取每个工作项链接并形成一个 WIQL 查询,该查询将返回我想要的信息。 通常这不是问题(除了我不熟悉 WIQL),但我们会将这些信息拉入 Azure 数据工厂,以提交到 SQL 数据库并与其他来源的工作信息相关联。 ADF 可以从 Rest API 提取到数据库(我已经见过,但仍在学习......),但似乎最好(或可能唯一可能)使用单个查询来完成此操作,而不是基于初始查询结果的一组查询。
所以,我的问题是:Azure DevOps 是否有一个 API 调用可以为每个工作项返回与查询关联的工作项信息? 也就是说,我想要一个查询,它实际上会告诉我每个工作项的 Id、WorkItemType 等,而不是一个必须输入到另一个查询才能获取我们想要的信息的可循环列表。
恐怕只有一个rest api无法返回查询中的工作项信息。
通过rest api您可以获取查询设置(工作项字段)和工作项id,您需要结合另一个API来获取工作项信息。
这是我的 PowerShell 示例:
$token = "PAT"
$url=" https://dev.azure.com/{OrganizationName}/{ProjectName}/{Team}/_apis/wit/wiql/{QueryId}?api-version=5.1"
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Get -ContentType application/json
$IDS = $response.workItems.id -join ','
$Fieldnames = $response.columns.referenceName -join ','
echo $IDs
echo $Fieldnames
$url1="https://dev.azure.com/{OrganizationName}/_apis/wit/workitems?ids=$IDs&fields=$Fieldnames&api-version=6.0"
$response2 = Invoke-RestMethod -Uri $url1 -Headers @{Authorization = "Basic $token"} -Method Get
echo $($response2 | ConvertTo-Json -Depth 100)
说明:
第一个 Rest API:Wiql - Get 用于获取查询设置和 IDS。我们可以从响应中获取 id 和字段并形成一个字符串。
第二个Rest API:工作项-列表用于获取工作项信息,您可以在URL中添加字段和id,然后您可以获取具有目标字段的工作项。
结果:
从今天起,您可以使用端点
workitemsbatch
。这是专门为批量返回多个工作项而设计的(硬编码限制最多为 200 个)。
您可以避免标识符的串联,而只需使用 PowerShell 属性组。这是下面代码的摘录。看看这段代码:
$workItemQuery = @{
fields = $response.columns.referenceName
ids = $batch.id
} | ConvertTo-Json
这将创建一个具有正确形状和要检索的 id 列表的对象的 JSON 序列化。
$batch
数组通过属性组 id
一次性检索此类列表。
这是完整的工作代码,读取所有工作项(假设它们小于 20K)。
$apiVersion = '7.1'
$jsonContentType = 'application/json'
$pageSize = 200
$azureDevOpsPAT = $PAT
if ($EncodedPAT) {
$azureDevOpsPAT = ConvertFromBase64 $PAT
}
$azureDevOpsAuthenticationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($azureDevOpsPAT)")) }
$organizationUri = 'https://dev.azure.com/' + $OrganizationName + '/'
$initialQuery = @{
query = "SELECT [System.Id], [System.Title] FROM WorkItems"
} | ConvertTo-Json
$iterationUrl = $organizationUri + $ProjectName + "/_apis/wit/wiql?api-version=$apiVersion"
$workItemUrl = $organizationUri + $ProjectName + "/_apis/wit/workitemsbatch?api-version=$apiVersion"
Write-Host "Uri $iterationUrl"
$response = Invoke-RestMethod -Uri $iterationUrl -Method Post -Body $initialQuery -ContentType $jsonContentType -Headers $azureDevOpsAuthenticationHeader
$array = $response.workItems
$elementCount = $array.length
Write-Host "The query returned $elementCount"
for ($i = 0; $i -lt $array.length; $i += $pageSize) {
$start = $i
$end = ([math]::Min($i + $pageSize - 1, $array.length - 1))
$batch = $array[$start..$end]
$batchCount = $batch.length
Write-Host "Get $batchCount, from $start to $end"
$workItemQuery = @{
fields = $response.columns.referenceName
ids = $batch.id
} | ConvertTo-Json
$workItemResponse = Invoke-RestMethod -Uri $workItemUrl -Method Post -Body $workItemQuery -ContentType $jsonContentType -Headers $azureDevOpsAuthenticationHeader
ReadWorkItems -WorkItemCollection $workItemResponse
}
我省略了
ReadWorkItems
,因为它很微不足道,并且在其他地方累积了结果。