ABP-VNEXT 学习笔记(五)动态API客户端
本篇内容需要结合上一篇 https://www.cnblogs.com/fei686868/p/16625289.html
官方地址:https://docs.abp.io/zh-Hans/abp/latest/API/Dynamic-CSharp-API-Clients
在上一篇中,我们讲到了自动生成api
本篇内容,讲述如何动态生成API客户端,简单的说,就是通过http请求获取数据。但此处,我们是依赖接口层实现,并非自己一个个写http请求。
该功能适用于 微服务场景下。
我们再web2项目中,只引入接口层 AbpAPI.ApplicationContract。 这个是跟上一篇中web1需要引入 实现层不一样的。
需要引入:Volo.Abp.Http.Client 这个包
using AbpAPI; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Autofac; using Volo.Abp.Http.Client; using Volo.Abp.Modularity; namespace AbpAPIWeb2 { [DependsOn(typeof(AbpAPIApplicationContractModule))] //注意,此处引入的是接口层 [DependsOn(typeof(AbpAspNetCoreMvcModule))] [DependsOn(typeof(AbpAutofacModule))] [DependsOn(typeof(AbpHttpClientModule))] //添加依赖 public class AbpAPIWeb2Module : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { base.ConfigureServices(context); //创建动态客户端代理,就这么一句户搞定 context.Services.AddHttpClientProxies( typeof(AbpAPIApplicationContractModule).Assembly ); } public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); base.OnApplicationInitialization(context); } } }
就上面代码中一句户搞定:
//创建动态客户端代理,就这么一句户搞定 context.Services.AddHttpClientProxies( typeof(AbpAPIApplicationContractModule).Assembly );
多个接口层,就写多个
应用上,跟我们日常调用接口方法,没啥区别,中间的http请求过程,abp都处理了
如:
public IStudentService studentService { get; set; } public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { return View(); } public async Task<string> GetName() { string name = await studentService.GetNameAsync(); return name; }
这样就实现了api的调用。
这里面有个注意点需要特别说明一下,经过测试发现:
方法必须是异步的,如果同步的方法,则此处方法调取后,返回的都是null,至于为什么,需要去研究abp源码了。
为什么需要引入接口层,而不是直接写http请求呢,其实大多数微服务框架也是这么操作的。
引入共同的接口层
1:为了约束,做好契约。使代码更规范更容易维护。
2:简洁。在使用时直接调用对方方法,无需配置一大堆的url
附上示例代码:https://gitee.com/fei686868/abpapisample/tree/master/AbpAPISolution
更多分享,请大家关注我的个人公众号: