5.7HttpClient 名称与请求内容
系统默认使用 IHttpClientFactory 创建 HttpClient 实例,并将默认客户端名称设为空字符串(string.Empty)。您可以通过 HttpClientNameAttribute 特性设置创建 HttpClient实例时的客户端名称。
设置 HttpClient 实例的名称(多个基地址)#
系统默认使用 IHttpClientFactory 创建 HttpClient 实例,并将默认客户端名称设为空字符串(string.Empty)。您可以通过 HttpClientNameAttribute 特性设置创建 HttpClient实例时的客户端名称。
HTTP 声明式请求通过 HttpClientNameAttribute 特性来设置 HttpClient 实例的名称。相应的 HTTP 声明式提取器实现为 HttpClientNameDeclarativeExtractor 类型,该类型负责解析 HttpClientNameAttribute 特性并构建 HttpRequestBuilder 实例所需的 HttpClient 实例的名称配置。
// 在接口定义上应用,影响所有方法[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.cs 或 Program.cs 文件中为命名 HttpClient 客户端提供配置:
// 配置默认客户端(名称为空字符串)services.AddHttpClient(string.Empty, client => { });// 配置名为 "weixin" 的客户端services.AddHttpClient("weixin", client => { });HttpClientNameAttribute 包含以下构造函数和属性:
-
构造函数:
new(name):作用于方法或接口,设置HttpClient实例的名称。
-
属性:
Name:HttpClient实例的名称(string类型)。
设置请求内容(Body)#
支持设置任意类型的请求内容。
HTTP 声明式请求通过 BodyAttribute 特性来配置请求内容。相应的 HTTP 声明式提取器为 BodyDeclarativeExtractor 类型,它负责解析单个 BodyAttribute 特性,并构建 HttpRequestBuilder 实例所需的请求内容配置。
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,仅当ContentType为application/x-www-form-urlencoded时有效。UrlEncode:是否对表单数据进行URL编码(bool类型),默认值为true。RawString:是否为原始字符串内容(bool类型),默认值为false,仅当参数为字符串类型且此属性为true时有效。AsFile:将字符串作为文件路径(支持互联网地址)(bool类型),默认值为false,仅当参数为字符串类型且此属性为true时有效。DisposeResourcesOnRequestCompletion:是否在请求结束后自动释放资源(bool类型),默认值为false。