ホーム > 製品情報 > SophiaFramework UNIVERSE > REST / SOAP API を利用する Amazon Web サービス BREW アプリ

REST / SOAP API を利用する Amazon Web サービス BREW アプリ

BREW 携帯電話から Web サービスへアクセス

ブログや SNS、RSS など、Web2.0 と呼ばれる、Web そのものをプラットフォームとするソフトウェア技術やサービスがひろがっています。

Amazon、Google、Yahoo! などのサイトは Web サービスとして XML 形式で情報配信しています。

標準規格の XML データの情報は、誰でも自由に閲覧、加工、処理できます。これが Web サービスの最大の特長です。

SAX パーサーや SOAP API を利用する SophiaFramework UNIVERSE アプリを公開

※1. ダウンロード可能な実機用ファイルは、BREW 3.1 / BREW 4.0 開発専用端末でしか動作しません(一般の au 携帯電話にはインストールできません)。 上記ソースコードは SophiaFramework UNIVERSE 5.1 および BREW SDK 4.0.1 SP05 Ja を前提にしています。
コンパイラ : Visual C++ 6.0 / Visual C++ .NET 2003 / Visual C++ 2005 / RealView Compilation Tools for BREW 3.0 / RealView Compilation Tools for BREW 1.2 (Build 848) / YAGARTO 4.4.2 for Windows (20091018) / GNUARM 4.1.1

※2. ソフィア・クレイドルは本ソフトウェアの使用または使用不能に関する、サポートを一切実施いたしません。 また、本ソフトウェアの使用によるいかなる障害や問題に対しても、一切の責任を負いません。

世界初、BREW XML Parser " pself " とは…

" pself " は、SophiaFramework UNIVERSE で実装された、DTD と XMLSchema をサポートする、世界初の BREW XML パーサです。

米国マイクロソフト社の C++ 言語用の XML パーサ(Microsoft XML Core Services (MSXML) 4.0 )の API に準拠して実装されています。

だから、" pself " を使えば BREW でも Windows と同じように Web サービスアプリを C++ 言語でスムーズに開発できます。

Web サーバーから取得した XML データは " pself " によって自動的に解析されます。( そのための BREW プログラミングは不要です )

Amazon.co.jp Web サービスを利用した " 本棚アプリ "

Amazon.co.jp は、商品の検索や購入などの機能を Web サービスとして公開しています。

" 本棚アプリ " は、 Amazon.co.jp の Web サービスから取得した書籍情報を携帯電話に表示する BREW アプリで、" pself " を使って実装されています。

Amazon Web サービス

Amazon Web サービスの利用については[ITmedia エンタープライズ]の記事をご覧ください。

関連情報:[ITmedia エンタープライズ]Amazon Web サービスの利用登録と Subscription ID 取得方法


Amazon から書籍情報を取得するための URL
http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService
&Operation=ItemSearch
&SubscriptionId=[ Subscription ID ]
&SearchIndex=Books
&ResponseGroup=Large
&Power=isbn:0123456789X
※ 1 行で入力します 

SubscriptionId= に Amazon Web サービス登録時に取得する Subscription ID、Power=isbn: に検索対象の書籍の ISBN 番号を設定します。

PC ブラウザからアクセスしたときの画面:

PCブラウザからアクセスしたときの画面


上記 XML ドキュメントの主要部分
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05">
    ...
    <Items>
        ...
        <Item>
            <ASIN>0123456789X</ASIN>
            <DetailPageURL>商品の詳細ページのURL</DetailPageURL>
            ...
            <ItemAttributes>
                <Author>著者名</Author>
                ...
                <Title>書籍名</Title>
            </ItemAttributes>
            ...
        </Item>
    </Items>
<ItemSearchResponse>

たとえば、<ItemAttributes> にある <Author> は著者名、<Title> は書籍名です。

" pself " による XML ドキュメントの処理

Amazon とのHTTP 通信は、SophiaFramework UNIVERSE の SFXHTTPConnection クラスを使います。

受信したデータは、SophiaFramework UNIVERSE の SFXFile クラスを使って "amazondata.xml" というファイルに保存し、" pself " に渡します。


XML ドキュメントの主要処理
SFXXMLDOMParser parser; // DOM パーサー
parser.SetDoNamespaces(false); // Namespace 機能は OFF にする

SFCError error = parser.Parse("amazondata.xml"); // XML を解析(error はエラー値)

// 著者名、タイトルなどのデータを格納する(文字列クラス)
SFXAnsiString asin;
SFXAnsiString detailPageURL;
SFXAnsiString author;
SFXAnsiString title;

