Main Content

expectedContentLength

类: matlab.net.http.io.ContentProvider
命名空间: matlab.net.http.io

ContentProvider 的内容长度

语法

length = expectedContentLength(provider)
length = expectedContentLength(provider,force)

说明

length = expectedContentLength(provider) 以字节形式返回预期的内容长度。此方法可由要向 MATLAB® 报告内容长度的子类覆盖。RequestMessage.sendRequestMessage.complete 调用此方法并使用返回值来设置 RequestMessage 中的 Content-Length 标头字段。如果消息已经有一个包含值的 Content-Length 字段并且 length 非空,则它的值必须等于该 Content-Length 字段中的值。length 可以为 0,表示无内容,这种情况下,第一次调用 getData 应返回空 datastop=true

MATLAB 从 RequestMessage.sendRequestMessage.complete 中调用此方法,并通过 delegateTo 从代理中调用此方法。MATLAB 在 ContentProvider.complete 之后、ContentProvider.start 之前调用此方法。如果在调用 complete 之前调用此方法,返回值可能无效,因为提供程序在查看控制转换的所有标头字段之前不一定能够确定所转换数据的长度。

如果您选择不在消息中包含 Content-Length 标头字段(使用分块传输编码发送消息),则覆盖此方法并返回非空值的唯一原因是为了再次检查,以确保您的提供程序返回预期的数据长度。

在数据长度已知的情况下(即,当此方法返回数字或 Content-Length 字段非空时),此提供程序的 getData 方法必须在正好返回该字节数后返回 stop=true。MATLAB 会一直重复调用 getData(即使 length=0),直到 getData 返回 stop=true 为止。在数据长度未知的情况下,如果这是顶层提供程序(不是 Multipart 代理),则 MATLAB 使用分块传输编码来发送内容,并且提供程序在设置 stop=true 之前可以返回任何长度的数据,包括无数据。

如果您事先不知道数据的长度,或者计算数据的长度非常耗时,则应返回 []。即使您知道数据长度,允许任何消息使用分块传输编码也没有害处(而且是完全正常的)。如果此提供程序是 Multipart 代理,则非空返回值仅用于在 getData 返回更多或更少字节时强制引发错误,不会导致 Content-Length 标头字段出现在该部分。有关详细信息,请参阅 MultipartProvider

如果 forcetrue,则 length = expectedContentLength(provider,force) 要求您返回数据的长度,如果有必要,则计算数据长度,即使您更希望返回 [],除非计算长度是不可能的。如果返回数据长度需要进行长时间计算或生成消息中的所有数据,则您应该将数据缓存起来,这样后续 getData 调用将不必重新计算。force 参量是为必须提前知道数据长度的子类提供的。MATLAB 在调用此方法时从不设置此选项,而且如果您知道您的提供程序绝不会被用作可能设置此选项的子类,则您可以忽略 force 参量。

此方法的调用方如果因为将 force 设置为 true 而得到 [],则可以将其视为错误,也可以按照与未知内容长度兼容的方式进行处理。

如果需要生成所有数据才能计算 length,则指定 force 可能会抵消流传输(一边生成数据一边发送)所带来的好处,所以此选项最好只在特殊情况下使用,例如,在进行调试时或在已知数据长度很小时。

假设有一个 CompressProvider,它可以压缩其他任何提供程序的输出,但仅在输出大于某个长度时才压缩(因为对短消息来说压缩无效),这时可以使用 force。要确定长度,CompressProvider 需要调用其他提供程序的 expectedContentLength,并将 force 设置为 true。如果该提供程序是流传输 JSONProvider,则 expectedContentLength 通常返回 [],因为确定 JSON 字符串的长度需要处理所有输入数据。当 force 设置为 true 时,JSONProviderexpectedContentLength 方法将处理所有数据(可能在内部缓存输出字符串以便其 putData 方法稍后使用),并返回该字符串的长度。

输入参数

全部展开

内容提供程序,指定为 matlab.net.http.io.ContentProvider 对象。

指示是否返回数据的长度,指定为 truefalse

如果为 true,则 expectedContentLength 必须返回数据的长度,如果有必要,则计算数据长度,即使您更希望返回 [],除非计算长度是不可能的。如果返回数据长度需要进行长时间计算或生成消息中的所有数据,则您应该将数据缓存起来,这样后续 getData 调用将不必重新计算。force 参量是为必须提前知道数据长度的子类提供的。MATLAB 在调用此方法时从不设置此选项,而且如果您知道您的提供程序绝不会被用作可能设置此选项的子类,则您可以忽略 force 参量。

此方法的调用方如果因为将 force 设置为 true 而得到 [],则可以将其视为错误,也可以按照与未知内容长度兼容的方式进行处理。

如果需要生成所有数据才能计算 length,则指定 force 可能会抵消流传输(一边生成数据一边发送)所带来的好处,所以此选项最好只在特殊情况下使用,例如,在进行调试时或在已知数据长度很小时。

输出参量

全部展开

预期的内容长度,以字节为单位。如果您不覆盖此方法,则 expectedContentLength 返回 []。MATLAB 按如下方式确定内容长度。

  • 如果此 ContentProvider 不是 Multipart 代理(请参阅 MultipartProvider),并且消息具有非空值的 Content-Length 字段(由 complete 方法插入到原始 RequestMessage 中或添加到 Header 属性中),则该 Content-Length 字段就是内容的长度。

  • 如果没有 Content-Length 字段(或者此提供程序是 Multipart 代理),则当此提供程序的 getData 方法设置 stop 返回值时,有效负载(或者该部分数据)即结束。这种情况下不需要指定内容长度。

属性

Accessprotected

版本历史记录

在 R2018a 中推出