exponenta event banner

matlab.net.http.io.ContentProvider класс

Пакет: matlab.net.http.io
Суперклассы: handle, matlab.mixin.Heterogeneous

ContentProvider для полезных нагрузок сообщений HTTP

Описание

ContentProvider предоставляет данные для HTTP RequestMessage Простой провайдер преобразует данные из типа MATLAB ® в поток байтов. Более сложные провайдеры могут передавать данные на сервер, получая или генерируя данные одновременно с отправкой, что позволяет избежать необходимости иметь все данные в памяти до начала сообщения.

Как правило, при отправке данных в веб-службу (обычно в запросе PUT или POST) создается RequestMessage и вставить данные в виде MessageBody объект в RequestMessage.Body собственность. При отправке сообщения с помощью RequestMessage.sendMATLAB преобразует эти данные в поток байтов для отправки на сервер, преобразуя их на основе типа содержимого сообщения и типа данных в Body.Data. Посмотрите MessageBody.Data для этих правил преобразования.

Вместо вставки MessageBody объект в RequestMessage.Body свойство, можно создать ContentProvider и вставьте его вместо этого. Затем при отправке сообщения MATLAB вызывает методы в ContentProvider для получения буферов данных для отправки во время отправки сообщения.

Вставлять ли MessageBody или ContentProvider в сообщение, вызов RequestMessage.send не возвращается (то есть блокируется) до тех пор, пока не будет отправлено все сообщение и не будет получен ответ или не произойдет ошибка. Но с ContentProviderMATLAB выполняет периодические обратные вызовы в провайдер для получения буферов данных для отправки, в течение времени, когда передача заблокирована. В этих обратных вызовах ContentProvider может получать данные из любого источника, такого как файл, массив MATLAB, аппаратный датчик, функция MATLAB и т.д. Задача провайдера состоит в преобразовании этих данных в поток байтов в виде буферов uint8, которые могут быть отправлены в Интернет.

ContentProvider - абстрактный класс, предназначенный для авторов классов для подкласса с собственным генератором или преобразователем данных, либо можно использовать (или подкласс) один из провайдеров MATLAB, генерирующих данные для вас из различных источников, без записи подкласса. Эти поставщики имеют опции, которые обеспечивают более гибкий контроль над тем, как данные получаются и преобразуются, по сравнению с автоматическими преобразованиями, которые происходят при вставке данных непосредственно в MessageBody. Используйте один из ContentProvider подклассы:

Даже если не требуется потоковая передача данных, использование одного из этих провайдеров может упростить процесс отправки определенных типов содержимого, поскольку они преобразуют данные из внутренней формы в uint8 поток. Например, FormProvider позволяет отправлять ответы формы на сервер, где можно удобно выразить данные в виде массива QueryParameter объекты. MultipartFormProvider позволяет отправлять ответы на многопартовые формы, упрощая создание ответов на многопартовые формы. Использование любого ContentProvider, вы должны понимать тип контента, который сервер ожидает от вас отправки.

matlab.net.http.io.ContentProvider класс является handle класс.

Авторы подкласса

Простейший из возможных ContentProvider необходимо только внедрить getData способ предоставления буферов данных по запросу MATLAB. Чтобы использовать поставщика, вставьте его в Body имущества RequestMessage. В этом примере третий аргумент для RequestMessage конструктор, a MyProvider объект, переходит в Body:

provider = MyProvider;
req = matlab.net.http.RequestMessage('put', headers, provider);
resp = req.send(uri);

Вот пример MyProvider класс, считывающий из имени файла, переданного конструктору в качестве аргумента, и отправляющий его в Интернет. В качестве хорошей меры мы закрываем файл в конце или при удалении этого поставщика.

    classdef MyProvider < matlab.net.http.io.ContentProvider
        properties
            FileID double
        end
 
        methods
            function obj = MyProvider(name)
                obj.FileID = fopen(name);
            end
 
            function [data, stop] = getData(obj, length)
                [data, len] = fread(obj.FileID, length, '*uint8');
                stop = len < length;
                if (stop)
                    fclose(obj.FileID);
                    obj.FileID = [];
                end
            end
 
            function delete(obj)
                if ~isempty(obj.FileID)
                    fclose(obj.FileID);
                    obj.FileID = [];
                end
            end
        end
    end

MATLAB вызывает провайдера complete способ, когда он формирует новое сообщение для отправки. Это позволяет провайдеру подготовиться к новому сообщению и добавить к нему все требуемые поля заголовка. MATLAB вызывает провайдера start метод, когда пришло время отправить данные, но до первого вызова getData.

Свойства

развернуть все

Общедоступные свойства

Поля заголовка сообщения или части, указанные как вектор одного или нескольких matlab.net.http.HeaderField объекты.

Это свойство используется только авторами подкласса. MATLAB устанавливает это свойство перед вызовом complete способ. Для непутевых сообщений MATLAB инициализирует это свойство для содержимого Request.Header, минус любой matlab.net.http.field.GenericFields или пустые поля. ContentProvider использует это свойство для добавления полей заголовка, описывающих отправляемые данные, или для добавления параметров в поля заголовка, уже содержащиеся в сообщении. В делегате для MultipartProvider, MATLAB инициализирует это свойство для полей заголовка, которые поставщик делегирования намерен вставить для детали. Делегаты могут изменять или изменять эти поля.

