Попытка вывести список отфильтрованных подписок из REST API - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь отобразить подписку из REST API управления Azure 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);
};

Я получаю сообщение об ошибке:

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

Я также попытался установить фильтр на "ownerId eq " + user.userId.

Так что мой вопрос: кто-нибудь использовал параметр фильтра, подобный этому, и есть ли у вас предложения о том, как я могу получить подписку (и) для одного пользователя?

Ответы [ 3 ]

0 голосов
/ 14 января 2019

попробуйте это, string filter = "ownerId eq" + user.Id; 01. Могу ли я знать, как вы получаете идентификатор пользователя. 02.Можете ли вы отладить и отправить полный URL-адрес, который получает сбой?

0 голосов
/ 15 января 2019

Проверьте, какую версию 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 / subscription

0 голосов
/ 13 января 2019

Резюме

$ filter = содержит (properties / ownerId, 'users / 1')

  • База для проверки запросов пользовательского интерфейса портала Azure

  • В Шаг 18 - ваш код с модификацией

  • Перейдите к шагу 3, если у вас есть служба, созданная до

Шаг 1: создать

image

Шаг 2: заполнить

image

  • ждать от 15 до 60 м

Шаг 3: открытые ресурсы

image

Шаг 4: открыть подписку

image

Шаг 5: открыть инструменты для разработчиков

image

  • , затем перейдите к сетевому крану перед следующим шагом

  • или запрос не будет обработан

Шаг 6: фильтр

image

Шаг 7: проверить запрос

image

Шаг 8: скопировать x-ms-path-query

  • текст будет таким

/ подписка / xxxxxxxxxxxxxxxxxxxx / resourceGroups / stackoverflow54171031-AMS-ResourceGroup / поставщики / Microsoft.ApiManagement / услуги / stackoverflow54171031-AMS-Name / подписки? апи-версия = 2018-01-01 & $ фильтр = ((содержит (свойства / DisplayName,% 20'jason-бритье-MSFT ')% 20or% 20contains (свойства / stateComment,% 20'jason-бритье-MSFT')% 20or% 20contains (свойства / идентификатор пользователя,% 20'jason-бритье-MSFT ') % 20or% 20contains (свойства / PRODUCTID,% 20'jason-бритье-MSFT ')))% 20and% 20 (свойства / PRODUCTID% 20eq% 20'starter') & $ сверху = 10 * * тысячу восемьдесят-семь

Шаг 9: Расшифруйте URL

/ подписок / xxxxxxxxxxxxxxxxxxxx / resourceGroups / stackoverflow54171031-AMS-ResourceGroup / поставщики / Microsoft.ApiManagement / сервис / stackoverflow54171031-AMS-Name / Подписки? апи-версия = 2018-01-01 & $ Фильтр = ( (содержит (properties / displayName, 'jason-shave-msft') или содержит (свойства / stateComment, 'jason-shave-msft') или содержит (properties / userId, 'jason-shave-msft') или содержит (properties / productId, '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: нажмите попробовать

image

Шаг 13: войти

  • введите адрес электронной почты

Шаг 14: сыр

image

Шаг 15: введите параметры и попробуйте без фильтра

image

  • посмотреть результаты вниз

Шаг 16: войдите в фильтр и попробуйте

image

Шаг 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);
};
...