Динамическая замена параметров в URI - PullRequest
0 голосов
/ 15 мая 2018

Я написал функцию класса утилит, которая принимает URI и идентификатор, который создает HTTPClient с использованием предоставленного URI.

    private async Task<T> GetUriScopedResource<T>(string uri, int id)
    {
        var client = _httpClientFactory.CreateClient(_baseUri);
        client.BaseAddress = new Uri(_baseUri);
        var result = await client.GetAsync($"{uri}{id}");
        return await DeserialiseContentAsync<T>(result);
    }

Выше указано, что динамический параметр должен находиться в конце URI.

Например.

"api/Employee/{id}"

Однако мои требования изменились, и у меня есть метод контроллера, который выглядит следующим образом:

"api/Employee/{id}/accounts"

Как я могу изменить

client.GetAsync($"{relativeUri}{id}");

чтобы динамически заменить {X} для любого предоставленного URI? Может ли URIBuilder достичь желаемой функциональности?

Любая помощь будет отличной!

1 Ответ

0 голосов
/ 15 мая 2018

Если вы ищете красивое структурированное построение URL, Flurl (отказ от ответственности: я автор) может быть полезным.Он имеет статический метод Url.Combine, который, подобно Path.Combine для файлов, обеспечивает 1 и только 1 символ-разделитель между сегментами:

Url.Combine(_baseUri, relativeUri, id, "accounts")

* * * * * * Основной пакет Flurl очень мали без зависимостей.

Flurl.Http добавляет беглому HTTP, Json.NET (de) сериализацию, функции тестирования и интеллектуальное управление HttpClient экземплярами.Ваш пример будет выглядеть следующим образом:

private Task<T> GetUriScopedResource<T>(string uri, int id)
{
    return _baseUri
        .AppendPathSegments(uri, id, "accounts")
        .GetJsonAsync<T>();
}

AppendPathSegments в основном дает вам Url.Combine в качестве метода свободного расширения с string.

...