如何从内部部署TFS服务器2018获取REST Api的多次提交?

问题描述 投票:1回答:1

考虑一下GetCommits API。它有一个可选参数searchCriteria.ids,它是一个提交ID列表。

但是如何通过这个清单呢?例如,我有2个提交A和B.我试过:

  1. A,B
  2. 一个B.
  3. [A,B]

我得到的回应是:

An object ID must be 40 characters long and only have hex digits. Passed in object ID: 0533232917cc37fb743d282c467eb41bafac15ee,063a6805640221285db15f75c3b3ca6f3fe619c

我得到了所有三个变体的相同响应 - 只有报告的对象Id不同。

那么,如何在GET请求中将数组传递给Azure Devops REST Api?

我使用PowerShell。声明只是Invoke-RestMethod -UseDefaultCredentials -Uri $Url

变体1 - 使用逗号

http://tfsserver:8080/tfs/defaultcollection/code/_apis/git/repositories/xyz/commits?api-version=4.1&searchCriteria.ids=0533232917cc37fb743d282c467eb41bafac15ee,063a6805640221285db15f75c3b3ca6f3fe619c0

结果是

{"$id":"1","innerException":null,"message":"An object ID must be 40 characters long and only have hex digits. Passed in object ID: 0533232917cc37fb743d282c467eb41bafac15ee,063a6805640221285db15f75c3b3ca6f3fe619c0.","typeName":"System.ArgumentException, mscorlib","typeKey":"ArgumentException","errorCode":0,"eventId":0}

变体2 - 使用空间

http://tfsserver:8080/tfs/defaultcollection/code/_apis/git/repositories/xyz/commits?api-version=4.1&searchCriteria.ids=0533232917cc37fb743d282c467eb41bafac15ee%20063a6805640221285db15f75c3b3ca6f3fe619c0

导致同样的错误。

变体3 - 使用JavaScript数组[,]

http://tfsserver:8080/tfs/defaultcollection/code/_apis/git/repositories/xyz/commits?api-version=4.1&searchCriteria.ids=[0533232917cc37fb743d282c467eb41bafac15ee,063a6805640221285db15f75c3b3ca6f3fe619c0]

同样的错误。

当我只传递一个没有任何额外符号的提交时,它确实有效。

enter image description here

使用in而不是=

有人建议使用'in'而不是'='。这确实接受逗号,但似乎无法正常工作。请观察:

enter image description here

因此,使用'='会产生一个提交 - 正如预期的那样。但使用'in'会产生100?我尝试传递两个用逗号分隔的提交,它不会失败,但也返回100个提交。这是错的。

git rest powershell azure-devops
1个回答
0
投票

根据我的测试,逗号方式适用于其余的API。以下是使用Powershell代码的演示和测试结果。您可以参考它。我用Azure Devops API测试它。

如果ID之间有空格,我也可以重现您提到的问题。

$pat = "PATToken"
$organization = "organization name"
$project = "project Id"
$repositoryId = "repository Id"
$ids = "266295d9adbxxx,f345970123bxxxx" # Ids of commits
$apiUrl= "https://dev.azure.com/$organization/$project/_apis/git/repositories/$repositoryId/commits?searchCriteria.ids=$ids&api-version=5.0-preview.1"

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "", $pat)))

$Result = Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}  -Method GET 

foreach($item in $Result.value)
{
  Write-Host "$item"
  Write-Host "---------------"
}

注意:我也尝试使用API​​ 4.1版测试它,它也在我这边工作。

测试结果:

enter image description here

更新:

如果我使用TFS API,我也可以使用我提到的代码重现您提到的问题。

我可以通过以下方式获得结果。请尝试使用in而不是“=”

以下是我的测试代码:

$ids = '0cc4e954c082372379xxxx','9b5983436c2f81b5fae6a72xxx'

$apiUrl= "http://$tfsserver:8080/tfs/$organization/$project/_apis/git/repositories/$repositoryId/commits?searchCriteria.ids in $ids&api-version=4.1"

测试结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.