typescript - Azure DevOps REST API:s getWorkItems returnerar inte alla tillgängliga fält


DETTA kom närmast det jag står inför, men deras lösning fungerar inte. Dessutom är det 2,5 år gammalt, så kanske har det skett några ändringar i API:et, så jag ställer en ny fråga.

Här är mitt manifest:

{
  "targets": [
    {
      "id": "Microsoft.VisualStudio.Services"
    }
  ],
  "scopes": [
    "vso.work_full",
    "vso.project_manage",
    "vso.profile",
    "vso.graph",
    "vso.identity"
  ],
  "categories": [
    "Azure Boards"
  ],
  "demands": [
    "api-version/6.0"
  ],
...
  "contributions": [
    {
      "id": "",
      "type": "ms.vss-web.hub",
      "targets": [
        "ms.vss-work-web.work-hub-group"
      ]
    }
  ]
}

och min kod:

import { getClient } from 'azure-devops-extension-api';
import { WorkItem, WorkItemExpand, WorkItemTrackingRestClient } from 'azure-devops-extension-api/WorkItemTracking';

export class WorkItemsService {
  ...
  static async getWorkItems(ids: number[], projectId: string): Promise<WorkItem[]> {
    const client = getClient(WorkItemTrackingRestClient);
    ...
    client.getWorkItems(ids.slice(...), projectId, undefined, undefined, WorkItemExpand.All));
    ...
  }
}

Jag är:

  1. använder WorkItemTrackingRestClient:s getWorkItems-metod se
  2. ange WorkItemExpand.All i förfrågan
  3. inte lista några fältnamn i förfrågan
  4. inställning vso.work_full i manifestet se

Men jag får bara tillbaka dessa fält:

"System.Id": "",
"System.AreaId": "",
"System.AreaPath": "",
"System.TeamProject": "",
"System.NodeName": "",
"System.AreaLevel1": "",
"System.Rev": "",
"System.AuthorizedDate": "",
"System.RevisedDate": "",
"System.IterationId": "",
"System.IterationPath": "",
"System.IterationLevel1": "",
"System.IterationLevel2": "",
"System.WorkItemType": "",
"System.State": "",
"System.Reason": "",
"System.AssignedTo": "",
"System.CreatedDate": "",
"System.CreatedBy": "",
"System.ChangedDate": "",
"System.ChangedBy": "",
"System.AuthorizedAs": "",
"System.PersonId": "",
"System.Watermark": "",
"System.CommentCount": "",
"System.Title": "",
"Microsoft.VSTS.Common.StateChangeDate": "",
"Microsoft.VSTS.Common.ActivatedDate": "",
"Microsoft.VSTS.Common.ActivatedBy": "",
"Microsoft.VSTS.Common.Priority": "",
"System.Parent": ""

Men intressant nog, när jag lägger in URL:en från ApiWorkItem._links.fields i en webbläsare får jag en enorm datasats med alla fält jag är intresserad av och mer därtill, liknande detta. Ett exempel är Microsoft.VSTS.Scheduling.xxxx. I den inbyggda metodens data syns det inte alls, men i JSON som returneras av URL:en finns det en massa fält.

När jag istället för undefined skriver till exempel Effort som i Microsoft.VSTS.Scheduling.Effort, så här

client.getWorkItems(ids.slice(...), projectId, ['Effort']);

resultatens fält visar sig vara tomma.

Jag har inte lust att göra hundratals API-anrop för att få de uppgifter jag behöver från arbetsobjektens URL:er. Vad missar jag?

Jag uppskattar alla som har läst så här långt.

Svar #1

Svarar på min egen fråga för att förhindra att slösa bort någon annans tid. Ett par observationer som bidrog till den perfekta stormen av missförstånd:

  1. Azure returnerar bara fält som har data
  2. ApiWorkItem._links.fields listar endast deklarerade fält i projektet och tillhandahåller ingen data
  3. getWorkItemsBatch och getWorkItems är två sidor av samma mynt, och returnerar samma uppsättning data
  4. i fields-parametern för nämnda metoder krävs fältets fulla referenceName, t.ex. Microsoft.VSTS.Scheduling.OriginalEstimate och inte bara OriginalEstimate
  5. och viktigast av allt måste man se till att de kontrollerar mot ett arbetsobjekt som verkligen har data i de fält de behöver

Allt fungerar som det ska..

Svar #2

Såvitt jag förstår försöker du använda denna metod: https://learn.microsoft.com/en-us/javascript/api/azure-devops-extension-api/workitemtrackingrestclient#azure-devops-extension-api-workitemtrackingrestclient-getworkitems

  • Denna metod returnerar endast kärnfält.
  • WorkItemExpand.All expanderar endast referenser (länkar till andra arbetsobjekt, definitioner) av ett arbetsobjekt.
  • Jag tror att metoden är baserad på följande REST-API: Hämta arbetsobjekt i batch

Du kan hitta ett rått exempel på hur man använder det (Hämta lista över arbetsobjekt för specifika fält):

{
  "ids": [
    297,
    299,
    300
  ],
  "fields": [
    "System.Id",
    "System.Title",
    "System.WorkItemType",
    "Microsoft.VSTS.Scheduling.RemainingWork"
  ]
}