【问题标题】:How to GET multiple commits with REST Api from an on-premises TFS server 2018?如何使用 REST Api 从本地 TFS 服务器 2018 获取多个提交?
【发布时间】:2019-06-06 23:26:08
【问题描述】:

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

但是如何通过这个列表呢?例如,我有 2 个提交 A 和 B。我试过了:

  1. A,B
  2. A 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]

同样的错误。

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

使用 in 代替 =

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

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

【问题讨论】:

  • 你能分享你的整个http消息吗?
  • 文档没有指定数组是否需要是字符串数组。所以不清楚。这里有一个简单的例子来说明你如何做到这一点:string[] ids = {"0533232917cc37fb743d282c467eb41bafac15ee", "063a6805640221285db15f75c3b3ca6f3fe619c"}; 然后你可以传入你刚刚创建的 ids 数组。
  • 我添加了一条重要信息 - 我使用 powershell。你能把它翻译成powershell吗?因为我已经尝试过看起来像 powershell 数组的东西,如您所见。

标签: git rest powershell azure-devops


【解决方案1】:

根据我的测试,逗号方式适用于其余 API。下面是使用Powershell代码的demo和测试结果,大家可以参考。我使用 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 版对其进行测试,它也适用于我。

测试结果:

更新

如果我使用 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"

测试结果:

【讨论】:

  • 我不知道该说什么。我们有一个本地 VSTS。
  • @mark.请在 url 中使用 in to 而不是 '='。我也更新了我的答案,你可以参考一下。 $ids = '0cc4e954c082372379xxxx','9b5983436c2f81b5fae6a72xxx' $apiUrl= "http://$tfsserver:8080/tfs/$organization/$project/_apis/git/repositories/$repositoryId/commits?searchCriteria.ids in $ids&api-version=4.1"
  • @mark.感谢您的更新。这是我的错,正如你提到的 in 不起作用,因为我只用 2 次提交对其进行了测试。我建议您可以将其报告给TFS teams
猜你喜欢
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多