実装
Amazon Web ServiceのItemSearch Serviceにアクセスするプログラムを実装します。ItemSearch Serviceは、著者、題名(の一部)により該当する書誌情報を検索するサービスです。
なお今回は、必要最小限度のパラメータしか設定していません。
package bookrack.webservice.amazon; import org.apache.commons.httpclient.*; ← (1) import org.apache.commons.httpclient.methods.*; import org.apache.commons.logging.*; public class SimpleAmazonWebServices { private final static Log log = LogFactory.getLog(SimpleAmazonWebServices.class); private final static String HOST = "webservices.amazon.co.jp"; private final static int PORT = 80; private final static String PATH = "/onca/xml"; private final static String SERVICE = "AWSECommerceService"; private final static String ACCESS_KEY_ID = "Your Subscription ID"; ← (2) public String itemSearch(String searchIndex, String keywords) { String response = null; try { NameValuePair[] params = new NameValuePair[5]; params[0] = new NameValuePair("Service" , SERVICE ); params[1] = new NameValuePair("AWSAccessKeyId", ACCESS_KEY_ID); params[2] = new NameValuePair("Operation" , "ItemSearch" ); params[3] = new NameValuePair("SearchIndex" , searchIndex ); params[4] = new NameValuePair("Keywords" , keywords ); HttpMethod method = new GetMethod(); method.setURI(new HttpURL(HOST, PORT, PATH)); log.trace("URI: " + method.getURI()); method.setQueryString(params); ← (3) log.trace("queryString: " + method.getQueryString()); HttpClient client = new HttpClient(); client.executeMethod(method); log.trace("statusCode: " + method.getStatusCode()); response = method.getResponseBodyAsString(); ← (4) } catch(Exception e) ← (5) { e.printStackTrace(); } return response; } }
- このようないいかげんなimportは、お奨めしません。
- 自分の登録IDを設定してください。
NameValuePair
クラスは、文字コードのエンコーディングを自前で行います。- サンプルですので、結果のXMLを文字列として返します。実際はInputStreamを返して、JAXB2でXML→Java Objectに変換します。
- このようないいかげんなtry/catchは、お奨めしません。
テスト
テストを実装します。
package bookrack.webservice.amazon; import junit.framework.*; ← (1) import org.apache.commons.logging.*; public class SimpleAmazonWebServicesTest extends TestCase { private finalstatic Log log = LogFactory.getLog(SimpleAmazonWebServicesTest.class); public void testItemSearch() { SimpleAmazonWebServices service = new SimpleAmazonWebServices(); String response = service.itemSearch("Books", "java web"); log.trace("response: " + response); ← (2) } }
- テストなので、いいかげんなimportになっています。
- 本来なら、asertXXXで検証すべきですが……。
テストの実行結果は、次のとおりです。
% mvn test ... ------------------------------------------------------- T E S T S ------------------------------------------------------- Running bookrack.webservice.amazon.SimpleAmazonWebServicesTest 2007/06/11 15:55:53:601 JST [TRACE] SimpleAmazonWebServicesTest - response: <?xml version="1.0" encoding="UTF-8"?> ← (1) <ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"> ... <Item> <ASIN>4844357808</ASIN> <DetailPageURL>http://www.amazon.co.jp/...</DetailPageURL> <ItemAttributes> <Author>シーズ</Author> <Creator Role="著">シーズ</Creator> <Manufacturer>エムディエヌコーポレーション</Manufacturer> <ProductGroup>Book</ProductGroup> <Title>JavaScriptビジュアル・リファレンス</Title> </ItemAttributes> </Item> <Item> ... ← (2) </ItemSearchResponse> ... [INFO] --------------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO] --------------------------------------------------------------- %
- 実際の出力は1行です。
- この後に、最大で10個Item(書誌情報)が続きます。
まとめ
Amazon Web ServiceへのアクセスとMavenのTipsを紹介しました。次回は、Java Architecture for XML Binding(JAXB2)を利用して、Amazon Web ServiceのXMLデータをJava Objectに変換するMaven Pluginについて紹介します。