SophiaFramework UNIVERSE 5.3 |
SFXHTTPConnection クラスは、 NTT ドコモの携帯 Java アプリ開発環境 DoJa に実装されている、 com.nttdocomo.io.HttpConnection クラスに似た HTTP 通信機能を提供します(HTTPS 通信にも対応しています)。
以下の手順により、 SFXFile クラスを使用して Web サーバーへに HTTP 接続してデータを送受信します。
■ SFXHTTPConnection クラスの使用手順
HTTP クライアントは、 SFXHTTPConnection クラスを使用して以下の手順で実装します。
参照: ネットワーク: HTTP 接続
例 18.3. HTTP 通信
// SFXHTTPConnection インスタンス (_http) はクラスのメンバ変数として定義する class MyClass { private: SFXHTTPConnection _http; SFXAnsiStringStreamReader _reader; SFXAnsiString _string; public: Void Start(Void); XALLBACK_DECLARE_SFXHTTPCONNECTION(OnConnect) XALLBACK_DECLARE_SFXANSISTRINGSTREAMREADER(OnFetch) }; Void MyClass::Start(Void) { SFXAnsiStringStreamWriter writer; SFXAnsiString send; SFCError error(SFERR_NO_ERROR); unused(environment); // POST メソッドでアクセスする if ((error = _http.Open()) == SFERR_NO_ERROR) { // 送信するデータを用意する send = "abcdefghijklmnopqrstuvwxyz"; // ストリームを使用して HTTP リクエストボディを書き込む // ストリームを取得する if ((error = _http.GetStreamWriter(send.GetLength(), &writer)) == SFERR_NO_ERROR) { // send 変数からストリームバッファにデータを書き込む if ((error = writer.WriteSFXAnsiString(send)) == SFERR_NO_ERROR) { // ストリームバッファの内容を HTTP リクエストボディに書き込む // ※ Flush 関数を呼び出さないかぎり、データは書き込まれない if ((error = writer.Flush()) == SFERR_NO_ERROR) { // リクエストメソッドを POST に設定する if ((error = _http.SetMethod("POST")) == SFERR_NO_ERROR) { #if 1 // HTTP 通信の場合 // Web サーバーに接続する // ※ 接続要求の結果は、OnConnect 関数に通知される if ((error = _http.Connect("http://www.example.com", XALLBACK_INTERNAL(OnConnect))) == SFERR_NO_ERROR) { #else // HTTPS 通信の場合 // 必要に応じて SSL 認証モードを設定する _http.SetTrustMode(SSL_TRUST_MODE_FAIL); // Web サーバーに接続する // ※ 接続要求の結果は、OnConnect 関数に通知される if ((error = _http.Connect("https://www.example.com", XALLBACK_INTERNAL(OnConnect))) == SFERR_NO_ERROR) { #endif TRACE("> connecting..."); } } } } } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき // 接続を閉じる _http.Close(); } return; } // 接続要求の結果が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXHTTPCONNECTION(MyClass, OnConnect, error) { TRACE("> connected... : %d", error); if (error == SFERR_NO_ERROR) { // HTTP ステータスコードを検査する TRACE("> result code : %d", _http.GetResultCode()); if (_http.GetResultCode() == 200) { // ストリームを使用して HTTP レスポンスボディを読み込む // HTTP レスポンスボディ読み込み用ストリームを取得する if ((error = _http.GetStreamReader(1024, &_reader)) == SFERR_NO_ERROR) { // HTTP レスポンスボディからストリームバッファにデータを読み込む // ※ 読み込み(フェッチ)の結果は、OnFetch 関数に通知される if ((error = _reader.Fetch(XALLBACK_INTERNAL(OnFetch))) == SFERR_NO_ERROR) { TRACE(">> fetching..."); } } } else { error = SFERR_INVALID_STATE; } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき // ストリームを解放する _reader.Release(); // 接続を閉じる _http.Close(); } return; } // 読み込み(フェッチ)の結果が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXANSISTRINGSTREAMREADER(MyClass, OnFetch, error) { SFXAnsiString string; TRACE("> fetched... : %d", error); if (error == SFERR_NO_ERROR) { // ストリームバッファから string 変数にデータを読み込む if ((error = _reader.ReadSFXAnsiString(&string)) == SFERR_NO_ERROR) { // _string 変数に string 変数を追加する if ((error = _string.Add(string)) == SFERR_NO_ERROR) { // 残りのデータをチェックする if (_reader.Ends()) { // すべてのデータを読み込んだとき: // HTTP レスポンスボディをデバッグウィンドウに表示する TRACE("--------"); TRACE("%s", _string.GetCString()); TRACE("--------"); // ストリームを解放する _reader.Release(); // 接続を閉じる _http.Close(); } else { // 読み込むデータがまだ存在するとき: // HTTP レスポンスボディからストリームバッファにデータを読み込む // ※ 読み込み(フェッチ)の結果は、OnFetch 関数に通知される error = _reader.Fetch(XALLBACK_INTERNAL(OnFetch)); } } } } if (error != SFERR_NO_ERROR) { // エラーが発生したとき // ストリームを解放する _reader.Release(); // 接続を閉じる _http.Close(); } return; }
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |