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 を使用して作成したソースコード

SFWebApp41.zip (SophiaFramework 4.1)

SFHttpApp41.zip (SophiaFramework 4.1)

















