matlab.net.http.io.ContentProvider クラス
名前空間: matlab.net.http.io
スーパークラス: handle, matlab.mixin.Heterogeneous
HTTP メッセージ ペイロードの ContentProvider
説明
ContentProvider は、メッセージの送信中に HTTP RequestMessage のデータを提供します。簡単なものとしては、データを MATLAB® 型からバイト ストリームに変換するプロバイダーがあります。より複雑なプロバイダーでは、データをサーバーにストリーミングできます。この場合、データの取得や生成を送信と同時に行えるため、メッセージの開始前にすべてのデータをメモリに読み込む必要がありません。
通常、データを Web サービスに送信するときは (PUT 要求または POST 要求が一般的)、RequestMessage を作成し、データを MessageBody オブジェクトの形式で RequestMessage.Body プロパティに挿入します。そのメッセージを RequestMessage.send を使用して送信すると、そのデータがサーバーに送信するバイト ストリームに変換されます。この変換は、メッセージの Content-Type と Body.Data のデータのタイプに基づいて MATLAB で行われます。この変換ルールについては、MessageBody.Data を参照してください。
MessageBody オブジェクトを RequestMessage.Body プロパティに挿入する代わりに、ContentProvider オブジェクトを作成して挿入することができます。この場合、メッセージを送信すると、MATLAB で ContentProvider のメソッドが呼び出され、送信するデータのバッファーがメッセージの送信中に取得されます。
メッセージに MessageBody または ContentProvider のどちらを挿入した場合も、RequestMessage.send の呼び出しはメッセージ全体が送信されて応答を受信するか、エラーが発生するまで戻りません (ブロックされます)。ただし、ContentProvider の場合は、送信がブロックされている間、送信するデータのバッファーを取得するためのプロバイダーに対するコールバックが MATLAB で定期的に実行されます。ContentProvider では、これらのコールバックで、ファイル、MATLAB 配列、ハードウェア センサー、MATLAB 関数などの任意のソースからデータを取得できます。プロバイダーの役割は、そのデータを Web に送信できるバイト ストリーム (uint8 形式のバッファー) に変換することです。
ContentProvider は、クラスの作成者が独自のデータ ジェネレーターやデータ コンバーターを使用してサブクラス化できるように設計された抽象クラスです。また、MATLAB プロバイダーのいずれかを使用 (またはサブクラス化) すれば、サブクラスを記述せずにさまざまなソースからデータを生成させることができます。これらのプロバイダーには、データを MessageBody に直接挿入する場合に実行される自動変換に比べて、データの取得方法や変換方法をより柔軟に制御できるオプションがあります。次のいずれかの ContentProvider サブクラスを使用します。
データをストリーミングする必要がない場合でも、これらのプロバイダーのいずれかを使用すると、データが内部形式から uint8 ストリームに変換されるため、特定のタイプの内容を送信する処理が簡単になります。たとえば、FormProvider を使用すれば、フォームの応答をサーバーに送信し、データを QueryParameter オブジェクトの配列として表現できるので便利です。MultipartFormProvider を使用すると、マルチパート フォームの応答を送信できるため、マルチパート フォームの応答の作成が簡単になります。ContentProvider を使用する場合は、サーバーへの送信が想定される内容のタイプを理解しておく必要があります。
matlab.net.http.io.ContentProvider クラスは handle クラスです。
サブクラスの作成
簡単な ContentProvider であれば、MATLAB から要求されたときにデータのバッファーを提供する getData メソッドを実装するだけで作成できます。プロバイダーを使用するには、RequestMessage の Body プロパティに挿入します。この例では、RequestMessage コンストラクターの 3 番目の引数で MyProvider オブジェクトを Body に挿入しています。
provider = MyProvider;
req = matlab.net.http.RequestMessage('put', headers, provider);
resp = req.send(uri);
次に、コンストラクターに引数として名前が渡されたファイルを読み取って Web に送信する 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
endMATLAB は、送信する新しいメッセージの作成中にプロバイダーの complete メソッドを呼び出します。これは、プロバイダーでの新しいメッセージの準備として、必要なヘッダー フィールドをメッセージに追加できるようにするためです。MATLAB は、データの送信時になると、getData の最初の呼び出しの前にプロバイダーの start メソッドを呼び出します。
プロパティ
メソッド
詳細
バージョン履歴
R2018a で導入
