Список рабочих элементов VSTS через REST API

Как я могу получить список рабочих элементов из VSTS с помощью REST API?

Согласно документации, параметр ids не является обязательным, но когда я его опускаю, я получаю 404 ошибку. Если я добавлю параметр ids, я могу получить предметы.

Неудачный запрос:
GET https://{account}.visualstudio.com/DefaultCollection/_apis/wit/workitems?api-version=1.0

Последующий запрос:
GET https://{account}.visualstudio.com/DefaultCollection/_apis/wit/workitems?ids=252&api-version=1.0

Аутентификация одинакова для обоих.

Полная проблема, которую необходимо решить: получить все функции в конкретном проекте VSTS


person fra    schedule 19.08.2016    source источник
comment
Вы решили это случайно?   -  person Ivan    schedule 08.12.2016
comment
Нет, пока не могу решить   -  person fra    schedule 08.12.2016
comment
@fra, не могли бы вы рассказать мне, как вы реализовали аутентификацию? Как получить токен и как отправить токен с API для получения рабочих элементов? заранее спасибо   -  person Aswin Sathyan    schedule 17.01.2018


Ответы (2)


Ключ в том, чтобы использовать часть API WIQL, а не рабочий элемент. Например, чтобы получить плоский список рабочих элементов определенного типа, используйте это: https://www.visualstudio.com/en-us/docs/integrate/api/wit/wiql#a-flat-query

Пример в PowerShell (показывает все истории пользователей в закрытом состоянии):

    # using env vars passed from VSTS build
    $collectionuri = $Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
    $token = $Env:SYSTEM_ACCESSTOKEN # need to configure build to allow passing OAuth tokens

    $basicAuth = "{0}:{1}"-f "ivan-the-terrible", $token
    $basicAuth = [System.Text.Encoding]::UTF8.GetBytes($basicAuth)
    $basicAuth = [System.Convert]::ToBase64String($basicAuth)
    $headers = @{Authorization=("Basic {0}"-f $basicAuth)}

    $WorkItemType = 'User Story'

    $url = $collectionuri + 'DefaultCollection/_apis/wit/wiql?api-version=1.0'

    $WIQL_query = "Select [System.Id], [System.Title], [System.State] From WorkItems Where [System.WorkItemType] = '" + $WorkItemType + "' AND [State] = 'Closed' order by [Microsoft.VSTS.Common.Priority] asc, [System.CreatedDate] desc"
    $body = @{ query = $WIQL_query }
    $bodyJson=@($body) | ConvertTo-Json

    $response = Invoke-RestMethod -Uri $url -headers $headers -Method Post -ContentType "application/json" -Body $bodyJson

    $workitems = $response.workItems

    Write-Host "Found" $workitems.Count "work items of type:" $WorkItemType
person Ivan    schedule 08.12.2016

Вот аналогичное решение, которое я написал на C #, чтобы вернуть список всех рабочих элементов типа Ticket. Мне удалось получить этот результат, используя образец, представленный в принятом ответе, и просматривая документы здесь

public QueryResult GetTickets()
{
    try
    {
        var token = "****";

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(
                    System.Text.ASCIIEncoding.ASCII.GetBytes(
                        string.Format("{0}:{1}", "", token))));

            var query = "Select [System.Id], [System.Title], [System.State] From WorkItems Where [System.WorkItemType] = 'Ticket' AND [State] <> 'Closed' order by [Microsoft.VSTS.Common.Priority] asc, [System.CreatedDate]";                    
            var content = new StringContent("{ \"query\": \"" + query + "\" }", Encoding.UTF8, "application/json");
            var url = "https://{account}.visualstudio.com/_apis/wit/wiql?api-version=4.1";

            using (HttpResponseMessage response = client.PostAsync(url, content).Result)
            {
                response.EnsureSuccessStatusCode();
                string responseBody = response.Content.ReadAsStringAsync().Result;
                var result = JsonConvert.DeserializeObject<QueryResult>(responseBody);

                return result;
            }
        }
    }
    catch(Exception ex)
    {
        return null;
    }            
}
person Andrew Hoefling    schedule 07.05.2018