エンタープライズ:特集 2003/11/24 19:40:00 更新

[JAVA Developer特別企画]2003年12月号
AxisによるAmazon Webサービス活用記 (4/4)

JAVA Developer 2003年12月号より転載

4.Webサービス
クライアントを作る
 Webサービスクライアントを作っていきましょう。Amazon Webサービスには、とても多くのオペレーションがあります。今回は、使い方がシンプルなASIN検索オペレーションを使ってみようと思います。ASINは、Amazonが書籍、音楽CDといったすべての商品に割り当てているIDです。書籍のASINは、裏表紙に掲載されているISBNコードから「-」を省いたものです。たとえば、「ISBN4-87311-101-3」ならば、ASINは「4873111013」となります。

●Javaからの呼び出しはシンプル
 リスト4-1は、WSDL2Javaツールが生成したスタブを利用したソースコードです。パラメータであるAsinRequestオブジェクトに情報を設定している部分を含めたわずか12行で、Webサービスオペレーションを呼び出せます。

リスト4-1 Axisを使ったAmazon Webサービスの呼び出し手順

AmazonSearchService service = new AmazonSearchServiceLocator();
AmazonSearchPort port = service.getAmazonSearchPort();

AsinRequest request = new AsinRequest();
request.setAsin(asin);
request.setTag(tag);
request.setType(type);
request.setDevtag(token);
request.setLocale(locale);
request.setOffer(null);
request.setOfferpage(null);
request.setMode(null);

 呼び出し手順は、serviceオブジェクトを生成し、さらにserviceオブジェクトからportオブジェクトを指定します。パラメータなしのgetAmazonSearchPortメソッドは、デフォルトのエンドポイントにアクセスすることを意味しています。異なるエンドポイントにアクセスする場合は、getAmazonSearchPortメソッドのパラメータとして渡します。

図4-1
図4-1 asinSearchRequestメソッド(ASIN検索オペレーション)

 AsinRequestオブジェクトに設定しなければならない情報は、セッターメソッドを呼び出します。設定内容は、表4-1を参照してください。

表4-1 AsinRequestクラスのセッターメソッド

メソッド名 データ型 設定内容
setAsin String 検索するASIN
setTag String タグ(アソシエイトID)
setType String heavyまたは"lite"
setDevtag String デベロッパー・トークン
setLocale String 検索対象を日本にする場合は"jp"を必ず指定する。英語の場合は省略可能

 asinSearchRequestメソッドにパラメータのrequestオブジェクトを渡します。このメソッドは、Amazonのサイトと通信を行い、Webサービスオペレーションを実行。その結果をpinfoに格納します。
 このように、Axisを使うとXMLやSOAPだけでなく、Webサービスを呼ぶことさえも意識することはありません。この簡単さがAxisの大きなメリットです。

●Amazon Webサービスの実行
 スタブコードとWebServiceクラスをコンパイルして実行します。リスト4-2では、検索するASINコードを引数として渡しています。検索するASINコードを「4797322462」として実行した結果は次のとおりです。

エッセンシャルJava 2nd edition
宮坂 雅輝
ソフトバンクパブリッシング
¥ 2,600

リスト4-2 WebServiceクラス

public class WebService {
   public static void main(String[] args) {
       String tag = "PPPPPPPPPPPPPPPP";
       String type = "heavy";
       String token = "XXXXXXXXXXXXXX";
       String locale = "jp";

       if (args.length == 0) {
           System.out.println("Usage: WebService id");
           return;
       }
       try {
           AmazonSearchService service = new
               AmazonSearchServiceLocator();
           AmazonSearchPort port =
               service.getAmazonSearchPort();

           AsinRequest request = new AsinRequest();
           request.setAsin(args[0]);
           request.setTag(tag);
           request.setType(type);
           request.setDevtag(token);
           request.setLocale(locale);
           request.setOffer(null);
           request.setOfferpage(null);
           request.setMode(null);

           ProductInfo pinfo = (ProductInfo)
               port.asinSearchRequest(request);

           Details[] detail = pinfo.getDetails();
           System.out.println(detail[0].getProductName());
           String[] auths = detail[0].getAuthors();
           if (auths.length > 0) {
               System.out.print(auths[0]);
               for (int i=1; i<auths.length; i++) {
                   System.out.print("," + auths[i]);
               }
               System.out.println();
           }
           System.out.println(detail[0].getManufacturer());                    
           System.out.println(detail[0].getOurPrice());
       } catch (ServiceException e) {
           e.printStackTrace();
       } catch (RemoteException e) {
           e.printStackTrace();
       }
   }
}

 無事、検索が完了し、正しい内容が表示されました。次に、JSPを使ったWebアプリケーションで試してみます。
 Webアプリケーションは、最初のページ(図4-2)がASINコードを入力して「検索」ボタンを押すという簡単な入力フォームです。サブミット先のJSPでは、ASINコードを受け取り、getAmazonSearchPortメソッドをコールして、その結果をテーブルに表示するというものです。誌面の関係でソースコードは割愛します(弊誌Webサイトにアップロードしています)。
 Tomcatにデプロイし、実行したのが図4-3です。サーバーサイドでも問題なく動作できました。

図4-2
図4-2 入力ボックスにASINコードを入力して「検索」ボタンをクリック

図4-3
図4-3 Amazon Webサービスの検索結果が表示される

●Webサービスクライアントを作るうえで気になったこと
 最後に、Amazon Webサービスを使って気になったことをいくつかまとめておきます。
 まずは、文字エンコーディングの問題。Amazon Webサービスでは、送受信するメッセージの文字エンコーディングとして「UTF-8」を採用しています。Javaも内部の文字エンコーディングはUnicodeですから、この間なら問題はないのですが、最終的に出力するHTMLの文字エンコーディングはUTF-8のままではInternet Explorerが対応していませんし、文字エンコーディングの指定によってはエンコーディングできなかった文字が「?」として表示されてしまいます。
 また、価格表記にいわゆる半角文字の「\」を使わず、全角文字の「¥」を使っています。さらにプロダクト名(書籍名)では、全角ローマ数字の「T」「V」などは使われておらず、半角英字を組み合わせていました(便宜上、半角や全角と使い分けています)。このように、Webサービスを提供する側によって扱える文字が制限されている可能性があることです。このような制限の適用範囲は、データの属性によって異なる場合があり、これについてはWSDLを見ても判断することはできません。今後のWebサービスの発展を考えると、使用可能な文字の制限を定義する必要があると思います。
 Axisを使用するうえで、Webサービスクライアントの作成は簡単になります。注意しなければならないことがいくつかありますが、アイデア次第でユニークなコンテンツが作成できそうです。まずは、無料で使用できるAmazon Webサービスを使って、自身のサイトでWebサービスを体験してみてはいかがでしょうか。

参考文献
・『Java Webサービス』オライリー・ジャパン
・『ウェブDBプレスVol.13』「次世代WebサービスエンジンAxis詳細」技術評論社

関連URL:
Amazon Webサービス
Apache Axis

関連リンク
▼JAVA Developer
▼定期購読のご案内
▼バックナンバー販売協力店


JAVA Developer12月号表紙
JAVA Developer 12月号

大特集
UML2.0のすべて

特集2 AS徹底解説
 Cosminexus

[特別企画]
・UMLダイヤグラムベースで次世代プログラミング
・OptimalJによるMDA開発の実際
・WSDLの秘密を探る!
・AxisによるWebサービス活用記

前のページ | 1 2 3 4 |      

[松浦 武範,JAVA Developer]

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.