Arbeiten mit URLs in Erweiterungen und Integrationen

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Sie können über zwei URL-Formulare auf Azure DevOps-Organisationsressourcen und -APIs zugreifen:

URL-Formular Beispiel
Neu https://dev.azure.com/{organization}
Erbe https://{organization}.visualstudio.com

REST-APIs auf Organisationsebene akzeptieren beide URL-Formulare, unabhängig davon, wann Sie die Organisation erstellt haben. Weitere Informationen finden Sie in der REST-API-Referenz zu Azure DevOps Services.

Primäre URL

Jede Organisation verfügt über eine festgelegte primäre URL im neuen oder älteren Formular. Ein Administrator kann die primäre URL ändern. Die Standardeinstellung basiert auf dem Zeitpunkt, an dem Sie die Organisation erstellt haben:

Erstellt Primäre Standard-URL
Am oder nach dem 10. September 2018 Neu
Vor dem 10. September 2018 Erbe

Verwendung der primären URL

Azure DevOps verwendet die primäre URL als Basis für alle URLs, die sie in Hintergrundaufträgen und automatisierten Szenarien erstellt, darunter:

  • Umgebungsvariablen für Pipelineaufgaben (z. B SYSTEM_TEAMFOUNDATIONCOLLECTIONURI. )
  • Dienst-Hooks Ereignis Payloads (wie URLs in resourceContainers)
  • E-Mail, Slack, Microsoft Teams und ähnliche Benachrichtigungen

Der folgende Aufgabenausschnitt zeigt beispielsweise die Organisations-URL an:

$orgUrl = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
Write-Host $orgUrl

Die Ausgabe hängt vom primären URL-Formular der Organisation ab – entweder https://dev.azure.com/{organization} oder https://{organization}.visualstudio.com. Stellen Sie sicher, dass Ihre Pipelines Tasks und Dienst-Hooks Consumer beide URL-Formen verarbeiten.

In REST-APIs zurückgegebene URLs

Unabhängig von der primären URL einer Organisation verwenden URLs, die in der Antwort auf einen REST-API-Aufruf zurückgegeben werden, dieselbe Basis-URL wie die anfordernde URL. Diese Funktion stellt sicher, dass Clients, die eine REST-API mit einer Legacy-URL aufrufen, weiterhin URLs im selben (Legacy)-Formular abrufen. Wenn beispielsweise die Projects-REST-API mithilfe einer Legacy-URL aufgerufen wird, verwenden URLs in der Antwort das Legacyformular:

Anfrage

GET https://Fabrikam.visualstudio.com/_apis/projects/MyProject

Antwort

{
  "id": "e4e4e4e4-ffff-aaaa-bbbb-c5c5c5c5c5c5",
  "name": "MyProject",
  "url": "https://Fabrikam.visualstudio.com/_apis/projects/MyProject"
}

