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 アプリを公開
ソースコード DOM 版 ( REST API の利用 ) :
ソースコード SAX 版 ( REST API の利用 ) :
ソースコード DOM 版 ( SOAP API の利用 ) :
ソースコード SAX 版 ( SOAP API の利用 ) :
ソースコード DOM 版 ( SOAP RPC を使った API の利用 ) :
※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 プログラミングは不要です )
プレスリリース : モバイル 2.0 ソフトウェア技術を BREW 上に実装
SophiaFramework UNIVERSE XML ミドルウェア for 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 ブラウザからアクセスしたときの画面:
上記 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> タグの内容を格納する // < > などを < や > などに置換する 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 を工夫することで、携帯電話でもとても使い易くなります。
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 文書の解析以外のメモリ使用量も含まれます。