Класс

matlab.net.http. iO . ContentProvider

Пакет: matlab.net.http. iO
Суперклассы: обработайте, matlab.mixin. Неоднородный

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, необходимо понять тип содержимого, которое сервер ожидает, что вы отправите.

Для авторов подкласса

Самый простой 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.

Restartability и Reusability

Провайдер может быть прерываемым и/или допускающим повторное использование. Прерываемый означает, что провайдер может снова послать то же сообщение многократно с тем же потоком данных каждый раз, когда MATLAB вызывает start, даже если предыдущее использование не закончилось в нормальном завершении. Это поведение необходимо, потому что сервер может перенаправить сообщение к различному серверу, что означает потребности данных ретранслироваться. В этом случае MATLAB вызывает start, не вызывая complete снова. MATLAB вызывает метод restartable, чтобы определить, может ли провайдер быть перезапущен. Если ложь, MATLAB выдает исключение, если это должно вызвать start на провайдере, который был уже запущен, если не было никакого прошедшего вызова complete (который происходит только на новом сообщении).

Допускающий повторное использование означает, что провайдер может быть снова использован для различного (или то же самое) сообщение, каждый раз, когда MATLAB вызывает свой метод complete. MATLAB вызывает метод reusable, чтобы определить, может ли провайдер быть снова использован. Если false, то MATLAB выдает исключение, если это должно вызвать complete на провайдере, который был уже запущен. Если провайдер является допускающим повторное использование, то предположение - то, что следующий вызов start должен успешно выполниться, даже если провайдер является прерываемым.

ContentProvider возвращает false и для restartable и для reusable, поэтому если вы расширяете этот базовый класс непосредственно с прерываемым или допускающим повторное использование провайдером, необходимо заменить один или оба из этих методов, чтобы возвратить true. Все конкретные подклассы ContentProvider в пакете matlab.net.http.io являются и прерываемыми и допускающими повторное использование, таким образом, они возвращают true для этих методов. Если вы расширяете один из тех подклассов с провайдером, который не является допускающим повторное использование или прерываемым, замените один или оба из тех методов, чтобы возвратить false.

Класс MyProvider в этом примере не является прерываемым или допускающим повторное использование, потому что провайдер закрывает файл в конце сообщения. Чтобы сделать его допускающим повторное использование, вызов fopen должен произойти в методе complete вместо конструктора, таким образом восстановив состояние провайдера назад к тому, чем это было, прежде чем это использовалось для сообщения.

     classdef MyProvider < matlab.net.http.io.ContentProvider
        properties
            FileID double
            Name string
        end
 
        methods
            function obj = MyProvider(name)
                obj.Name = name;
            end
 
            function [data, stop] = getData(obj, length)
                ...as above...
            end
 
            function complete(obj, uri)
                obj.FileID = fopen(name);
                obj.complete@matlab.net.http.io.ContentProvider();
            end
 
            function tf = reusable(~)
                tf = true;
            end
            
            function delete(obj)
                ...as above...
            end
        end
      end

Чтобы сделать провайдера прерываемым, добавьте restartable и методы start и выпустите fseek в методе start, чтобы "перемотать" файл:

            function start(obj)
                obj.start@matlab.net.http.io.ContentProvider();
                fseek(obj.FileID, 0, -1);
            end
 
            function tf = restartable(~)
                tf = true;
            end

Когда вы вызываете complete или send на RequestMessage, который содержит ContentProvider в его теле, MATLAB устанавливает свойство Request в провайдере к RequestMessage, в котором провайдер был помещен и свойство Header в заголовки в Request, прежде, чем добавить автоматические поля. Это затем вызывает следующие методы в провайдере в этом порядке:

  • завершенный- обращенный завершение сообщения, которое обычно происходит однажды на сообщение, когда вы вызываете RequestMessage.send или RequestMessage.complete завершенный. Провайдер, как ожидают, установит свое свойство Header на любые поля заголовка быть добавленным к сообщению, характерному для провайдера. Если MATLAB вызывает этот метод последующее время, провайдер должен принять, что это используется для нового сообщения. Большинство провайдеров должно реализовать этот метод, чтобы добавить их заголовки и затем, если они не прямой подкласс этого абстрактного класса, они должны вызвать свой суперкласс, завершенный, чтобы вызвать любое дополнительное поведение по умолчанию. MATLAB не вызывает complete несколько раз в провайдере, если его допускающий повторное использование метод не возвращает true. Этот абстрактный класс не является допускающим повторное использование по умолчанию, но все конкретные провайдеры в пакете matlab.net.http.io являются допускающими повторное использование.

  • preferredBufferSize/expectedContentLength - названный от RequestMessage.send, когда-то после complete, перед вызовом start. Большинство провайдеров не должно реализовывать эти методы, когда поведение по умолчанию является соответствующим. Однако провайдеры могут заменить это, чтобы поддержать аргумент force.

