ABP应用访问第三方API
第三方API客户端代理
启动模板中包含HttpApi.Client项目,这个项目是应用程序自己的客户端代理,用于提供给其他应用访问。例如Blazor WebAssembly使用HttpApi.Client项目生成的API客户端代理访问应用程序的服务。
本文介绍在应用程序中如何访问其他应用的API。
以下示例项目名称为Avalon.LearnAbp。
创建远程应用服务接口
新建Avalon.LearnAbp.Client.Application.Contracts项目。此项目包含远程应用服务的interface。
设置项目的基命名空间为项目名称,例如:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>Avalon.LearnAbp</RootNamespace>
</PropertyGroup>
</Project>
添加以下两个NuGet包:
Install-Package Volo.Abp.Ddd.Application.Contracts
Install-Package Refit.HttpClientFactory
添加模块类LearnAbpClientApplicationContractsModule:
using Volo.Abp.Application;
using Volo.Abp.Modularity;
namespace Avalon.LearnAbp;
public class LearnAbpClientApplicationContractsModule : AbpModule
{
}
添加Services文件夹,在其中定义远程应用服务interface。例如:
using Refit;
namespace Avalon.LearnAbp.Services
{
public interface IMesApiService
{
[Get("/autoPas/Report")]
Task SendReportMessageAsync(string text);
}
}
-
[Get("/autoPas/Report")]是Refit中的特性,表示向/autoPas/Report端点发起一个GET请求。
然后在Avalon.LearnAbp.Application.Contracts项目中引用Avalon.LearnAbp.Client.Application.Contracts项目,并在其模块类中添加对LearnAbpClientApplicationContractsModule的依赖:
[DependsOn(
typeof(LearnAbpDomainSharedModule),
typeof(LearnAbpClientApplicationContractsModule),
...
)]
public class LearnAbpApplicationContractsModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
LearnAbpDtoExtensions.Configure();
}
}
创建远程应用服务代理
新建Avalon.LearnAbp.Client.Application项目,此项目使用Refit动态生成远程应用服务代理。
设置项目的基命名空间为项目名称,例如:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<RootNamespace>Avalon.LearnAbp</RootNamespace>
</PropertyGroup>
</Project>
在Avalon.LearnAbp.Client.Application项目引用Avalon.LearnAbp.Client.Application.Contracts项目,添加以下两个NuGet包:
Install-Package Volo.Abp.Http.Client
Install-Package Refit.HttpClientFactory
添加模块类LearnAbpClientApplicationModule:
using LearnAbp.Services;
using Microsoft.Extensions.DependencyInjection;
using Refit;
using Volo.Abp.Modularity;
namespace Avalon.LearnAbp;
[DependsOn(
typeof(LearnAbpClientApplicationContractsModule)
)]
public class LearnAbpClientApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
ConfigureRefit(context);
}
private static void ConfigureRefit(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services.AddRefitClient<IMesApiService>()
.ConfigureHttpClient(httpClient =>
{
if (configuration["RemoteServices:Default:BaseUrl"] is string url)
{
httpClient.BaseAddress = new Uri(url);
}
});
}
}
然后在Avalon.LearnAbp.Application项目中引用Avalon.LearnAbp.Client.Application项目,并在其模块类中添加对LearnAbpClientApplicationModule的依赖,例如:
[DependsOn(
typeof(LearnAbpDomainModule),
typeof(LearnAbpApplicationContractsModule),
typeof(LearnAbpClientApplicationModule),
...
)]
public class LearnAbpApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
...
}
}
端点配置
appsettings.json中的RemoteServices节被用于获取默认远程服务地址。简单的配置如下:
{
"RemoteServices": {
"Default": {
"BaseUrl": "http://localhost:53929/"
}
}
}
使用
使用只需注入远程应用服务interface。
public class MyService : ITransientDependency
{
private readonly IMesApiService _mesApi;
public MyService(IMesApiService mesApi)
{
_mesApi = mesApi;
}
public async Task DoIt()
{
await _mesApi.SendReportMessageAsync("ok");
}
}
本文来自博客园,作者:星墨,转载请注明原文链接:https://www.cnblogs.com/yada/p/18663453

浙公网安备 33010602011771号