Das Aufrufen derselben API mithilfe der neuen URL (https://dev.azure.com/Fabrikam/_apis/projects/MyProject) führt zu URLs, die im neuen URL-Formular zurückgegeben werden.

Bewährte Methoden

So halten Sie Ihre Erweiterung, Ihr Tool oder Ihre Integration für URL-Änderungen widerstandsfähig:

  • Gehen Sie nicht von einem festen Organisations-URL-Formular aus. Sie kann sich im Laufe der Zeit ändern.
  • Analysieren oder speichern Sie keine URLs, um andere URLs zu erstellen.
  • Gehen Sie nicht davon aus, dass sich eine REST-API immer in derselben Domäne befindet.
  • Verwenden Sie nach Möglichkeit von Microsoft bereitgestellte Clientbibliotheken (.NET, Node.js, Python), da sie die URL-Auflösung automatisch verarbeiten.

Abrufen der URL einer Organisation

Sie können die Basis-URL einer Organisation anhand ihres Namens oder ihrer ID auflösen, indem Sie die globale REST-API der Resource Areas verwendenhttps://dev.azure.com/_apis/resourceAreas. Diese API erfordert keine Authentifizierung.

Ein Ressourcenbereich ist eine Gruppe verwandter REST-API-Endpunkte, die durch eine feste GUID identifiziert werden. Jeder Ressourcenbereich kann eine andere Basis-URL für jede Organisation haben. Die Build-APIs von Fabrikam könnten zum Beispiel https://dev.azure.com/Fabrikam verwenden, während die Release Management-APIs https://vsrm.dev.azure.com/Fabrikam verwenden.

Hinweis

Die REST-API für Ressourcenbereiche gibt URLs basierend auf der festgelegten primären URL der Organisation zurück.

Nach Organisationsname

Ersetzen Sie {organizationName} durch den Namen der Organisation. Die GUID 79134C72-4A58-4B42-976C-04E7115F32BF identifiziert den Zentralen Ressourcenbereich, der Ressourcen wie Projekte enthält.

Anfrage

GET https://dev.azure.com/_apis/resourceAreas/79134C72-4A58-4B42-976C-04E7115F32BF
      ?accountName={organizationName}&api-version=5.0-preview.1

Antwort

{
    "id": "79134C72-4A58-4B42-976C-04E7115F32BF",
    "name": "Core",
    "locationUrl": "https://dev.azure.com/Fabrikam"
}

Das locationUrl Feld enthält die Basis-URL der Organisation.

Nach Organisations-ID

Um die URL anhand der Organisations-GUID anstelle des Namens aufzulösen, verwenden Sie den Abfrageparameter hostId (anstelle von accountName).

GET https://dev.azure.com/_apis/resourceAreas/79134C72-4A58-4B42-976C-04E7115F32BF?hostId={organizationId}&api-version=5.0-preview.1

Abrufen der Basis-URL für eine REST-API

Verwenden Sie die REST-API auf Organisationsebene, um die richtige Basis-URL für jede REST-API nachzuschlagen. Dieser Ansatz sorgt dafür, dass Ihr Code stabil bleibt, wenn sich API-Domänen ändern.

Hinweis

Von Microsoft bereitgestellte Clientbibliotheken (.NET, TypeScript, Node.js, Python) behandeln die URL-Suche automatisch. In .NET gibt VssConnection.GetClient<T>() beispielsweise einen Client zurück, der bereits an die korrekte Basis-URL gebunden ist.

Wenn Sie keine Clientbibliothek verwenden:

  1. Suchen Sie die Ressourcenbereichs-ID für die API, die Sie in der Tabelle "Ressourcenbereichs-ID" benötigen. Der Bereichsname erscheint in der Regel nach /_apis/ in der Route. Gehört z. B /_apis/release/definitions . zum release Bereich (aaaabbbb-0000-cccc-1111-dddd2222eeee).

  2. Rufen Sie die REST-API für Ressourcenbereiche auf Organisationsebene mit dieser ID auf:

    GET https://dev.azure.com/Fabrikam/_apis/resourceAreas/aaaabbbb-0000-cccc-1111-dddd2222eeee?api-version=5.0-preview.1
    
  3. Verwenden Sie das locationUrl Feld aus der Antwort als Basis-URL. In diesem Beispiel lautet https://vsrm.dev.azure.com/Fabrikamdie Basis-URL für die Versionsverwaltung .

Für die REST-API für Ressourcenbereiche sind keine Anmeldeinformationen erforderlich.

Beispiel: Aufrufen der Releases-REST-API aus einer Pipelineaufgabe

Diese Pipelineaufgabe löst die richtige Basis-URL für die Releases-REST-API mithilfe der Organisations-URL aus der SYSTEM_TEAMFOUNDATIONCOLLECTIONURI Umgebungsvariable auf.

Hinweis

Ressourcenbereichs-IDs sind fest und können sicher in Vorgänge und andere Logik eingebettet werden.

$orgUrl = $env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$releaseManagementAreaId = "aaaabbbb-0000-cccc-1111-dddd2222eeee"

# Look up the base URL for Release Management APIs
$orgResourceAreasUrl = "${orgUrl}_apis/resourceAreas/${releaseManagementAreaId}?api-version=5.0-preview.1"
$results = Invoke-RestMethod -Uri $orgResourceAreasUrl
$rmUrl = $results.locationUrl

# Call the release definitions API
$releaseDefinitionsUrl = "${rmUrl}/_apis/release/definitions?api-version=5.0-preview.1"

Ressourcenbereich-IDs

In der folgenden Tabelle sind IDs für allgemeine Ressourcenbereiche aufgeführt. Ressourcenbereich-IDs sind in allen Azure DevOps Services-Organisationen fest und konsistent.

Ressourcenbereichs-ID Name
0d55247a-1c47-4462-9b1f-5e2125590e6 Konto
5D6898BB-45EC-463F-95F9-54D49C71752E Bauen
79bea8f8-c898-4965-8c51-8bbc3966faa8 collection
79134C72-4A58-4B42-976C-04E7115F32BF Kern
31c84e0a-3ece-48fd-a29d-100849af99ba Dashboard
A0848FA1-3593-4AEC-949C-694C73F4C4CE delegierte Authentifizierung
6823169a-2419-4015-b2fd-6fd6f026ca00 Diskussion
A85B8835-C1A1-4AAC-AE97-1C3D0BA72DBD verteilte Aufgabe
7bf94c77-0ce1-44e5-a0f3-263e4ebbf327 drop
6c2b0933-3600-42ae-bf8b-93d4f7e83594 extensionManagement
67349c8b-6425-42f2-97b6-0843cb037473 Favorit
4E080C62-FA21-4FBC-8FEF-2A10A2B38049 Git
4E40F190-2E3F-4D9F-8331-C7788E833080 graph
68DDCE18-2501-45F1-A17B-7931A9922690 Mitgliederberechtigungsverwaltung
b3be7473-68ea-4a81-bfc7-9530baaa19ad NuGet
4C83CFC1-F33A-477E-A789-29D38FFCA52E npm
45fb9450-a28d-476d-9b0f-fb4aedddff73 package
7AB4E64E-C4D8-4F50-AE73-5EF2E21642A5 Verpackung
2E0BF237-8973-4EC9-A581-9C3D679D1776 Rohrleitungen
FB13A388-40DD-4A04-B530-013A739C72EF Politik
8ccfef3d-2b87-4e99-8ccb-66e343d2daa8 Profil
aaaabbbb-0000-cccc-1111-dddd2222eeee Freigabe
57731FDF-7D72-4678-83DE-F8B31266E429 Berichterstellung
EA48A0A1-269C-42D8-B8AD-DDC8FCDCF578 Suche
3B95FB80-FDA-4218-B60E-1052D070AE6B Test
C83EAF52-EDF3-4034-AE11-17D38F25404C Testergebnisse
8AA40520-446D-40E6-89F6-9C9F9CE44C48 TFVC
970AA69F-E316-4D78-B7B0-B7137E47A22C user
5264459E-E5E0-4BD8-B118-0985E68A4EC5 Witz
1d4f49f9-02b9-4e26-b826-2cdb6195f2a9 Arbeit
85f8c7b6-92fe-4ba6-8b6d-fbb67c809341 Arbeitsverfolgung

Die IHostNavigationService Schnittstelle ermöglicht Erweiterungen die Interaktion mit dem übergeordneten Host Frame. Erweiterungen können ihn verwenden, um den URL-Hash zu lesen und festzulegen, zu URLs zu navigieren, die Seite neu zu laden und Abfrageparameter zu verwalten.

import * as SDK from "azure-devops-extension-sdk";
import { CommonServiceIds, IHostNavigationService } from "azure-devops-extension-api";

const navService = await SDK.getService<IHostNavigationService>(CommonServiceIds.HostNavigationService);

Hashwert

// Get the current hash
const hash = await navService.getHash();
console.log("Host hash value: " + hash);

// Listen for hash changes
navService.onHashChanged((hash: string) => {
    console.log("Hash changed to: " + hash);
});

// Set hash (adds a new browser history entry)
navService.setHash("new-hash-value");

// Replace hash (no new history entry)
navService.replaceHash("replaced-hash-value");
// Navigate the host page
navService.navigate("https://dev.azure.com/myorg/myproject");

// Open a new browser window
navService.openNewWindow("https://dev.azure.com/myorg/myproject", "height=400,width=600");

Neuladen und Dokumenttitel

navService.reload();
navService.setDocumentTitle("My Custom Page Title");

Abfrageparameter

// Get current query parameters
const params = await navService.getQueryParams();
console.log(params);

// Set query parameters (pass empty string to remove a parameter)
navService.setQueryParams({ myParam: "value", removeMe: "" });

Die vollständige API finden Sie unter "IHostNavigationService " und "CommonServiceIds".

Nächster Schritt