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");
    }
}
posted @ 2025-01-10 10:14  星墨  阅读(211)  评论(0)    收藏  举报