if (error == SFERR_NO_ERROR) { // 解析に成功したとき
    SFXXMLDocumentPtr root = parser.GetDocument(); // ルートを取得する
    if (root != null) {
        SFXXMLNodePtr child;

        // Item タグを探す(結果はリストで返る)
        SFXList<SFXXMLNodePtr>* list = root->GetElementsByTagName("Item");
        if (list != null && list->GetSize() > 0) { // Item タグが見つかれば、
            child = list->Get(0); // 今回の場合、Item タグは 1 つだけ

            // for 文でItem タグの子要素に 1 つずつアクセスする
            // GetFirstChild で子要素、GetNextSibling で次の兄弟要素を取得する

            for (child = child->GetFirstChild(); child != null;
                child = child->GetNextSibling()) {

                // ノード名が ASIN のとき
                if (SFXAnsiString(child->GetNodeName()) == "ASIN") {
                    // <ASIN> タグの内容を格納する
                    // &lt; &gt; などを < や > などに置換する
                    asin = DecodeHtml(child->GetText()); 
                }

                // ノード名が DetailPageURL のとき
                else if (SFXAnsiString(child->GetNodeName()) == "DetailPageURL") {
                    detailPageURL = DecodeHtml(child->GetText());
                }

                // ノード名が ItemAttributes のとき
                else if (SFXAnsiString(child->GetNodeName()) == "ItemAttributes") {
                    SFXXMLNodePtr node;

                    // for 文でItemAttributes タグの子要素に 1 つずつアクセスする

                    for (node = child->GetFirstChild(); node != null;
                            node = node->GetNextSibling()) {

                        // ノード名が Author のとき
                        if (SFXAnsiString(node->GetNodeName()) == "Author") {
                            author = DecodeHtml(node->GetText());
                        }
                        // ノード名が Title のとき
                        else if (SFXAnsiString(node->GetNodeName()) == "Title") {
                            title = DecodeHtml(node->GetText());
                        }
                    }
                }
            }
        }
        else {
            error = SFERR_FAILED; // 失敗
        }
    }
    else {
        error = SFERR_FAILED; // 失敗
    }
}

// asin, detailPageURL, author, title に結果が格納されているので、それを利用する

XML データの構造が素直にソースコードに反映されるので、開発と保守の効率は一段と高まるでしょう。

" 本棚アプリ "の GUI

" 本棚アプリ "の GUI

タイトル、著者名、画像、価格、目次、要約、レビューなど多岐に渡る書籍情報も GUI を工夫することで、携帯電話でもとても使い易くなります。

SophiaFramework UNIVERSE には BREW 携帯電話に特化した GUI フレームワークが搭載されていますので、利用者は GUI のインフラを開発しなくても良いので、アプリがすぐに完成します。


キー 操作の記述
// キー 操作の記述部
HANDLER_IMPLEMENT_BOOLEVENT(InformationWindow, OnKey, event)
{
    switch (event.GetP16()) {
        case AVK_UP:      // 上キーを押したとき
            FocusUp();    // フォーカスを上に移動する(主に画面のスクロール)
            return true;
        case AVK_LEFT:    // 左キーを押したとき
            FocusLeft();  // フォーカスを左に移動する(主にタブの切り替え時)
            return true;
        case AVK_DOWN:    // 下キーを押したとき
            FocusDown();  // フォーカスを下に移動する(主に画面のスクロール)
            return true;
        case AVK_RIGHT:   // 右キーを押したとき
            FocusRight(); // フォーカスを右に移動する(主にタブの切り替え時)
            return true;
        case AVK_CLR:     // クリアー キーを押したとき
            // ウィンドウを閉じる
            return Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
                       SRP16_TERMINATE_INVOKE, true));
    }
    return false;
}

タブコントロール
// タブ の作成部(抜粋)

// タブ コントロール の作成
SFRTabControlPtr tab = new SFRTabControl(this, SFXRectangle(0, 0, 150, 200));

// タブ の ページ 1 を作成する
SFRTabPanePtr pane1 = new SFRTabPane(tab, "一般情報");

// タブ の ページ 2 を作成する
SFRTabPanePtr pane2 = new SFRTabPane(tab, "詳細情報");

// タブ の ページ 3 を作成する
SFRTabPanePtr pane3 = new SFRTabPane(tab, "レビュー");

...

// タブ 1 の中にテキストを表示する
new SFRLabelControl(pane1, SFXRectangle(5, 5, 100, 28), "書籍名:");
new SFRLabelControl(pane1, SFXRectangle(125, 5, 100, 28), title);
new SFRLabelControl(pane1, SFXRectangle(5, 45, 100, 28), "著者:");
new SFRLabelControl(pane1, SFXRectangle(125, 45, 100, 28), author);

...

わずかこれだけのコードで、タブ コントロール を含む GUI 版 " 本棚アプリ "が完成です。

DOM パーサーと SAX パーサーの比較

BREW プロファイラ Bleuet de BREW  を利用し、DOM パーサーと SAX パーサーについて速度とメモリ使用量を調査しました。

その結果、SAX パーサーは DOM パーサーよりもメモリ使用量が桁違いで少ないということが分かりました。

速度

名前 時間( ミリ秒 )※1 平均時間( ミリ秒 )※2
DOM 版 ( REST API ) 1,688 241.14
SAX 版 ( REST API ) 2,169 15.60
DOM 版 ( SOAP API ) 1,735 247.86
SAX 版 ( SOAP API ) 2,234 15.84
DOM 版 ( SOAP-RPC API ※3 ) 2,324 332.00

※1 解析を行う関数のメモリ使用量の合計

※2 [解析を行う関数のメモリ使用量の合計] ÷ [解析を行う関数の実行回数]

※3 通信やコールバックの設定など XML 文書の解析以外の時間も含まれます。

メモリ使用量

名前 メモリ使用量( byte )※1 平均メモリ使用量( byte )※2
DOM 版 ( REST API ) 161,672 23,096
SAX 版 ( REST API ) 2,924 22
DOM 版 ( SOAP API ) 161,008 23,001
SAX 版 ( SOAP API ) 2,868 21
DOM 版 ( SOAP-RPC API ※3 ) 213,648 30,521

※1 解析を行う関数のメモリ使用量の合計

※2 [解析を行う関数のメモリ使用量の合計] ÷ [解析を行う関数の実行回数]

※3 通信やコールバックの設定など XML 文書の解析以外のメモリ使用量も含まれます。