Класс: matlab.net.http.io.ContentProvider
Пакет: matlab.net.http.io
Длина содержимого ContentProvider
length = expectedContentLength(provider)
length = expectedContentLength(provider,force)
возвращает ожидаемую длину содержимого в байтах. Этот метод предназначен для переопределения подклассами, которые хотят сообщить о своей длине содержимого в MATLAB®. length
= expectedContentLength(provider
)RequestMessage.send
и RequestMessage.complete
вызовите этот метод и используйте возврат значение, чтобы установить поле заголовка Content-Length в RequestMessage
. Если сообщение уже имеет поле Content-Length со значением и length
не пуст, его значение должно быть равно значению в этом поле Content-Length. length
может быть 0, чтобы указать, что содержимое отсутствует, и в этом случае первый вызов на getData
должен вернуться пустым data
и stop=true
.
MATLAB вызывает этот метод из RequestMessage.send
, RequestMessage.complete
и в делегате по delegateTo
. MATLAB вызывает это после ContentProvider.complete
и до ContentProvider.start
. Если этот метод вызывается перед вызовом complete
, тогда значение возврата может быть недопустимым, поскольку поставщик не может обязательно определять длину преобразованных данных, не видя все поля заголовка, которые управляют преобразованием.
Если вы не решаете иметь поле заголовка Content-Length в своем сообщении (сообщение отправляется с использованием chunked transfer coding), то единственная причина переопределить этот метод и вернуть непустое значение - это двойная проверка, чтобы убедиться, что ваш провайдер вернет ожидаемую длину данных.
В случаях, когда длина данных известна (то есть, когда этот метод возвращает число, или поле Content-Length не пустое), этот провайдер getData
метод должен вернуться stop=true
после того, как точно это количество байт было возвращено. MATLAB всегда вызывает getData
неоднократно, даже если length=0
, пока getData
возвращает stop=true
. В случаях, когда длина не известна, если это провайдер верхнего уровня (не многопартийный делегат), MATLAB использует chunked передаточное кодирование, чтобы отправить содержимое, и провайдер свободно возвращает любую длину данных, включая никакие, до настройки stop=true
.
Вы должны вернуться []
если вы не знаете длительность данных усовершенствование, или если вычисление длины данных было бы длительным. Безвредно (и совершенно нормально) позволять любому сообщению использовать chunked transfer coding, даже если вы знаете длину. Если этот провайдер является делегатом из нескольких частей, непустое возвращаемое значение используется только для принудительной ошибки в случае getData
возвращает больше или меньше байтов и не приведет к появлению поля заголовка Content-Length в детали. См. MultipartProvider
для получения дополнительной информации.
, если length
= expectedContentLength(provider
,force
)force
является true
, требует, чтобы вы возвращали длину данных, вычисляя ее при необходимости, даже если бы вы в противном случае вернулись []
, если вычисление длины невозможно. Если возврат этого числа требует длительных расчетов или генерации всех данных в сообщении, то следует кэшировать данные так, чтобы не пришлось пересчитывать их в последующих getData
вызовы. The force
аргумент предоставляется для использования подклассами, которые должны знать длину данных усовершенствование. MATLAB никогда не устанавливает эту опцию при вызове этого метода, и если вы знаете, что ваш провайдер никогда не используется в качестве подкласса, который может задать эту опцию, то можно игнорировать force
аргумент.
Вызывающие абоненты этого метода, которые получают []
в ответ на настройку force
на true
может либо считать это ошибкой, либо вести себя таким образом, который совместим с содержимым неизвестной длины.
Определение force
может свести на нет преимущества потоковой передачи (отправки данных по мере их генерации), если для вычисления требуются все данные length
таким образом, эта опция лучше всего используется для особых случаев, например, отладки, или когда длина данных, как известно, мала.
Пример использования force
является гипотетическим CompressProvider
который опционально сжимает выход любого другого провайдера, но только если этот выход больше определенной длины (поскольку сжатие неэффективно для коротких сообщений). Чтобы определить длину, CompressProvider
необходимо обратиться к expectedContentLength
другого провайдера с
force
установлено на true
. Если этот другой провайдер является потоковым JSONProvider
, expectedContentLength
обычно возвращается []
, потому что определение длины строки JSON требует обработки всех входных данных. С force
установлено на true
, а JSONProvider
<reservedrangesplaceholder0>
метод обрабатывает все данные (возможно, кэшируя выход строку внутренне для дальнейшего использования ею putData
method) и возвращает длину этой строки.
Access | protected |
complete
| getData
| Заголовок | JSONProvider
| matlab.net.http.RequestMessage
| MultipartProvider
| Запрос