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 アプリを公開
President Blog : SAX Parser for BREW
ソースコード DOM 版 ( REST API の利用 ) : 
ソースコード SAX 版 ( REST API の利用 ) : 
ソースコード DOM 版 ( SOAP API の利用 ) : 
ソースコード SAX 版 ( SOAP API の利用 ) : 
ソースコード DOM 版 ( SOAP RPC を使った API の利用 ) : 
世界初、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 文書の解析以外のメモリ使用量も含まれます。











