matlab.net.http.io.ContentProvider class

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

ContentProvider для HTTP передают полезные нагрузки

Описание

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

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

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

Вставляете ли вы MessageBody или ContentProvider в сообщение, вызов RequestMessage.send не возвращается (то есть, это блокируется), пока целое сообщение не было отправлено, и ответ был получен, или ошибка произошла. Но с ContentProvider, MATLAB превращает периодические коллбэки в провайдера, чтобы получить буферы данных, чтобы отправить, в течение времени отправляют, блокируется. В этих коллбэках, вашем 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 конструктор, 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 этот провайдер был помещен, прежде, чем вызвать любые другие методы в этом провайдере, и прежде, чем добавить любые дополнительные поля заголовка или подтвердить сообщение. Провайдер может исследовать это сообщение, чтобы видеть то, что содержалось в исходном запросе.

Делегаты видят то же значение для этого свойства как delegator. 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 объект. Это свойство установлено в провайдере вызова (delegator) delegateTo метод, чтобы указать на текущего делегированного провайдера. Если нет никакой текущей делегации, то значение пусто.

complete методы устанавливают это свойство опустеть.

Атрибуты:

GetAccess
protected
SetAccess
protected

ContentProvider это делегировало к этому провайдеру, заданному как matlab.net.http.io.ContentProvider объект.

Если ContentProvider ответственность делегатов за отправку всех или фрагмента данных о сообщении к другому провайдеру, затем это свойство идентифицирует провайдера делегирования делегату. Например, MultipartProvider части делегатов сообщения к другим провайдерам, таким образом, это вставляет указатель на себя в каждом делегате. В противном случае, MyDelegator isempty. delegateTo метод устанавливает это свойство в делегате.

Атрибуты:

GetAccess
protected
SetAccess
protected

Методы

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

Больше о

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

Введенный в R2018a