ホーム > 製品情報 > 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 サービスの最大の特長です。

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


世界初、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 文書の解析以外のメモリ使用量も含まれます。