使用RESTAPI获取Azure DevOps中的所有组织

使用RESTAPI获取Azure DevOps中的所有组织,rest,azure,azure-devops,azure-devops-rest-api,Rest,Azure,Azure Devops,Azure Devops Rest Api,我正在尝试检索帐户中的所有组织,但在文档中,API调用中始终需要一个组织 https://dev.azure.com/{organization}/_apis/... REST API请求/响应对可分为五个组件: 请求URI的格式如下: VERB https://{instance}[/{team-project}]/_apis[/{area}]/{resource}?api-version={version} 实例: 将请求发送到的Azure DevOps服务组织或TFS服务器 它们的结构

我正在尝试检索帐户中的所有组织,但在文档中,API调用中始终需要一个组织

https://dev.azure.com/{organization}/_apis/...

REST API请求/响应对可分为五个组件:

请求URI的格式如下:

VERB https://{instance}[/{team-project}]/_apis[/{area}]/{resource}?api-version={version}
实例: 将请求发送到的Azure DevOps服务组织或TFS服务器

它们的结构如下: Azure DevOps服务:
dev.Azure.com/{organization}

RESTAPI是特定于组织的。这是目前没有记录的。您可以在此处提交功能请求:

我们的项目经理和产品团队将认真审查您的建议。很抱歉给您带来不便


作为一种解决方法,您可以使用Matt提到的从网络流量捕获的API。

如果加载当前登录页,它将显示与您的帐户相关的所有组织。我认为它必须以某种方式获得这些信息。我捕获了网络流量,我相信您可以使用系统API调用获取所需的数据。但是,它可能会更改或不受支持,恕不另行通知,因此请自行决定使用

您可以使用此API获取所需的信息:

Post https://dev.azure.com/{organization1}/_apis/Contribution/HierarchyQuery?api-version=5.0-preview.1
正文:

{
    "contributionIds": ["ms.vss-features.my-organizations-data-provider"],
    "dataProviderContext":
        {
            "properties":{}
        }
}
{
    "dataProviderSharedData": {},
    "dataProviders": {
        "ms.vss-web.component-data": {},
        "ms.vss-web.shared-data": null,
        "ms.vss-features.my-organizations-data-provider": {
            "organizations": [
                {
                    "id": "{redacted id}",
                    "name": "{organization1}",
                    "url": "https://{organization1}.visualstudio.com/"
                },
                {
                    "id": "{redacted id}",
                    "name": "{organization2}",
                    "url": "https://dev.azure.com/{organization2}/"
                }
            ],
            "createNewOrgUrl": "https://app.vsaex.visualstudio.com/go/signup?account=true"
        }
    } }
响应:

{
    "contributionIds": ["ms.vss-features.my-organizations-data-provider"],
    "dataProviderContext":
        {
            "properties":{}
        }
}
{
    "dataProviderSharedData": {},
    "dataProviders": {
        "ms.vss-web.component-data": {},
        "ms.vss-web.shared-data": null,
        "ms.vss-features.my-organizations-data-provider": {
            "organizations": [
                {
                    "id": "{redacted id}",
                    "name": "{organization1}",
                    "url": "https://{organization1}.visualstudio.com/"
                },
                {
                    "id": "{redacted id}",
                    "name": "{organization2}",
                    "url": "https://dev.azure.com/{organization2}/"
                }
            ],
            "createNewOrgUrl": "https://app.vsaex.visualstudio.com/go/signup?account=true"
        }
    } }
我们一直在使用“”,但没有指定任何API版本,这将返回所有帐户名

这仍然适用于我们,但是由于其他一些问题,我将api版本添加到所有api调用中。为此,我还遇到了需要成员或所有者id的事实

检索需要一个帐户/组织,因此这有点像一个“第二十二条军规”


现在,我只想使用“我想我得到了“app.vssps.visualstudio.com/_api/accounts”和“app.vssps.visualstudio.com/_api/accounts”的登录响应 Post{organization1}/_api/Contribution/HierarchyQuery?api版本=5.0-preview.1

状态代码:203 状态描述:非权威信息

编辑: 无论如何,它使用静态MSA clientid和replyURL工作:

internal const string clientId = "872cd9fa-d31f-45e0-9eab-6e460a02d1f1";          //change to your app registration's Application ID, unless you are an MSA backed account
            internal const string replyUri = "urn:ietf:wg:oauth:2.0:oob";                     //change to your app registration's reply URI, unless you are an MSA backed account

 //PromptBehavior.RefreshSession will enforce an authn prompt every time. NOTE: Auto will take your windows login state if possible
            result = ctx.AcquireTokenAsync(azureDevOpsResourceId, clientId, new Uri(replyUri), promptBehavior).Result;
            Console.WriteLine("Token expires on: " + result.ExpiresOn);

            var bearerAuthHeader = new AuthenticationHeaderValue("Bearer", result.AccessToken);

// Headers
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("User-Agent", "ManagedClientConsoleAppSample");
            client.DefaultRequestHeaders.Add("X-TFS-FedAuthRedirect", "Suppress");
            client.DefaultRequestHeaders.Authorization = authHeader;


            //Get Organizations
            client.BaseAddress = new Uri("https://app.vssps.visualstudio.com/");
            HttpResponseMessage response1 = client.GetAsync("_apis/accounts").Result;

您只需打电话获取您所拥有的所有帐户即可。然而,对于这一点,您需要您的id,通过进行get profile调用可以轻松获取该id。以下是步骤:

  • 使用承载令牌或PAT进行VSTS API调用以获取配置文件详细信息
  • 这将返回您的身份证:

    {
    “显示名称”:“xxxx”,
    “publicAlias”:“xxx”,
    “电子邮件地址”:“xxx”,
    “核心修订”:xxx,
    “时间戳”:“2019-06-17T09:29:11.1917804+00:00”,
    “id”:“{我们需要这个}}”,
    “修订”:298459751
    }
    
  • 接下来,打电话获取您所属的所有帐户:
  • Id}}

    答复:

    {
    “计数”:1,
    “价值”:[
    {
    “帐户ID”:“xxx”,
    “accountUri”:“xxx”,
    “账户名称”:“xxx”,
    “属性”:{}
    }
    ]
    }
    

    它将返回与您关联的帐户列表。

    太好了,它工作正常!感谢您的共享请求中的{organization1}是什么?在进行身份验证之后,我唯一拥有的是一个令牌,我可以使用它发出API请求。我没有任何组织。我怎样才能得到第一个呢?应该是任何一个组织。我希望你至少有一个。在dev.azure.com/I获得
    后,远程服务器返回错误:(401)未经授权。
    尝试“”调用时,很可能是默认情况。我正在使用WebClient和其他AzDO REST API请求的标准头。accounts API在使用个人访问令牌时对我有效,但在使用OAuth令牌时无效