You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为C#开发的小型REST Api Client服务编写对应接口

C# REST API Client 接口封装实现方案

1. 定义服务抽象接口

首先将需要对外暴露的方法抽象为接口契约,后续所有业务调用都依赖接口而非具体实现类:

public interface ICompanyService
{
    // 现有GET方法契约
    Task<ICollection<CompanyModel>> GetCompanies();
    
    // 后续可按需扩展其他HTTP方法的契约
    // Task<CompanyModel> GetCompanyById(Guid companyId);
    // Task<CompanyModel> CreateCompany(CompanyCreateDto createDto);
    // Task UpdateCompany(Guid companyId, CompanyUpdateDto updateDto);
    // Task DeleteCompany(Guid companyId);
}

2. 调整现有服务类实现接口

让你现有的CompanyService继承并实现上面定义的ICompanyService,原有业务逻辑无需修改:

public class CompanyService : ICompanyService
{
    private readonly HttpClient _httpClient;
    private readonly CompanyClient _companyClient;

    public CompanyService(string url, string token)
    {
        _httpClient = new HttpClient
        {
            BaseAddress = new Uri(url),
        };
        _httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers
            .AuthenticationHeaderValue("Bearer", token);
        _companyClient = new CompanyClient(url, _httpClient);
    }

    // 实现接口定义的GetCompanies方法
    public async Task<ICollection<CompanyModel>> GetCompanies()
    {
        return await _companyClient.CompanyAsync();
    }
}

3. 改造调用逻辑

上层调用改为依赖ICompanyService接口,后续替换服务实现无需修改调用代码:

public static async Task Test()
{
    const string ApiAddress = "https://localhost:44309";
    try
    {
        var authService = new AuthService(ApiAddress);
        var token = await authService.GetToken("test", "test123");
        // 用接口接收实例,解耦调用和实现
        ICompanyService companyService = new CompanyService(ApiAddress, token);
        var companies = await companyService.GetCompanies();
        foreach (var company in companies)
        {
            Console.WriteLine(company.Name);
        }
    }
    catch (Exception exception)
    {
        Console.WriteLine($"ERROR: {exception.Message}");
    }
}

4. 额外优化建议

  • 如果项目使用依赖注入框架,可直接注册接口与实现的映射关系,以.NET内置DI为例:
    services.AddScoped<ICompanyService>(sp => 
    {
        // 可从配置中读取地址、token等参数
        return new CompanyService("https://localhost:44309", "your_token");
    });
    
  • 可复用IHttpClientFactory创建HttpClient,避免手动实例化HttpClient带来的套接字资源耗尽问题
  • 接口抽象后可直接在单元测试中MockICompanyService的返回值,无需真实发起HTTP请求即可完成业务逻辑测试

内容的提问来源于stack exchange,提问作者TheRobertos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:57:04