本篇內容需要結合上一篇 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