【问题标题】:Trying to list filtered subscriptions from REST API尝试列出来自 REST API 的过滤订阅
【发布时间】:2019-01-13 16:48:17
【问题描述】:

我正在尝试显示来自 Azure API Management 的 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

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

【问题讨论】:

  • 不确定是否是您的问题中的拼写错误,但您在 API 资源字符串中写了 fitler 而不是 filter...
  • 谢谢@oerkelens。更新。现在出现过滤器错误。
  • 基于示例here 我想知道/users/ 在您的过滤器中做了什么。如果只使用$"ownerId eq {user.Id}"$"ownerId eq '{user.Id}'" 会发生什么?
  • 谢谢。同样产生的错误。
  • 我想使用这个 API 获取带有响应对象的用户的密码,你能帮我做同样的事情吗?

标签: c# azure azure-api-management


【解决方案1】:

试试这个, 字符串过滤器 = “ownerId eq” + user.Id; 01.May我知道,你是如何获得用户ID的。 02.能否调试并发送失败的完整URL?

【讨论】:

  • 那行得通。由于某种原因,我之前对此的测试失败了,但我认为这与另一个问题有关。
  • 你好 Inzi,我想通过这个 API 获取用户对象的密码,请帮我获取用户的密码。
【解决方案2】:

总结

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

  • 基于检查 Azure 门户 UI 请求

  • 第 18 步 中是您修改后的代码

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

第 1 步:创建

第 2 步:填充

  • 等待 15m 到 60m

第 3 步:打开资源

第四步:开启订阅

第 5 步:打开开发者工具

  • 然后转到在下一步之前点击网络

  • 否则请求将不会被记录

第 6 步:过滤

第 7 步:检查请求

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

​​>
  • 文字会是这样的

/subscriptions/xxxxxxxxxxxxxxxxxxxx/resourceGroups/stackoverflow54171031-AMS-ResourceGroup/providers/Microsoft.ApiManagement/service/stackoverflow54171031-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

/订阅/xxxxxxxxxxxxxxxxxxxx/ resourceGroups/stackoverflow54171031-AMS-ResourceGroup/ 提供者/Microsoft.ApiManagement/ 服务/stackoverflow54171031-AMS-名称/ 订阅? api版本=2018-01-01& $过滤器=( (包含(属性/显示名称,'jason-shave-msft')或 contains(properties/stateComment, 'jason-shave-msft') 或 contains(properties/userId, 'jason-shave-msft') 或 包含(属性/productId,'jason-shave-msft')) ) 和 (properties/productId eq 'starter')&$top=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 步:登录

  • 输入您的 azure 电子邮件

第 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 = "stackoverflow000000-AMS-ResourceGroup";
var  serviceName = "stackoverflow000000-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”(userId)值,并且一直在尝试在 REST API“try it”示例中,正如您所展示的,但是我使用的内容没有变化,或者您的示例有效。
  • @JasonShave-MSFT 你得到没有过滤器的结果吗?
  • 是的,我相信我在原始帖子中提到了这一点。此外,为了测试我想要的给定数据的 API,我只需要确定 userId (guid) 的步骤,这可以在 Azure 管理控制台中的订阅下轻松找到。 ownerId 列在表中的路径中。我很欣赏所有概述步骤,但您可能会省略 99%。
  • 您尝试过第 16 步吗?获取所有结果,然后获取用户 ID,现在重试第 16 步并将 (1) 替换为用户 ID
  • 还需要帮助吗?我们可以去聊天
【解决方案3】:

检查您使用的 API 版本。此处的文档https://docs.microsoft.com/en-us/rest/api/apimanagement/subscription/list#subscriptioncontract 指定 API 版本 2018-06-01-preview 的订阅合同(位于页面顶部)。实际的 API 规范位于此处: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

【讨论】:

    猜你喜欢
    • 2014-12-02
    • 2016-09-27
    • 2019-07-07
    • 2022-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多