尝试列出来自 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 步:创建
- 打开 https://portal.azure.com 然后 :
第 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);
会输出
$filter=contains(properties/ownerId, 'users/1')
第 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
我正在尝试显示来自 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 步:创建
- 打开 https://portal.azure.com 然后 :
第 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);
会输出
$filter=contains(properties/ownerId, 'users/1')
第 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