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 end
MATLAB は、送信する新しいメッセージの作成中にプロバイダーの complete
メソッドを呼び出します。これは、プロバイダーでの新しいメッセージの準備として、必要なヘッダー フィールドをメッセージに追加できるようにするためです。MATLAB は、データの送信時になると、getData
の最初の呼び出しの前にプロバイダーの start
メソッドを呼び出します。
プロパティ
メソッド
詳細
バージョン履歴
R2018a で導入