4.7前置操作 / 命名策略 / 排序
在将 HttpContent 实例添加到 MultipartFormDataContent 对象之前,您可以执行一些预处理操作。例如,在与某些对象存储服务(如阿里云 OSS)对接时,您可能需要移除 Content-Type 设置(框架已内置该操作)。
设置添加表单项内容前的操作#
在将 HttpContent 实例添加到 MultipartFormDataContent 对象之前,您可以执行一些预处理操作。例如,在与某些对象存储服务(如阿里云 OSS)对接时,您可能需要移除 Content-Type 设置(框架已内置该操作)。
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 方法,用于配置表单字段名称的转换规则。
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。
此外,你还可以通过自定义转换器委托实现特定格式,例如为所有字段名称统一添加 _ 前缀:
HttpRequestBuilder.Post("https://furion.net") .SetMultipartContent(multipart => { multipart.AddObject(new { Id = 1, Name = "Furion"}) .SetFormNameTransformer(name => "_" + name); });设置多部分表单内容项的排序规则#
尽管对多部分表单内容项进行排序的需求并不常见,但在一些安全性要求较高的系统中,往往需要校验表单字段的提交顺序。框架为此提供了排序支持:
HttpRequestBuilder.Post("https://furion.net") .SetMultipartContent(multipart => { multipart.AddObject(new { name = "furion", id = 1 }); }) .SetFormItemsSorter(items => items.OrderBy(u => u.Name));通过 .SetFormItemsSorter() 方法配置多部分表单内容项的排序规则。该方法接收原始 MultipartFormDataItem 集合,并返回排序后的可枚举集合。为 null 时不排序(原始添加顺序)。