После возвращаются из этих методов, MATLAB отправляет заголовок RequestMessage к серверу. Когда пора отправить тело, MATLAB вызывает эти методы.

  • запуск- названный от RequestMessage.send, когда-то после вызова предыдущих методов, когда MATLAB решил, что сервер готов получить тело сообщения запроса. Если MATLAB вызывает это последующее время без прошедшего полного, провайдер должен принять, что просят снова послать тело того же сообщения (с теми же заголовками) еще раз. MATLAB не вызывает, запускаются несколько раз начиная с последней возможности к complete, если метод restartable провайдера не возвращает true. Этот абстрактный класс не является прерываемым по умолчанию, но все конкретные провайдеры в пакете matlab.net.http.io, являются прерываемыми.

  • getData - названный многократно после того, как вызов start, в то время как RequestMessage.send блокируется, каждый раз MATLAB, решает, что сервер готов к новому буферу данных. Метод должен возвратить вектор uint8 данных. Провайдер сигнализирует о конце данных путем возврата индикатора stop. Все провайдеры должны реализовать этот метод.

После того, как getData возвращает индикатор stop, MATLAB заканчивает сообщение запроса и ждет ответа с сервера.

Делегация

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

Провайдер делегирует другому путем вызова delegateTo, который устанавливает CurrentDelegate на делегата и MyDelegator делегата к текущему провайдеру (то есть, delegator), и затем вызывает complete делегата и методы start. Затем вызовы метода getData delegator CurrentDelegate.getData, чтобы получить данные, возможно изменяя его прежде, чем возвратить его в MATLAB. Провайдеры обычно не должны проверять, являются ли они делегатами, или кто делегировал им.

Свойства

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

Установите MATLAB или Delegator

Запросите сообщение отправить, заданный как matlab.net.http.RequestMessage object.

Это свойство используется только авторами подкласса. 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.

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

Атрибуты:

GetAccessprotected
SetAccessprotected

Установите провайдером или MATLAB, считанным MATLAB

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

Это свойство только используется авторами подкласса. 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, которое уже не имеет того.

Атрибуты:

GetAccesspublic
SetAccesspublic

Укажите, обеспечить ли разделенное на блоки кодирование передачи, заданное как булевская переменная. Это свойство представляет интерес только, чтобы разделить авторов на подклассы и применимо только к провайдерам, которые не являются многослойными делегатами. Подклассы устанавливают 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. Это не устанавливает это поле.

Атрибуты:

GetAccesspublic
SetAccesspublic

ContentProvider, к которому этот провайдер делегирует, заданный как объект matlab.net.http.io.ContentProvider. Это свойство собирается в провайдере вызова (delegator) методом delegateTo указать на текущего делегированного провайдера. Если нет никакой текущей делегации, то значение пусто.

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

GetAccessprotected
SetAccessprotected

Методы

завершенныйПолный HTTP-заголовок для ContentProvider
delegateToДелегируйте к другому провайдеру
expectedContentLengthДлина содержимого ContentProvider
getDataСледующий буфер данных, который отправит в HTTP, запрашивает сообщение от ContentProvider
preferredBufferSizeПредпочтительный buffer size для ContentProvider
прерываемыйУкажите, является ли ContentProvider прерываемым
допускающий повторное использованиеУкажите, является ли ContentProvider допускающим повторное использование
showОтобразите информацию о ContentProvider
запускЗапустите передачу данных с ContentProvider
строкаПокажите ContentProvider как строку

Иерархия классов

Представленный в R2018a

Была ли эта тема полезной?