C# 尝试从REST API列出筛选的订阅

C# 尝试从REST API列出筛选的订阅,c#,azure,azure-api-management,C#,Azure,Azure Api Management,我正在尝试显示来自Azure API管理的REST API的订阅。根据,我应该能够在查询字符串中指定一个$filter参数,但是我不清楚过滤器字符串应该采用什么格式,而且示例很简单 这是我的密码: using (var client = new HttpClient()) { client.BaseAddress = new Uri(baseUrl); client.DefaultRequestHeaders.Add("Authorization", _azureApiManag

我正在尝试显示来自Azure API管理的REST API的订阅。根据,我应该能够在查询字符串中指定一个
$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);
};
使用(var-client=new-HttpClient())
{
client.BaseAddress=新Uri(baseUrl);
client.DefaultRequestHeaders.Add(“授权”,_azureapimagementfunctions.CreateSharedAccessToken());
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“text/json”);
string filter=“ownerId eq”+“/users/”+user.Id;//这可能就是问题所在
response=wait client.GetAsync(“/subscriptions”+”?api version=“+apiVersion+”&$filter=“+filter”);
var contents=wait response.Content.ReadAsStringAsync();
var contentsJson=JsonConvert.DeserializeObject(内容);
};
我得到一个错误:

“{\”error\”:{\“code\”:\“ValidationError\”,“message\”:\“指定的筛选器子句无效:'ownerId eq/users/[removed]'。\”,“details\”:null}“

我还尝试将过滤器设置为
“ownerideq”+user.userId

因此,我的问题是,以前是否有人使用过这样的筛选参数?您对如何为单个用户获取订阅有何建议?

Summary $filter=contains(属性/ownerId,“用户/1”)

  • 基于检查Azure门户UI请求

  • 步骤18中是经过修改的代码

  • 如果您以前创建过服务,请跳到步骤3

步骤1:创建
  • 然后打开:

第2步:填充

  • 等待15米到60米
步骤3:开放资源

步骤4:公开订阅

步骤5:开放开发人员工具

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

  • 否则请求将不会被记录

步骤6:过滤器

步骤7:检查请求

步骤8:复制x-ms-path-query
  • 文本将是这样的
/订阅/XXXXXXXXXXXXXX/resourceGroups/stackoverflow54171031 AMS ResourceGroup/providers/Microsoft.ApiManagement/service/stackoverflow54171031 AMS Name/subscriptions?api版本=2018-01-01&$filter=((包含(属性/显示名称,%20'jason-shave-msft')%20或%20包含(属性/状态注释,%20'jason-shave-msft')%20或%20包含)(属性/userId,%20'jason-shave-msft')%20或%20包含(属性/productId,%20'jason-shave-msft'))))%20和%20(属性/产品ID%20eq%20'starter')&$top=10

步骤9:解码URL
  • 我曾经

  • 文本将是这样的

  • $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'
        )
    
/订阅/XXXXXXXXXXXXXX/ 资源组/堆栈溢出54171031 AMS资源组/ 提供程序/Microsoft.API管理/ 服务/堆栈溢出54171031 AMS名称/ 订阅费? api版本=2018-01-01& $filter=( (包含(属性/显示名称“jason shave msft”)或 包含(属性/状态注释“jason shave msft”)或 包含(属性/用户ID,“jason shave msft”)或 包含(属性/产品ID“jason shave msft”)) )和(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:登录
  • 输入你的azure电子邮件
步骤14:choese

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

  • 看到结果了吗
步骤16:输入过滤器并重试

第17步:c#样本
  • 将输出

    $filter=contains(属性/ownerId,“用户/1”)

  • 试试这里

第18步:你的应用程序代码
var subscriptionId=“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”;
var resourceGroupName=“stackoverflow000000 AMS ResourceGroup”;
var serviceName=“stackoverflow000000 AMS名称”;
var baseUrl=”https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.apimagement/service/{serviceName}”
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(baseUrl);
client.DefaultRequestHeaders.Add(“授权”,_azureapimagementfunctions.CreateSharedAccessToken());
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“text/json”);
var filter=$“包含(properties/ownerId,'users/{user.Id}')”;
response=wait client.GetAsync($“/subscriptions?api version={apiVersion}&$filter={filter}”);
var contents=wait response.Content.ReadAsStringAsync();
var contentsJson=JsonConvert.DeserializeObject(内容);
};
试试这个, string filter=“ownerId eq”+user.Id; 01.我可以知道你是如何获得用户ID的吗。
02.能否调试并发送失败的完整URL?

检查您使用的API版本。此处的文档指定了API版本2018-06-01-preview的订阅合同(位于页面顶部)。实际的API规范位于此处:

最后一个稳定版本-2018-01-01-指定订阅合同具有“userId”属性,而不是“ownerId”。后者已在预览版本中替换“userId”,并将在下一个稳定版本中保留其位置


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

不确定您的问题中是否有输入错误,但您在API r中编写了
fitler
而不是
filter
esource string…谢谢@oerkelens.Updated。现在收到一个筛选器错误。根据示例,我想知道
/users/
在您的筛选器中做了什么。如果您
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);
};