.NetCore Flurl.Http 4.0.0 以上管理客户端

news/2024/5/19 21:08:30 标签: .netcore, Flurl.Http

参考原文地址:Managing Clients - Flurl

管理客户端
        Flurl.Http 构建在堆栈之上System.Net.Http。如果您熟悉HttpClient,那么您可能听说过这个建议:不要为每个请求创建一个新客户端;重复使用它们,否则将面临后果。AFlurlClient包装单个HttpClient并绑定到相同的生命周期,因此建议是相似的。

无客户端使用
        如果您不想FlurlClient显式管理实例,则不需要;Flurl 会为你做这件事。事实上,在该网站的大多数示例中,客户端都明显缺席:

var result = await "https://some-api.com".GetJsonAsync<T>();

        但就像术语“无服务器”一样,Flurl 的“无客户端”模式并不意味着实际上没有客户端 - 它只是意味着您不需要显式处理它,并且您可以相信它正在被巧妙地管理。为此,Furll 使用 缓存并重用客户端实例FlurlHttp.Clients,这是 的全局单例实例IFlurlClientCache。客户端可以在启动时预先配置: 

FlurlHttp.ConfigureClientForUrl("https://some-api.com")
    .WithSettings(settings => ...)
    .WithHeaders(...)

注意:配置WithSettings部分详细介绍了其他相关方法。

        使用无客户端模式,对同一主机(或更准确地说,方案/主机/端口的相同组合)的所有调用都将重用同一客户端。任何客户端级别的配置(例如默认标头)都将伴随对该主机的所有调用。如果需要,您可以更改此缓存策略。例如,也许您希望对服务的每个版本使用不同的客户端,可通过自定义请求标头进行识别:

FlurlHttp.UseClientCachingStrategy(request =>
    // get the default host-based key by invoking the default caching strategy:
    var name = FlurlHttp.BuildClientNameByHost(request);
    // append the service version from a custom request header, if it exists:
    if (request.Headers.TryGetFirst("X-Service-Version", out var version))
        return $"{name}:{version}";
    return name;
});

        使用自定义缓存策略时,请确保在任何调用之前UseClientCachingStrategy调用.ConfigureClientForUrl

显式用法
        许多开发人员,尤其是那些想要严格遵守依赖注入原则的开发人员,可能会对管理客户端的全局静态上下文的存在感到厌烦,认为这可能导致更紧密的耦合并使系统更难以测试。由于这些原因,Flurl 支持另一种使用模式,其中客户端管理是明确的(并且几乎同样简单):

var client = new FlurlClient("https://some-api.com") // a base URL is optional
    .WithSettings(settings => ...)
    .WithHeaders(...);

var result = await client.Request("path").GetJsonAsync<T>();

        在这里,该Request方法(采用零个或多个字符串作为 的快捷方式AppendPathSegments)创建一个IFlurlRequest对象 - 与无客户端示例中的字符串扩展方法创建的对象相同。因此,在任何一种情况下都可以使用所有相同的流畅、可链接的方法。

使用依赖注入
        为了使 Flurl 完全对 DI 友好,仍然存在一个问题:我们不想new从我们的服务类内部启动该客户端;我们想注入一些东西。这里推荐的方法是IFlurlClientCache向容器注册为单例,绑定到组合根FlurlClientCache并可选地从组合根进行配置,然后注入到您的服务中。IFlurlClientCache支持命名客户端,这在概念上与 IHttpClientFactory 的命名客户端非常相似。

// at service registration:
services.AddSingleton<IFlurlClientCache>(sp => new FlurlClientCache()
    .Add("MyCli", "https://some-api.com"));

// in service class:
public class MyService : IMyService
{
    private readonly IFlurlClient _flurlCli;

    public MyService(IFlurlClientCache clients) {
        _flurlCli = clients.Get("MyCli");
    }
}

         与无客户端模式非常相似,所有客户端都由单个IFlurlClientCache. 但该单例现在由 IoC 容器而不是静态对象控制FlurlHttp。赢!

        在上面的示例中,clients.Get如果尚未创建指定的客户端(在本示例中是在服务注册时),则会引发异常。但在启动时预先创建客户端并不是严格要求的 -GetOrAdd可以改为使用:

_flurlCli = clients.GetOrAdd("MyCli", "https://some-api.com");

         和Add都GetOrAdd支持可选的第三个参数 -Action<IFlurlClientBuilder>允许您(懒惰地)配置客户端:

.Add("MyCli", "https://some-api.com", builder => builder
    .WithSettings(settings => ...)
    .WithHeaders(...)

 翻译的可能不够准确,请见谅,请阅读原文:Managing Clients - Flurl,希望本文对你有帮助。


http://www.niftyadmin.cn/n/5335244.html

相关文章

1.6 面试经典150题 - 跳跃游戏

跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 class Solution…

Hive建表时候用的参数及其含义

1.序列化与反序列化 序列化器&#xff08;Serializer&#xff09;和反序列化器&#xff08;Deserializer&#xff09; SerDe 是两个单词的拼写 serialized(序列化) 和 deserialized(反序列化)。 什么是序列化和反序列化呢&#xff1f; 当进程在进行远程通信时&#xff0c;彼…

第十三章 MySQL

第十三章 MySQL 下面是创建数据库操作 删除数据库 右上角选择要操作的数据库 如果关闭了这个控制台&#xff0c;下次如何找到它呢 也可以对其改名

【软件设计师-从小白到大牛】上、下午题同篇基础篇:第八章(上午题)、第三章(下午题) UML建模

文章目录 前言章节提要一、用例图补充知识真题链接 二、类图和对象图补充知识真题链接 三、顺序图&#xff08;序列图&#xff09;补充知识真题链接 四、 活动图补充知识真题链接 五、状态图补充知识真题链接 六、通信图真题链接 补充构件图&#xff08;组件图&#xff09;真题…

大数据开发之Hadoop(优化新特征)

第 1 章&#xff1a;HDFS-故障排除 注意&#xff1a;采用三台服务器即可&#xff0c;恢复到Yarn开始的服务器快照。 1.1 集群安全模块 1、安全模式&#xff1a;文件系统只接收读数据请求&#xff0c;而不接收删除、修改等变更请求 2、进入安全模式场景 1&#xff09;NameNod…

创业前先把刘强东这两句琢磨明白!不然大概率失败!2024最适合创业的行业!2024年普通人的创业机会在哪里

第一句&#xff0c;真正解决一个问题。 这句话表达了&#xff0c;你的项目一定是要建立在解决具体的问题上&#xff0c;而不是你觉得自己有个好点子&#xff0c;或者好产品就可以了。因为即使你的产品很好&#xff0c;服务很好&#xff0c;如果不能切实的解决某个问题&#xf…

软件是什么?前端,后端,数据库

软件是什么&#xff1f; 由于很多东西没有实际接触&#xff0c;很难理解&#xff0c;对于软件的定义也是各种各样。但是我还是不理解&#xff0c;软件开发中的前端&#xff0c;后端&#xff0c;数据库到底有什么关系呢&#xff01; 这个问题足足困扰了三年半&#xff0c;练习时…

【Git】实习使用记录

Git 高频命令、版本回退、分支操作、文件修改删除、撤销、标签、远程仓库推送、拉取 https://blog.csdn.net/wohu1104/article/details/105601657 浏览器可以访问github仓库&#xff0c;但是使用git就用不了 https://blog.csdn.net/m0_63230155/article/details/132070860 可…