По возвращении от провайдера complete метод, если это не многопутевое сообщение, то MATLAB считывает это свойство и объединяет его содержимое в заголовок Request. Поля в этом Header с Names которые еще не появились в Request.Header добавляются в конец Request.Header. Если поле в этом поле Header имеет Name это то же самое, что и в Request.Header, и оба имеют непустые Values, затем:

  • Если в Request.Header является GenericField, то игнорировать один в Header.

  • Если в Request.Header не является GenericField, затем замените его на Header.

Если один или оба из них имеют пустой Value, то поле удаляется из Request.Header и не добавляется как часть обычного завершения сообщения.

Если это делегат MultipartProvider, то все содержимое этого Header используется в качестве заголовка части. Многопартийные делегаты не должны предполагать, что Request.Header содержит любые поля, относящиеся к их собственным Header. Поставщик может определить, является ли он многосторонним делегатом, проверив, MyDelegator является MultipartProvider, хотя этот тест вряд ли понадобится.

MATLAB считывает это свойство только по возвращении из вызова поставщика complete способ. Изменения в этом массиве игнорируются при вызове MATLAB start.

Авторы классов должны знать, что их подклассы могли добавить поля к этому Header (в их complete метод) перед вызовом complete в их суперклассе. Лучше всего сохранять такие поля и не добавлять поля с одинаковыми именами. Однако добавление параметра в поле допустимо. Например, суперкласс может добавить параметр набора символов к существующему полю Content-Type, у которого его еще нет.

Атрибуты:

GetAccess
public
SetAccess
public

Укажите, следует ли принудительно использовать кодирование передачи с порциями, указанное как логическое. Это свойство представляет интерес только для авторов подкласса и применимо только для поставщиков, не являющихся делегатами нескольких частей. Набор подклассов ForceChunked для управления тем, должно ли содержимое отправляться с использованием кодирования передачи с порциями. Если false (по умолчанию) MATLAB решает, следует ли отправлять порции содержимого, на основании того, знает ли он длину содержимого на момент готовности сообщения к отправке:

  • Если MATLAB знает длину содержимого (что имеет место, если сообщение содержит поле Content-Length или если этот поставщик expectedContentLength метод вернул число), затем MATLAB решает, отправлять ли его порциями или нет.

  • Если MATLAB не знает длину содержимого (нет поля Content-Length в заголовке и expectedContentLength возвращено пустым), то MATLAB всегда отправляет сообщение с порциями.

Если ForceChunked является trueзатем MATLAB посылает сообщение, порционированное независимо от того, знает ли оно длину содержимого, если известная длина не меньше размера блока. Если это свойство true, тогда сообщение не должно содержать поле Content-Length, так как HTTP не позволяет использовать поле Content-Length для секционированного сообщения. Однако можно вернуть ненулевое значение в expectedContentLength если вы хотите, чтобы MATLAB проверял, что вы возвращаете ожидаемую длину данных.

Когда MATLAB выбирает отправку порции сообщения, размер каждого порции равен длине данных, возвращаемых getData.

MATLAB считывает это значение после вызова complete метод, перед вызовом start. Это поле не устанавливается.

Атрибуты:

GetAccess
public
SetAccess
public

Запрос на отправку сообщения, указанного как matlab.net.http.RequestMessage объект.

Это свойство используется только авторами подкласса. RequestMessage.send и RequestMessage.complete методы устанавливают для этого свойства значение RequestMessage в чьем Body этот поставщик был размещен перед вызовом любых других методов в этом поставщике и перед добавлением дополнительных полей заголовка или проверкой сообщения. Поставщик может проверить это сообщение, чтобы узнать, что содержалось в исходном запросе.

Делегаты видят то же значение для этого свойства, что и делегатор. ContentProviders следует иметь в виду, что, если они являются делегатами, они не обязательно предоставляют весь текст сообщения запроса, поэтому они не должны предполагать, что поля заголовка в этом запросе имеют отношение к данным, которые они предоставляют. Обычно делегаты должны игнорировать поля заголовка в этом запросе, относящиеся к данным, например тип содержимого.

Если поставщик желает добавить какие-либо поля заголовка к этому сообщению или изменить существующие, он должен сделать это в своем complete путем добавления этих полей к Header собственность. Вызывающий абонент complete (RequestMessage или поставщик делегирования) определяет, что делать с этими полями. RequestMessage.send и RequestMessage.complete всегда копировать эти поля в Header из RequestMessage. Делегирующий поставщик может скопировать поля в свои собственные Header или вставить их в сообщение (как в случае MultipartProvider). Дополнительные сведения см. в разделе Свойство Header.

Это свойство доступно только для чтения.

Атрибуты:

GetAccesspublic
SetAccessmatlab.net.http.RequestMessage

Защищенные свойства

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