4.7前置操作 / 命名策略 / 排序

在将 HttpContent 实例添加到 MultipartFormDataContent 对象之前,您可以执行一些预处理操作。例如,在与某些对象存储服务(如阿里云 OSS)对接时,您可能需要移除 Content-Type 设置(框架已内置该操作)。

设置添加表单项内容前的操作#

在将 HttpContent 实例添加到 MultipartFormDataContent 对象之前,您可以执行一些预处理操作。例如,在与某些对象存储服务(如阿里云 OSS)对接时,您可能需要移除 Content-Type 设置(框架已内置该操作)。

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        multipart.SetBoundary("--------------------------")            .AddFormItem("1", "id")            .AddFormItem("Furion", "name")            .SetOnPreAddContent((content, name) => // 委托参数类型为:Action<HttpContent, string>            {                content.Headers.ContentType = null;            });    });

注意SetOnPreAddContent 方法支持多次调用,每次调用的结果会累积叠加。

设置表单名称策略(转换器)#

在发送 HTTP 表单数据时,与直接发送 application/json 格式的 JSON 数据不同,无法直接利用自定义 JSON 序列化选项对属性名称进行格式化。当将对象设置为表单数据时,框架会先将对象转换为 IDictionary<string, object?> 类型,再逐项添加为表单字段。因此,该过程不会沿用 JSON 序列化的命名规则。

由于 C# 语言中通常采用大驼峰命名法(PascalCase)命名属性,而在与某些第三方服务(如 Java 编写的 API)交互时,对方可能对字段名称大小写敏感,导致请求失败。为此,框架提供了 SetFormNameTransformer 方法,用于配置表单字段名称的转换规则。

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        multipart.AddObject(new { Id = 1, Name = "Furion"})                 .SetFormNameTransformer(FormNamingPolicy.CamelCase);   // 使用小驼峰命名法转换表单字段名    });

框架内置了以下五种常见的命名规则转换方式,同时也支持自定义转换逻辑:

  • 小驼峰命名法FormNamingPolicy.CamelCase):例如将 TempCelsius 转换为 tempCelsius
  • 小写蛇形命名法FormNamingPolicy.SnakeCaseLower):例如将 TempCelsius 转换为 temp_celsius
  • 大写蛇形命名法FormNamingPolicy.SnakeCaseUpper):例如将 TempCelsius 转换为 TEMP_CELSIUS
  • 小写短横线命名法FormNamingPolicy.KebabCaseLower):例如将 TempCelsius 转换为 temp-celsius
  • 大写短横线命名法FormNamingPolicy.KebabCaseUpper):例如将 TempCelsius 转换为 TEMP-CELSIUS

此外,你还可以通过自定义转换器委托实现特定格式,例如为所有字段名称统一添加 _ 前缀:

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        multipart.AddObject(new { Id = 1, Name = "Furion"})                 .SetFormNameTransformer(name => "_" + name);    });

设置多部分表单内容项的排序规则#

尽管对多部分表单内容项进行排序的需求并不常见,但在一些安全性要求较高的系统中,往往需要校验表单字段的提交顺序。框架为此提供了排序支持:

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        multipart.AddObject(new { name = "furion", id = 1 });    })    .SetFormItemsSorter(items => items.OrderBy(u => u.Name));

通过 .SetFormItemsSorter() 方法配置多部分表单内容项的排序规则。该方法接收原始 MultipartFormDataItem 集合,并返回排序后的可枚举集合。为 null 时不排序(原始添加顺序)。