尝试列出来自 REST API 的过滤订阅

Trying to list filtered subscriptions from REST API

我正在尝试显示来自 Azure API 管理的 REST API 的订阅。根据 documentation,我应该能够在查询字符串中指定一个 $filter 参数,但是我不清楚过滤器字符串应该采用什么格式,至少可以说示例很薄。

这是我的代码:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri(baseUrl);
    client.DefaultRequestHeaders.Add("Authorization", _azureApiManagementFunctions.CreateSharedAccessToken());
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/json"));

    string filter = "ownerId eq " + "/users/" + user.Id; //this is likely where the issue is

    response = await client.GetAsync("/subscriptions" + "?api-version=" + apiVersion + "&$filter=" + filter);
    var contents = await response.Content.ReadAsStringAsync();
    var contentsJson = JsonConvert.DeserializeObject<ApimSubscription>(contents);
};

我返回一个错误:

"{\"error\":{\"code\":\"ValidationError\",\"message\":\"Invalid filter clause specified: 'ownerId eq /users/[removed]'.\",\"details\":null}}"

我也试过将过滤器设置为 "ownerId eq " + user.userId

所以我的问题是,有没有人以前使用过这样的过滤器参数,你对我如何获得单个用户的订阅有什么建议吗?

总结

$filter=contains(properties/ownerId, 'users/1')

  • 基于检查 Azure 门户 UI 请求

  • 第 18 步 中,您的代码经过修改

  • 如果您之前创建过服务,请跳至第 3 步

第 1 步:创建

第 2 步:填充

  • 等待 15m 到 60m

第 3 步:打开资源

第 4 步:开启订阅

第 5 步:打开开发者工具

  • 然后在下一步之前转到网络分流器

  • 否则请求不会被记录

第 6 步:过滤

第 7 步:检查请求

第 8 步:复制 x-ms-path-query

  • 文本会像这样

/subscriptions/xxxxxxxxxxxxxxxxxxxx/resourceGroups/Whosebug54171031-AMS-ResourceGroup/providers/Microsoft.ApiManagement/service/Whosebug54171031-AMS-Name/subscriptions?api-version=2018-01-01&$filter=((contains(properties/displayName,%20'jason-shave-msft')%20or%20contains(properties/stateComment,%20'jason-shave-msft')%20or%20contains(properties/userId,%20'jason-shave-msft')%20or%20contains(properties/productId,%20'jason-shave-msft')))%20and%20(properties/productId%20eq%20'starter')&$top=10

第 9 步:解码 URL

/subscriptions/xxxxxxxxxxxxxxxxxxxx/ resourceGroups/Whosebug54171031-AMS-ResourceGroup/ providers/Microsoft.ApiManagement/ service/Whosebug54171031-AMS-Name/ subscriptions? api-version=2018-01-01& $filter=( (contains(properties/displayName, 'jason-shave-msft') or contains(properties/stateComment, 'jason-shave-msft') or contains(properties/userId, 'jason-shave-msft') or contains(properties/productId, 'jason-shave-msft')) ) and (properties/productId eq 'starter')&$top=10

第 10 步:格式化 $filter 参数

  • 文字会变成这样

    $filter=
        (
            (
            contains(properties/displayName, 'jason-shave-msft') or 
            contains(properties/stateComment, 'jason-shave-msft') or 
            contains(properties/userId, 'jason-shave-msft') or 
            contains(properties/productId, 'jason-shave-msft')
            )
        ) 
        and 
        (
            properties/productId eq 'starter'
        )
    

第 11 步:打开文档

第 12 步:点击尝试

第 13 步:登录

  • 输入您的天蓝色邮箱

第 14 步:选择

第 15 步:输入参数并尝试不使用过滤器

  • 往下看结果

第 16 步:输入过滤器并尝试

第 17 步:C# 示例

      var userid = 1;

      var filter_ownerId = 
               $"contains(properties/ownerId, 'users/{userid}')";

      var filter = $"$filter={filter_ownerId}";

      Console.WriteLine(filter);

第 18 步:您的应用代码

var  subscriptionId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
var  resourceGroupName = "Whosebug000000-AMS-ResourceGroup";
var  serviceName = "Whosebug000000-AMS-Name";
var baseUrl = "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceName}"

using (var client = new HttpClient())
{

    client.BaseAddress = new Uri(baseUrl);
    client.DefaultRequestHeaders.Add("Authorization", _azureApiManagementFunctions.CreateSharedAccessToken());
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/json"));

    var filter = $"contains(properties/ownerId, 'users/{user.Id}')";

    response = await client.GetAsync($"/subscriptions?api-version={apiVersion}&$filter={filter}");
    var contents = await response.Content.ReadAsStringAsync();
    var contentsJson = JsonConvert.DeserializeObject<ApimSubscription>(contents);
};

试试这个, 字符串过滤器 = "ownerId eq " + user.Id; 01.May 我知道,您是如何获取用户 ID 的。 02.Can 您调试并发送了正在失败的完整 URL?

检查您使用的 API 版本。此处的文档 https://docs.microsoft.com/en-us/rest/api/apimanagement/subscription/list#subscriptioncontract specifies Subscription contract for API version 2018-06-01-preview (it's on top of the page). The actual API specs are located here: https://github.com/Azure/azure-rest-api-specs/tree/master/specification/apimanagement/resource-manager/Microsoft.ApiManagement.

最后一个稳定版本 - 2018-01-01 - 指定订阅合同有 "userId" 属性 而不是 "ownerId"。后者在预览版中取代了 "userId",并将在下一个稳定版本中保留它的位置。

因此,如果您使用的版本低于 2018-06-01-preview,请使用 $filter=userId eq '/users/XXX' 按用户过滤订阅。或者对于那种特殊情况,您也可以使用不同的端点 - /users/XXX/subscriptions