Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

matlab.net.http.io.MultipartFormProvider 类

命名空间: matlab.net.http.io
超类: matlab.net.http.io.MultipartProvider

发送 multipart/form-data 消息的 ContentProvider

描述

使用此提供程序将 Multipart 表单发送给服务器。Multipart 表单是包含一系列组成部分的消息,其中每一部分都有一个“控件名称”及其数据。数据可以是 RequestMessage.Body.Data 允许的任何类型,也可以是另一个 ContentProvider

有些服务器要求将同名的多个部分放在嵌套的 multipart/mixed 部分。要发送嵌套部分,请将这些部分包装在 MultipartProvider 中。例如,要按照 HTML 4.01 表单数据规范第 17 章末尾所述发送消息:

fps = FileProvider(["file1.txt","file2.gif"]); % get array of providers
mp = MultipartProvider(fps);
formProvider = MultipartFormProvider("submit-name","Larry","files",mp);
req = RequestMessage('put',[],formProvider);
req.send(uri);

matlab.net.http.io.MultipartFormProvider 类是一个 handle 类。

创建对象

描述

provider = MultipartFormProvider(Name,Part) 创建由一个或多个名称-部分对组参数指定的 "multipart/form-data" 内容。Part 是包含 Name 及其内容的表单数据。Part 参数可以是 MultipartProvider 支持的任何类型,包括其他 ContentProvider 对象。

如果 Part 是数组,则它相当于为数组的每个元素重复 Name,Part。例如,下面的语句:

MultipartFormProvider("name",FileProvider(["file1" "file2"]))

等效于:

MultipartFormProvider("name",FileProvider("file1"),"name",FileProvider("file2"));

属性

全部展开

公共属性

组成部分的名称,指定为字符串。

属性:

GetAccess
public
SetAccess
public

消息主体的组成部分,指定为由以下一个或多个值组成的元胞数组:

ContentProvider 对象

MultipartProvider 将创建该部分的工作委托给指定的提供程序(称为代理),调用其 complete 方法来获取该部分的标头信息,并调用 getData 方法来获取数据。代理的 Header 属性被用作该部分的标头。此处可以指定 ContentProvider 的任何子类。通常,代理既不指定内容长度,也不实现 expectedContentLength 方法,因为一个组成部分的结束是由边界字符串而不是标头字段指定的。如果实现该方法以返回非空值,则该值仅用于限制内容的长度,而不是创建 Content-Length 字段。

RequestMessage 对象

MultipartProviderRequestMessageHeaderBody 作为组成部分来发送。如果已设置 Body 的 Payload 属性,则它被用作原始有效负载。否则,Body 的 Data 属性将根据其类型或 Header 中的 Content-Type 字段进行转换,如 MessageBody.Data 中所述。如果您有数据要发送并希望利用 MATLAB® 发送 RequestMessage 时通常执行的默认数据处理,则此选项非常有用。它允许您在请求中指定自定义标头字段用作该部分的 Header 并控制数据如何转换,而无需编写 ContentProvider 子类。RequestMessage.RequestLine 属性将被忽略。

MessageBody 对象

MessageBody 的处理方式与在没有 Content-Type 字段的 RequestMessage 中一样。如果根据数据类型对数据进行默认处理就已足够,而且您不需要为该部分指定任何自定义标头字段,则此选项非常有用。MATLAB 根据数据的类型在该部分插入一个 Content-Type 字段。有关转换规则,请参阅 MessageBody.Data

ContentProviderRequestMessage 和/或 MessageBody 对象的数组

将数组的每个元素视为一个组成部分。不是元胞数组。

getData 方法的句柄

此方法必须具有 ContentProvider.getData 的签名。在这种情况下,该部分的 Content-Type 设置为 "application/octet-stream",所以此选项对于发送二进制数据很有用。使用此选项时,不能为该部分指定任何自定义标头字段。

任何其他类型

如果类型与这些类型都不匹配,也不是函数句柄,则按照它出现在 MessageBodyData 属性中那样来处理。请参阅 MessageBody 类型的说明。

属性:

GetAccess
public
SetAccess
public
Dependent
true

消息或组成部分的标头字段,指定为由一个或多个 matlab.net.http.HeaderField 对象组成的向量。

此属性仅供子类编写者使用。MATLAB 在调用提供程序的 complete 方法之前设置此属性。对于非 Multipart 消息,MATLAB 将此属性初始化为 Request.Header 的内容减去任何 matlab.net.http.field.GenericFields 或空值字段。ContentProvider 使用此属性添加对要发送数据进行描述的标头字段,或者向消息中已有的标头字段中添加参数。在 MultipartProvider 的代理中,MATLAB 将此属性初始化为委托方提供程序打算为该部分插入的标头字段。代理可以修改或更改这些字段。

从提供程序的 complete 方法返回时,如果这不是 Multipart 消息,则 MATLAB 会读取此属性并将其内容与 Request 的标头合并。此 HeaderNames 未出现在 Request.Header 中的字段将被添加到 Request.Header 的末尾。如果此 Header 中的某个字段与 Request.Header 中的某个字段具有相同的 Name,而且都具有非空 Values,则:

  • 如果 Request.Header 中的字段是 GenericField,则忽略 Header 中的字段。

  • 如果 Request.Header 中的字段不是 GenericField,则将其替换为 Header 中的字段。

