【发布时间】:2021-04-21 14:27:02
【问题描述】:
我们正在尝试收集有关我们的拉取请求的信息,以便为我们的部门建立某些指标(完成拉取请求需要多长时间,...)。
Azure DevOps 提供了一个 API 来查询很多东西,包括拉取请求。 我在这里查找了用法:https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20requests/get%20pull%20request?view=azure-devops-rest-6.0 我还研究了微软提供的这个客户端:https://docs.microsoft.com/en-us/dotnet/api/microsoft.teamfoundation.sourcecontrol.webapi.githttpclient?view=azure-devops-dotnet
我的问题是,我通过 API 和 GitHttpClient 获得的结果似乎与我认为应该存在的信息不匹配。 我们最近的一个拉取请求的 ID 为 1086。我假设,这意味着之前已经有 1085 个拉取请求,这是第 1086 个拉取请求。
当我查询 API 时,我得到了奇怪的结果: 使用 API,没有任何过滤条件,我得到 5 个拉取请求。使用过滤条件“状态已完成”,我收到了 101 个拉取请求。使用 top = 5000 仍然提供 101。 使用 GitHttpClient 我得到不同的结果。没有任何过滤器,我得到 4。使用过滤器标准“状态已完成”,我得到 101 个拉取请求。使用 top = 5000 我得到 490。
这仍然不是 1086。我不想手动检查 Azure DevOps 中的所有拉取请求并检查 API 是否返回正确数量的拉取请求。 那么,pull request id 是如何计算的呢?只是在数数吗?实际上有 1086 个拉取请求,而 api / 客户端交付的更少吗?拉取请求 ID 中是否存在空白,实际上没有 1086 个拉取请求?
我使用的个人访问令牌具有所需的权限。我什至尝试过使用具有所有权限且结果相同的访问令牌。所以这应该不是问题。
那么有没有一种简单快捷的方法来验证我从 API / GitHttpClient 获得的数据是否完整? 另外,为什么我必须输入 top=x 才能获得超过 101 个结果。据我了解,这不是 rest api 的工作方式......
代码示例 接口:
public class Client
{
private const string _azureDevopsUri = "https://dev.azure.com/companyName";
private const string _query = "projectName/_apis/git/pullrequests?searchCriteria.status=completed&api-version=6.0";
public async Task<PullRequests> GetPullRequestReport(DateTime? fromTime, DateTime? toTime)
{
string personalAccessToken = "HereIsMyToken";
string credentials = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(string.Format("{0}:{1}", "", personalAccessToken)));
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri(_azureDevopsUri);
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);
var response = await httpClient.GetAsync(_query);
if (response.IsSuccessStatusCode)
{
var responseContentAsJsonString = await response.Content.ReadAsStringAsync();
var pullRequests = JsonConvert.DeserializeObject<PullRequests>(responseContentAsJsonString);
GitHttpClient
public class Client
{
private const string _azureDevopsUri = "https://dev.azure.com/companyName";
public async Task<PullRequests> GetPullRequestReport(DateTime? fromTime, DateTime? toTime)
{
string personalAccessToken = "HereIsMyToken";
var connection = new VssConnection(new Uri(_azureDevopsUri), new VssBasicCredential(string.Empty, personalAccessToken));
var gitHttpClient = connection.GetClient<GitHttpClient>();
var pullRequestsGit = await gitHttpClient.GetPullRequestsByProjectAsync(projectName", new GitPullRequestSearchCriteria { Status = PullRequestStatus.Completed }, top: 5000);
【问题讨论】:
标签: azure-devops azure-devops-rest-api