首页 > 解决方案 > 动态替换 URI 中的参数

问题描述

我编写了一个实用程序类函数,它接受一个 URI 和一个使用提供的 URI 创建 HTTPClient 的 ID。

    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}");

为提供的任何 URI 动态替换 {X}?URIBuilder 能实现这个期望的功能吗?

任何帮助都会很棒!

标签: c#.netdynamicuridotnet-httpclient

解决方案


如果您只是在寻找漂亮的结构化 URL 构建,Flurl(免责声明:我是作者)可能会有所帮助。它有一个静态Url.Combine方法,类似于Path.Combine文件,确保段之间有 1 个且只有 1 个分隔符:

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

核心 Flurl 包非常小且无依赖性。

Flurl.Http添加了流畅的 HTTP、Json.NET(反)序列化、测试功能和智能HttpClient实例管理。您的示例如下所示:

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

AppendPathSegments基本上给你Url.Combine一个流畅的扩展方法 off string


推荐阅读