【问题标题】:Dynamically replacing parameters in URI动态替换 URI 中的参数
【发布时间】:2018-05-15 01:47:34
【问题描述】:

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

    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 能实现这个期望的功能吗?

任何帮助都会很棒!

【问题讨论】:

  • 也在想,可能需要处理多个传入函数的参数。例如,URI 可以是“api/Employee/{id}/accountsettings/{accountId}”
  • 如果 uri 总是在变化,你将不得不手动构建它,可能是带有 {0) {1} 的预定义 url 并使用 string.Format 来填充它们

标签: c# .net dynamic uri dotnet-httpclient


【解决方案1】:

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

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

core Flurl package 非常小且无依赖性。

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 作为string 之外的流畅扩展方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 2016-09-27
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多