5.26设置请求基地址

创建于 2026 年 8 月 17 日约 2 分钟读完

当需要对接多个第三方 API 时,我们通常会全局注册并配置多个 HttpClient 实例的 BaseAddress。例如:

cs
// 配置默认客户端的基地址services.AddHttpClient(string.Empty, client =>{    client.BaseAddress = new Uri("https://furion.net/");});// 配置GitHub客户端的基地址services.AddHttpClient("github", client =>{    client.BaseAddress = new Uri("https://github.com/");});

随后可通过 [HttpClientName(客户端名称)] 特性指定要使用的客户端。

除了全局配置,框架还支持在声明式请求中局部设置基地址,允许在构建请求时动态指定。

HTTP 声明式请求通过 BaseAddressAttribute 特性来设置请求基地址。相应的 HTTP 声明式提取器实现为 BaseAddressDeclarativeExtractor 类型,该类型负责解析 BaseAddressAttribute 特性并构建 HttpRequestBuilder 实例所需的请求基地址配置。

cs
// 在接口定义上应用,影响所有方法[BaseAddress("https://furion.net")]public interface IHttpService : IHttpDeclarative{    [Get("/api/test")]    Task<string> GetStringAsync();    // 在方法上应用    [BaseAddress("https://baiqian.com")]    [Get("/api/test/2")]    Task<string> GetStringAsync();    // 可充当前缀使用    [BaseAddress("/furion")]    [Get("/api/test/2")]    Task<string> GetStringAsync();}

启用后,发送 HTTP 远程请求时会自动设置请求基地址。

处理逻辑说明

  • 若请求地址为绝对地址,则直接使用该地址发送请求。
  • 若请求地址为相对地址:
    • 未设置局部 BaseAddress 时,将其与全局 HttpClient 实例的 BaseAddress 拼接,作为最终请求地址。
    • 已设置局部 BaseAddress 时:
      • 若局部 BaseAddress 为相对地址,则先将局部 BaseAddress 拼接到请求地址前,再与全局 BaseAddress 拼接。
      • 若局部 BaseAddress 为绝对地址,则直接将该绝对地址与请求地址拼接,作为最终请求地址(此时忽略全局 BaseAddress)。

BaseAddressAttribute 包含以下构造函数和属性:

  • 构造函数

    • new(baseAddress):作用于方法或接口,设置请求基地址。
  • 属性

    • BaseAddress:请求基地址(string 类型)。