HTTP ネットワークプログラミング 3 / 3
SFXHTTPConnection クラス
SFXHTTPConnection は HTTP プロトコルが使いやすくカプセル化されている SophiaFramework のクラスです。
SophiaFramework によるアプリ
- 最初に、"Push Select Key... " を表示します。
- セレクトキーが押されると、通信が開始します。
- 通信が終了すると、受け取ったデータを表示します。
SFXHTTPConnection を使う準備
アプリケーションクラスでは、 SFXHTTPConnection クラスのほかに、通信ストリームへのポインタ SFXAnsiStringStreamReader、バッファとなる文字列 SFXAnsiString の変数を追加します。
通信が終了したときや、ストリームにデータを読み込んだときに呼び出されるコールバック関数も定義します。
■アプリケーションクラスの宣言
SFMTYPEDEFCLASS(SFHttpApp) class SFHttpApp : public SFRApplication { SFMSEALCOPY(SFHttpApp) private: SFXHTTPConnection _http; SFXAnsiStringStreamReader _reader; SFXAnsiString _string; public: static SFCInvokerPtr Factory(Void); private: explicit SFHttpApp(Void) static_throws; virtual ~SFHttpApp(Void); HANDLER_DECLARE_VOIDRENDER(SFHttpApp, OnRenderContent) HANDLER_DECLARE_BOOLEVENT(SFHttpApp, OnKey) CALLBACK_DECLARE_SFXHTTPCONNECTION(HttpNotify) CALLBACK_DECLARE_SFXSTREAMREADER(SourceNotify) };
SFXHTTPConnection の使い方
セレクトキーが押されると、通信を開始します。コールバック関数を登録し、通信メソッドを設定します。
さらに URL を指定して Connect 関数を呼び出せば、通信が始まります。
// キー ハンドラ HANDLER_IMPLEMENT_BOOLEVENT(SFHttpApp, OnKey, event) { switch (event.GetP16()) { case AVK_SELECT: _string = ""; _http.Open(); _http.SetMethod("GET"); _http.Connect(ACCESS_URL, CALLBACK_FUNCTION(HttpNotify)); return true; } return false; }
HttpConnection の通知コールバック
通信が終了すると、コールバック関数が呼ばれます。
通信が成功した場合に、コールバック関数を登録し、ストリームからデータを読み込みます。
// HttpConnection の通知コールバック CALLBACK_IMPLEMENT_SFXHTTPCONNECTION(SFHttpApp, HttpNotify, error) { if (error == SFERR_NO_ERROR) { // HTTP レスポンスが取得できた場合 _http.GetStreamReader(1024, &_reader); TRACE(">> pre Fetch..."); _reader.Fetch(CALLBACK_FUNCTION(SourceNotify)); } else { TRACE(">> HTTP NOTIFY ERROR."); } return; }
SFXAnsiStringStreamReader クラスを使用したデータの読み込み
SFXAnsiStringStreamReader クラスは、通信ストリームを AnsiString として読み込むためのクラスです。
Fetch 関数を呼ぶと、クラス内部にデータを読み込み、準備ができるとコールバック関数を呼びます。
この関数は、読み込みが終了するとウインドウを画面に描画します。
// SFXAnsiStringStreamReader の通知コールバック CALLBACK_IMPLEMENT_SFXSTREAMREADER(SFHttpApp, SourceNotify, error) { if (error == SFERR_NO_ERROR) { while (_reader.GetReadableSize()) { SFXAnsiString temp; _reader >> temp; _string += temp; } if (_reader.Ends()) { TRACE(">> end source"); _http.Close(); ::new MyWindow(GetContentWorld(), _string); // responder のコンテント領域 (描画領域) を再描画する Invoke(SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, false)); } else { // 再度データを取得する TRACE(">> pre Refetch..."); _reader.Fetch(CALLBACK_FUNCTION(SourceNotify)); } } else { TRACE(">> SOURCE NOTIFY ERROR"); } return; }
記事掲載プログラムのソースコード
SophiaFramework UNIVERSE を使用して作成したソースコード
webapp_sf.zip (SophiaFramework UNIVERSE 5.1)
httpapp_sf.zip (SophiaFramework UNIVERSE 5.1)