4.1创建实例与基本项

在互联网应用中,保存用户自定义数据最常用的方法是使用 Form 表单提交。Form 表单不仅能传输文本数据,还能传输二进制数据(例如文件)。

HttpMultipartFormDataBuilder 表单构建器#

在互联网应用中,保存用户自定义数据最常用的方法是使用 Form 表单提交。Form 表单不仅能传输文本数据,还能传输二进制数据(例如文件)。

为了构建包含这些多部分表单内容,我们使用 HttpMultipartFormDataBuilder 表单构建器。该构建器最终会生成一个 MultipartFormDataContent 对象,并将其设置为 HttpRequestMessageContent 属性,同时指定请求的内容类型为 multipart/form-data

创建构建器实例#

由于 HttpMultipartFormDataBuilder 的构造函数是私有的,因此无法直接使用 new 关键字进行实例化。若想在 HTTP 远程请求中设置多部分表单内容,必须通过 HttpRequestBuilder 对象提供的 SetMultipartContent(Action<HttpMultipartFormDataBuilder>) 方法进行设置。

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        // multipart 的类型是 HttpMultipartFormDataBuilder    });

设置内容边界#

在构建多部分表单内容时,可以通过以下链式调用方法为多部分表单内容设置边界(Boundary):

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        // 属性方式设置边界(非推荐)        multipart.Boundary = "--------------------";        // 方法方式设置边界(推荐),支持链式调用        multipart.SetBoundary("--------------------");    });

保留内容的默认 Content-Type#

在与一些较老的 HTTP 服务对接时,提交表单数据时不应设置多部分表单内容的 Content-Type,否则可能引发异常。 而现代 HTTP 接口则无此限制。因此,框架默认在提交表单数据时会自动移除多部分表单内容的 Content-Type

若需取消此操作,可通过以下方式设置:

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        multipart.OmitContentType = false; // 保留多部分内容默认的 Content-Type        // 或使用 multipart.SetOmitContentType(false);    });// 【推荐】使用 SetMultipartContent(Action<HttpMultipartFormDataBuilder> configure, bool omitContentType) 重载方法HttpRequestBuilder.Post("https://furion.net/")    .SetMultipartContent(multipart =>    {        // ...    }, false);  // 保留多部分内容默认的 Content-Type

添加单个表单项内容#

向多部分表单内容添加独立的项,即添加单个表单属性。

cs
HttpRequestBuilder.Post("https://furion.net")    .SetMultipartContent(multipart =>    {        multipart.AddFormItem(1, "id"); // 将被赋值给 FormClass 的 Id 属性        multipart.AddFormItem("Furion", "name");    // 将被赋值给 FormClass 的 Name 属性    });

上述代码对应于服务端接收的类定义,如:

cs
public class FormClass{    public int Id { get; set; }    public string Name { get; set; }    // 其他属性}