前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

18.3. SFXHTTPConnection クラス

SFXHTTPConnection クラスは、 NTT ドコモの携帯 Java アプリ開発環境 DoJa に実装されている、 com.nttdocomo.io.HttpConnection クラスに似た HTTP 通信機能を提供します(HTTPS 通信にも対応しています)。

以下の手順により、 SFXFile クラスを使用して Web サーバーへに HTTP 接続してデータを送受信します。

■ SFXHTTPConnection クラスの使用手順

HTTP クライアントは、 SFXHTTPConnection クラスを使用して以下の手順で実装します。

  1. HTTP 接続(SFXHTTPConnection インスタンス)を作成します。
  2. SFXHTTPConnection::Open 関数を呼び出して、HTTP 接続を開きます。
  3. SFXHTTPConnection::SetMethod 関数を呼び出して、 HTTP リクエストメソッド(デフォルト: GET メソッド)を設定します。 SFXHTTPConnection::GetStreamWriter 関数で出力ストリームを取得しリクエストボディにデータを書き込みます。 リクエストヘッダーは、SFXHTTPConnection::SetRequestHeader 関数を使用して設定します。 なお、リクエストボディは、SFXHTTPConnection::SetRequestContent 関数を使用して設定することも可能です。
  4. HTTPS 通信の場合、 SFXHTTPConnection::SetTrustMode 関数を呼び出して、 SSL 認証モード(デフォルト: SSL_TRUST_MODE_FAIL)を設定します。
  5. SFXHTTPConnection::Connect 関数を呼び出して、Web サーバーに接続します。
  6. Web サーバーへの接続の結果は、 SFXHTTPConnection::Connect 関数で登録したコールバック関数に通知されます。 Web サーバーへの接続の結果(エラーコード)は、コールバック関数の第 1 引数に渡されます。 エラーコードが SFERR_NO_ERROR であれば、HTTP レスポンスの取得に成功しています。
  7. SFXHTTPConnection::GetResultCode 関数で HTTP ステータスコードを取得し、その内容を確認してから、 SFXHTTPConnection::GetStreamReader 関数で入力ストリームを取得してレスポンスボディを読み込みます。 レスポンスヘッダーは、SFXHTTPConnection::GetResponseHeader 関数を使用して取得します。 なお、レスポンスボディは、SFXHTTPConnection::GetResponseContent 関数を使用して取得することも可能です。
  8. SFXHTTPConnection::Close 関数を呼び出して、 HTTP 接続を閉じます。

参照: ネットワーク: 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;
}