ABP应用访问第三方API

启动模板中包含HttpApi.Client​项目,这个项目是应用程序自己的客户端代理,用于提供给其他应用访问。例如Blazor WebAssembly使用HttpApi.Client​项目生成的API客户端代理访问应用程序的服务。

本文介绍在应用程序中如何访问其他应用的API。

远程应用服务接口

新建.Application.Contracts.Client​项目。此项目包含远程应用服务的interface。

设置项目的基命名空间为项目名称,例如:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>LearnAbp</RootNamespace>
  </PropertyGroup>
</Project>

添加以下两个NuGet包:

Install-Package Volo.Abp.Ddd.Application.Contracts
Install-Package Refit.HttpClientFactory

添加模块类<ProjectName>ApplicationContractsClientModule​:

using Volo.Abp.Application;
using Volo.Abp.Modularity;

namespace LearnAbp;

public class LearnAbpApplicationContractsClientModule : AbpModule
{
}

添加Services​文件夹,在其中定义远程应用服务interface。例如:

using Refit;

namespace LearnAbp.Services
{
    public interface IMesApiService
    {
        [Get("/autoPas/Report")]
        Task SendReportMessageAsync(string text);
    }
}
  • [Get("/autoPas/Report")]​是Refit中的特性,表示向/autoPas/Report​端点发起一个GET请求。

然后在.Application.Contracts​项目中引用.Application.Contracts.Client​项目,并在其模块类中添加对<ProjectName>ApplicationContractsClientModule​的依赖:

[DependsOn(
    typeof(LearnAbpDomainSharedModule),
    typeof(LearnAbpApplicationContractsClientModule),
	...
)]
public class LearnAbpApplicationContractsModule : AbpModule
{
    public override void PreConfigureServices(ServiceConfigurationContext context)
    {
        LearnAbpDtoExtensions.Configure();
    }
}

远程应用服务代理

新建.Application.Client​项目,此项目使用Refit动态生成远程应用服务代理。

设置项目的基命名空间为项目名称,例如:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <RootNamespace>LearnAbp</RootNamespace>
  </PropertyGroup>
</Project>

.Application.Client​项目引用.Application.Contracts.Client​项目,添加以下两个NuGet包:

Install-Package Volo.Abp.Http.Client
Install-Package Refit.HttpClientFactory

添加模块类<ProjectName>ApplicationClientModule​:

using LearnAbp.Services;
using Microsoft.Extensions.DependencyInjection;
using Refit;
using Volo.Abp.Modularity;

namespace LearnAbp;

[DependsOn(
    typeof(LearnAbpApplicationContractsClientModule)
)]
public class LearnAbpApplicationClientModule : 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);
                }
            });
    }
}

然后在.Application​项目中引用.Application.Client​项目,并在其模块类中添加对<ProjectName>ApplicationClientModule​的依赖,例如:

[DependsOn(
    typeof(LearnAbpDomainModule),
    typeof(LearnAbpApplicationContractsModule), 
    typeof(LearnAbpApplicationClientModule),
	...
    )]
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 @   星墨  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示