5.7HttpClient 名称与请求内容

系统默认使用 IHttpClientFactory 创建 HttpClient 实例,并将默认客户端名称设为空字符串(string.Empty)。您可以通过 HttpClientNameAttribute 特性设置创建 HttpClient实例时的客户端名称。

设置 HttpClient 实例的名称(多个基地址)#

系统默认使用 IHttpClientFactory 创建 HttpClient 实例,并将默认客户端名称设为空字符串(string.Empty)。您可以通过 HttpClientNameAttribute 特性设置创建 HttpClient实例时的客户端名称。

HTTP 声明式请求通过 HttpClientNameAttribute 特性来设置 HttpClient 实例的名称。相应的 HTTP 声明式提取器实现为 HttpClientNameDeclarativeExtractor 类型,该类型负责解析 HttpClientNameAttribute 特性并构建 HttpRequestBuilder 实例所需的 HttpClient 实例的名称配置。

cs
// 在接口定义上应用,影响所有方法[HttpClientName(string.Empty)]public interface IHttpService : IHttpDeclarative{    [Get("https://furion.net/")]    Task<string> GetStringAsync();  // 默认客户端    // 在方法上应用    [HttpClientName("weixin")]   // 指定为名为 "weixin" 的客户端    [Get("https://furion.net/")]    Task<string> GetStringAsync();}

您还可以在 Startup.csProgram.cs 文件中为命名 HttpClient 客户端提供配置:

cs
// 配置默认客户端(名称为空字符串)services.AddHttpClient(string.Empty, client => { });// 配置名为 "weixin" 的客户端services.AddHttpClient("weixin", client => { });

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

  • 构造函数

    • new(name):作用于方法或接口,设置 HttpClient 实例的名称。
  • 属性

    • NameHttpClient 实例的名称(string 类型)。

设置请求内容(Body#

支持设置任意类型的请求内容。

HTTP 声明式请求通过 BodyAttribute 特性来配置请求内容。相应的 HTTP 声明式提取器为 BodyDeclarativeExtractor 类型,它负责解析单个 BodyAttribute 特性,并构建 HttpRequestBuilder 实例所需的请求内容配置。

cs
public interface IHttpService : IHttpDeclarative{    // 标记参数为请求内容    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body] object body);   // 自动推断 Content-Type    // 支持设置 Content-Type    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body("application/json")] object body);   // 或使用 [Body(MediaTypeNames.Application.Json)]    // 支持设置 Content-Type 和字符集    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body("application/json; charset=utf-8")] object body);    // URL 编码表单    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body("application/x-www-form-urlencoded")] object body);    // 使用 StringContent 构建 URL 编码表单    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body("application/x-www-form-urlencoded", UseStringContent = true)] object body);    // 可配置不进行 URL 编码处理    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body("application/x-www-form-urlencoded", urlEncode = false)] object body);    // 支持原始 raw 字符串内容    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body(RawString = true)] string body); // 默认内容类型 text/plain    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body("application/json", RawString = true)] string body);    // 支持配置文件路径(或互联网地址)    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body(AsFile = true)] string filePath);    // 冻结参数类型将被忽略    [Post("https://furion.net/")]    Task<string> PostStringAsync([Body] CancellationToken cancellationToken);}

BodyAttribute 标记的参数通过底层的 httpRequestBuilder.SetContent 方法进行设置,支持任意非冻结类型的参数。

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

  • 构造函数

    • new():作用于参数,将参数作为请求内容。
    • new(contentType):作用于参数,将参数作为请求内容,支持设置内容类型。
    • new(contentType, contentEncoding):作用于参数,将参数作为请求内容,支持设置内容类型和编码。
  • 属性

    • ContentType:内容类型(string 类型)。
    • ContentEncoding:内容编码(string 类型)。
    • UseStringContent:是否使用 StringContent 构建 FormUrlEncodedContent,默认值为 false,仅当 ContentTypeapplication/x-www-form-urlencoded 时有效。
    • UrlEncode:是否对表单数据进行 URL 编码(bool 类型),默认值为 true
    • RawString:是否为原始字符串内容(bool 类型),默认值为 false,仅当参数为字符串类型且此属性为 true 时有效。
    • AsFile:将字符串作为文件路径(支持互联网地址)(bool 类型),默认值为 false,仅当参数为字符串类型且此属性为 true 时有效。
    • DisposeResourcesOnRequestCompletion:是否在请求结束后自动释放资源(bool 类型),默认值为 false