3.28地址与浏览器标识

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

配置请求基地址#

当需要对接多个第三方 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/");});

随后可通过 .SetHttpClientName(客户端名称) 方法指定要使用的客户端。

除了全局配置,框架还支持在单次请求中局部设置基地址的方法,允许在构建请求时动态指定:

cs
// 使用字符串设置基地址HttpRequestBuilder.Get("/api/test")    .SetBaseAddress("https://furion.net");// 使用 Uri 对象设置基地址HttpRequestBuilder.Get("/api/test")    .SetBaseAddress(new Uri("https://furion.net"));// 可充当前缀使用HttpRequestBuilder.Get("/api/test")    .SetBaseAddress("/furion");

处理逻辑说明

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

配置来源地址 Referer#

当访问某些第三方服务器时,服务器可能会验证请求头中的 Referer 来源地址。例如在下载图片时,可能因触发防盗链机制导致获取的图片不符合预期。此时,可通过 SetReferer 方法来设置 Referer 请求头,模拟来源页面以绕过防盗链检测。

cs
HttpRequestBuilder.Get("https://furion.net/logo.png")    .SetReferer("https://furion.net/");    // 伪造是从首页发出的请求

为简化配置,框架提供了内置模板字符串 "{BASE_ADDRESS}",可自动提取请求地址的基地址作为 Referer

cs
HttpRequestBuilder.Get("https://furion.net/logo.png")    .SetReferer("{BASE_ADDRESS}");  // 发送时自动替换 {BASE_ADDRESS} 为 https://furion.net/

配置 User-Agent#

User-Agent 请求标头是一个特征字符串,使得服务器和对等网络能够识别发出请求的用户代理的应用程序、操作系统、供应商或版本信息。框架提供了 SetUserAgent 方法来设置 User-Agent 请求头。

cs
HttpRequestBuilder.Get("https://furion.net/logo.png")    .SetUserAgent(UserAgents.Chrome.PC)    // 使用 UserAgents 静态类便捷设置    .SetUserAgent(UserAgents.Chrome.Mobile)    // 设置为移动端 User-Agent    .SetUserAgent(UserAgents.GetRandom())   // 随机获取一个浏览器类型的 User-Agent    .SetUserAgent(UserAgents.GetByBrowser("Safari"))   // 获取指定浏览器类型的 User-Agent    .SetUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36");    // 或直接设置 User-Agent 字符串

UserAgents 是框架提供的静态类,用于便捷设置主流浏览器的 User-Agent 标识,包含以下成员:

  • 静态方法

    • GetRandom(isMobile): 随机获取一个浏览器的 User-Agent
    • GetByBrowser(browser, isMobile):获取指定浏览器类型的 User-Agent
  • 静态成员

    • Chrome:Google Chrome 浏览器
      • PC:桌面端 User-Agent 标识
      • Mobile:移动端 User-Agent 标识
    • Firefox:Mozilla Firefox 浏览器
      • PC:桌面端 User-Agent 标识
      • Mobile:移动端 User-Agent 标识
    • Safari:Apple Safari 浏览器
      • PC:桌面端 User-Agent 标识
      • Mobile:移动端 User-Agent 标识
    • Edge:Microsoft Edge 浏览器
      • PC:桌面端 User-Agent 标识
      • Mobile:移动端 User-Agent 标识
    • Opera:Opera 浏览器
      • PC:桌面端 User-Agent 标识
      • Mobile:移动端 User-Agent 标识
    • Generic:通用浏览器
      • PC:桌面端 User-Agent 标识
      • Mobile:移动端 User-Agent 标识

配置 HTTP 版本#

在发起 HTTP 远程请求时,默认采用的 HTTP 协议版本为 1.1。不过,在访问部分第三方服务器时,这些服务器可能会对 HTTP 版本进行校验(例如,要求使用 2.0 版本)。此时,可以通过以下两种方式进行设置:

  • 单次请求设置
cs
HttpRequestBuilder.Post("https://furion.net/")    .SetVersion(HttpVersion.Version20); // 推荐    .SetVersion("1.2"); // 重载方法    .SetVersion(new Version("1.2"));    // 重载方法
  • 全局配置
cs
// 配置默认客户端services.AddHttpClient(string.Empty, client =>{    client.DefaultRequestVersion = HttpVersion.Version10;});// 配置特定客户端services.AddHttpClient("weixin", client =>{    client.DefaultRequestVersion = HttpVersion.Version10;});