Refit在ASP.NET Core中的实践
<h2 id="前言">前言 声名式服务调用,己经不算是一个新鲜的话题了,毕竟都出来好些年了。 下面谈谈,最近项目中用到一个这样的组件的简单实践。 目前部分项目用到的是这个组件,都是配合HttpClientFactory来使用的。 关于HttpClientFactory的一些简单介绍,可以参见官方文档,也可以看看前面的两篇比较粗略的相关介绍。 也简单介绍一下背景,目前主要有两类的API接口: 第一类是注册到Eureka中的,可以通过服务发现的方式来请求的,这里的都是新的接口。 第二类是原始的接口,不能走服务发现,只能通过直连请求的方式来调用,这里的都是些老接口。 换句话就是说,要同时兼容这两类接口。 由于用HttpClientFactory集成服务发现十分简单,所以优先选了一个本身就带有HttpClientFactory的组件--Refit。 Refit是一个自动类型安全的REST库,是RESTful架构的.NET客户端实现, 它基于Attribute,提供了把REST API返回的数据转化为(Plain Ordinary C# Object,简单C#对象),POCO to JSON,网络请求(POST,GET,PUT,DELETE等)封装,内部封装使用HttpClient,前者专注于接口的封装,后者专注于网络请求的高效,二者分工协作。 我们的应用程序通过 refit请求网络,实际上是使用 refit接口层封装请求参数、Header、Url 等信息,之后由 HttpClient完成后续的请求操作,在服务端返回数据之后,HttpClient将原始的结果交给 refit,后者根据用户的需求对结果进行解析的过程。 更多细节可以参考Refit的 直接上控制器的代码了?? // GET: api/persons [HttpGet] public IEnumerable <h2 id="refit的使用">Refit的使用 先通过Nuget安装Refit的包。 然后就是定义我们的interface了 public interface IPersonsApi { [Get("/api/persons")] Task 来看看这个interface里面涉及到的部分内容。
然后是配合HttpClientFactory 再通过Nuget安装一下Refit.HttpClientFactory 如果PersonApi是注册到Euerka的,可以再添加Steeltoe的引用。 public void ConfigureServices(IServiceCollection services) { services.AddRefitClient 前面在定义IPersonApi的时候,我们只指定了相对路径,而请求IP并没有指定,这里是放到ConfigureHttpClient里面去指定了。 同时根据不同环境,配置不同的appsettings.{env}.json,达到切换的效果。 同样的,如果想走服务发现,只需要放开注释的AddHttpMessageHandler,同时修改BaseeAddress为服务名的形式就可以了。 说了这么多,都还只是配置阶段,下面就来看看具体怎么用。 为了演示方便,就不在建一个Service层了,直接在控制器调用一下。 用法也很简单,直接在控制器注入一下就可以使用了。 [Route("api/[controller]")] [ApiController] public class ValuesController : ControllerBase { private readonly IPersonsApi _api; public ValuesController(IPersonsApi api) { this._api = api; } 到这里,代码层面的东西已经处理完了。 下面来看看使用Refit效果(这里只看两个Get请求的): 都是能正常拿到我们期望的结果。 最后再看看输出的日志,确认一下。 首先是访问 确确实实是向我们前面的PersonApi发起了请求。 然后是访问 可见我们上面的别名(AliasAs)是起了效果的,能拼成正确的请求地址。 至于其他类型的请求,这里就不演示了,让大家自己去尝试一下吧。 Refit用起来还是比较简单的,运行了一段时间也还表现正常! 当然本文介绍的也只是一些基本的用法!它还具有不错的扩展性,可以让我们根据自身需求做一些定制化的东西。 本文的示例代码 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – Web事件提供程序’EventLogProvider’抛出以下异
- asp.net/C#中的请求来源
- asp.net – 在编辑模式下未选择的Html.DropDownListFor值
- asp.net – 尝试的转移似乎包含数据泄漏?
- asp.net-mvc – ASP.Net Core中的动态路由
- asp.net-mvc – IIS 8.5 – 应用程序初始化无效
- wpf – MVVM模型验证和数据绑定?
- asp.net-core – 当前上下文中不存在名称“SqlServerValueG
- asp.net-mvc – 如何获取某些代码在ASP.NET MVC 2中的每个单
- asp.net-mvc – ASP.NET MVC:仅由其他操作调用的Action
- asp.net-mvc-4 – ASP.NET MVC4模型没有绑定
- asp.net – 从.net应用程序下载4GB文件
- asp.net – 使用以前输入的值防止文本框自动填充
- asp.net – 使用外部connectionStrings.config文
- asp.net-mvc-4 – .Net MVC4显示错误的视图(.mob
- asp.net-mvc – 是否违反命令查询分离命令运行查
- asp.net – 以编程方式将Textbox TemplateField列
- asp.net-mvc – ASP.Net MVC在使用Ajax.ActionLi
- asp.net-mvc – Telerik mvc grid,columns.bound
- asp.net-web-api – 从ExceptionLogger引用操作参