如果两个字段或其中之一具有空 Value,则将该字段从 Request.Header 中删除,且不会添加为正常的完整消息的一部分。

如果这是 MultipartProvider 的代理,则将此 Header 的全部内容用作该部分的标头。Multipart 代理绝不能假定 Request.Header 包含的任何字段与自己的 Header 相关。提供程序可以通过检查 MyDelegator 是否为 MultipartProvider 来确定它是否为 Multipart 代理,尽管需要进行这种检验的可能性并不大。

MATLAB 仅在调用提供程序的 complete 方法返回时读取此属性。一旦 MATLAB 调用 start,对此数组所做的更改将被忽略。

类编写者应该明白,在超类中调用 complete 之前,子类可能已经向此 Header 中添加字段(在子类的 complete 方法中)。最好保留这些字段,而且不要添加同名字段。但是,为字段添加参数是可以的。例如,超类可以为没有字符集参数的现有 Content-Type 字段添加一个字符集参数。

属性:

GetAccess
public
SetAccess
public

指示是否强制进行分块传输编码,指定为布尔值。此属性仅对子类编写者有用,并且仅适用于不是作为 Multipart 代理的提供程序。子类通过设置 ForceChunked 来控制是否应使用分块传输编码发送内容。如果为 false(默认值),MATLAB 将根据消息待发送时是否了解消息的内容长度来决定是否发送分块内容:

  • 如果 MATLAB 知道内容长度(例如,消息中包含 Content-Length 字段,或者此提供程序的 expectedContentLength 方法返回一个数字),则由 MATLAB 决定是否发送分块消息。

  • 如果 MATLAB 不知道内容长度(标头中没有 Content-Length 字段而且 expectedContentLength 返回空),则 MATLAB 始终发送分块消息。

如果 ForceChunkedtrue,则无论 MATLAB 是否知道内容长度都会发送分块消息,除非已知长度小于块大小。如果此属性为 true,则消息中不能包含 Content-Length 字段,因为 HTTP 不允许分块消息具有 Content-Length 字段。但是,如果您希望 MATLAB 验证您返回的是预期的数据长度,则仍可以在 expectedContentLength 方法中返回非零值。

当 MATLAB 选择发送分块消息时,每个块的大小等于 getData 返回的数据长度。

MATLAB 在调用 complete 方法之后、调用 start 之前读取此值。它不会设置此字段。

属性:

GetAccess
public
SetAccess
public

要发送的请求消息,指定为 matlab.net.http.RequestMessage 对象。

此属性仅由子类编写者使用。在调用此使用程序中的其他方法之前,以及在添加其他标头字段或验证消息之前,RequestMessage.sendRequestMessage.complete 方法将此属性设置为此提供程序原来所在的 BodyRequestMessage。提供程序可以检查此消息,以查看原始请求中包含的内容。

代理与委托方看到的此属性值是相同的。ContentProviders 应该明白,如果它们是代理,则不一定提供请求消息的完整主体,因此不应该假定此 Request 中的标头字段与它们提供的数据相关。通常,代理应忽略此请求中与数据相关的标头字段,例如 Content-Type。

如果提供程序希望为此消息添加任何标头字段或修改现有标头字段,应在其 complete 方法中将这些字段添加到 Header 属性中。complete 的调用方(RequestMessage 或委托方提供程序)决定如何处理这些字段。RequestMessage.sendRequestMessage.complete 始终将这些字段复制到 RequestMessageHeader 中。委托方提供程序可将这些字段复制到自己的 Header 属性中,或者将它们插入到消息中(就像在 MultipartProvider 中那样)。有关详细信息,请参阅 Header 属性。

此属性是只读的。

属性:

GetAccesspublic
SetAccessmatlab.net.http.RequestMessage

受保护的属性

提供程序子类型,指定为字符串。默认值 "mixed" 将设置为 "multipart/mixed" 的 Content-Type 标头以及相应的参数添加到消息中。子类可以在构造函数或 complete 方法中更改此值。此值出现在 Content-Type 中的 "multipart/" 之后。

属性:

GetAccess
protected
SetAccess
protected

接受此提供程序委托的 ContentProvider,指定为 matlab.net.http.io.ContentProvider 对象。此属性在调用方提供程序(委托方)中由 delegateTo 方法设置,以指示当前接受委托的提供程序。如果当前没有委托,则此值为空。

complete 方法将此属性设置为空。

属性:

GetAccess
protected
SetAccess
protected

向此提供程序进行委托的 ContentProvider,指定为 matlab.net.http.io.ContentProvider 对象。

如果 ContentProvider 将发送全部或部分消息数据的责任委托给另一个提供程序,则此属性向代理标识委托方提供程序。例如,MultipartProvider 将消息的各个部分委托给其他提供程序,因此它会在每个代理中插入自己的句柄。否则,MyDelegator 为空。delegateTo 方法在代理中设置此属性。

属性:

GetAccess
protected
SetAccess
protected

方法

全部展开

详细信息

全部展开

版本历史记录

在 R2018a 中推出