この記事は以下のセクションで構成されています。
- 前提条件
- JAX-WS Web サービスを作成する
- Eclipse ADT プラグインと SDK をインストールする
- Android プロジェクトを作成する
- KSoap2-android ライブラリーをインストールする
- レイアウトを作成する
- アクティビティー・クラスを作成する
- インターネットへのアクセス許可を構成する
- AVD (Android Virtual Device) を作成する
- Android クライアントを実行し、Web サービスにアクセスする
この記事では、読者に Web サービスの知識があることを前提として、単純な JAX-WS Web サービスを作成します。この JAX-WS Web サービスでは、人の名前を引数に取って、その人へ Hello という挨拶を返すメソッドを用意します。Web サービスを作成するためには、以下のソフトウェア・フレームワークが必要です。
- Eclipse IDE
- JAX-WS Web サービスをサポートするアプリケーション・サーバー。WebSphere を使用して JAX-WS Web サービスを作成するための初心者用のチュートリアルについては、「参考文献」を参照してください。
Web サービス用の Android クライアントを作成するためには、以下のソフトウェア・コンポーネントが必要です。
- Eclipse IDE
- Android SDK
- Eclipse 用 ADT プラグイン
- KSoap2-android ライブラリー
JAX-WS Web サービスは基本的に、javax.jws.WebService というアノテーションが付けられた
Java クラスで構成されています。この Java クラスは Web サービスを提供するエンドポイントです。また、Web
サービスは、サービス・エンドポイント・インターフェースで構成される場合もあり、このインターフェースはサービス・エンドポイントを実装するクラスによって実装されます。Web
サービスを実装するクラスは abstract や final
であってはなりません。この実装クラスのビジネス・メソッドで Web サービス・クライアントに対する操作として公開されるメソッドは、public でなければならず、static や final であってはなりません。ではここで、Web サービスを実装するクラスとして、HelloWSImpl を作成しましょう。このクラスは @WebService
というアノテーションが付けられており、HelloWS インターフェースを実装しています。この実装クラスには hello
メソッドが含まれており、hello メソッドは名前用の String パラメーターを引数にとり、その名前を含む Hello メッセージを返します。この実装クラスをリスト 1 に示します。
リスト 1. Web サービス実装クラス HelloWSImpl.java
package hello_webservice;
import javax.jws.*;
@WebService(portName = "HelloWSPort", serviceName = "HelloWSService",
targetNamespace = "http://hello_webservice/",
endpointInterface = "hello_webservice.HelloWS")
public class HelloWSImpl implements HelloWS {
public String hello(String name) {
// replace with your impl here
return "Hello "+name +" Welcome to Web Services!";
}
}
|
サービス・エンドポイント・インターフェース HelloWS には、@WebMethod というアノテーションが付けられた
hello メソッドが含まれています。このインターフェースをリスト 2 に示します。
リスト 2. サービス・エンドポイント・インターフェース HelloWS.java
package hello_webservice;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(name = "HelloWS", targetNamespace =
"http://hello_webservice/")
public interface HelloWS {
@WebMethod(operationName = "hello")
public String hello(String name);
}
|
次に、この Web サービス用の WSDL を生成します。この Web サービスは Android クライアントから WSDL として利用できる必要があります。WSDL
は、Web サービスをネットワーク・エンドポイントの集合として記述するための XML
フォーマットの文書であり、ネットワーク・エンドポイントはポートとも呼ばれます。メッセージは交換されるデータを抽象的に定義したものであり、ポート・タイプは操作の抽象的な集合です。HelloWSService Web サービス用の WSDL の「Design (設計)」ビューを図 1 に示します。
図 1. WSDL の「Design (設計)」ビュー
この Web サービスの WSDL を図 2 に示します。
図 2. Web サービスの WSDL
Eclipse ADT プラグインと Android SDK をインストールする
ADT (Android Development Tool) は Eclipse IDE 用のプラグインであり、Android
アプリケーションを開発するための統合環境を提供します。また、Android SDK には Android
アプリケーションを開発するためのツールやライブラリーが用意されています。ADT プラグインをインストールするためには、Eclipse で「Help (ヘルプ)」 > 「Install New Software (新規ソフトウェアのインストール)」の順にクリックし、表示されるダイアログ・ボックスで「Add (追加)」をクリックします。すると、「Add Repository (リポジトリーの追加)」ダイアログ・ボックスが表示されるので、「Name (名前)」には適当な名前を入力し、「Location (ロケーション)」には「https://dl-ssl.google.com/android/eclipse/」と入力して、「OK」をクリックします (図 3)。
図 3. ADT プラグイン用のリポジトリーを作成する
図 4 に示すように、表示されている「Developer Tools (開発ツール)」を選択し、「Next (次へ)」をクリックします。
図 4. 「Developer Tools (開発ツール)」をインストールする
「Install Details (インストール詳細)」ダイアログ・ボックスが表示されるので、「Next (次へ)」をクリックします。使用条件の条項に同意し、「Finish
(完了)」をクリックします。これで ADT プラグインがインストールされました。次に、Android SDK をインストールします。それには、Android
スターター・パッケージ (Windows 用は installer_r09-windows.exe)
をダウンロードします。このダウンロードしたインストーラーをダブルクリックして、Android SDK Tools Setup ウィザードを起動し、案内に従って「Next
(次へ)」をクリックします。Android SDK のインストールには JDK が必要なため、JDK 5.0/6.0 がインストールされていない場合には JDK 5.0/6.0 をインストールします。JDK 5.0/6.0 がインストールされている場合には、「Next (次へ)」をクリックして、インストール先 (デフォルトは C:\Program Files\Android\android-sdk-windows) を指定します。「Next (次へ)」をクリックします。ショートカットの作成先となるスタート・メニュー・フォルダーを指定し、「Install (インストール)」をクリックします。これにより、Android SDK Tools がインストールされるので、インストールが完了したら、「Next (次へ)」をクリックします (図 5)。
図 5. Android SDK Tools をインストールする
続いて「Finish (完了)」をクリックすると、Android SDK and AVD Manager が起動されるので、「Available packages (利用可能なパッケージ)」から、図 6 に示すパッケージを選択してインストールします。
図 6. Android SDK and AVD Manager
次に、Eclipse で Android の設定を行います。Eclipse で「Window (ウィンドウ)」 > 「Preferences (設定)」の順に選択します。表示される「Preferences (設定)」ダイアログ・ボックスで「Android」ノードを選択します。「SDK Location (SDK ロケーション)」を図 7 のように指定します。
図 7. Android SDK の場所を設定する
次に、Android プロジェクトを作成し、このプロジェクトの中に Android 用の Web サービス・クライアントを作成します。Eclipse IDE で「File (ファイル)」 > 「New (新規)」 > 「Others (その他)」の順に選択し、表示されるウィザード画面で「Android」 > 「Android Project (Android プロジェクト)」の順に選択したら、「Next (次へ)」をクリックします (図 8)。
図 8. 新規 Android プロジェクト
「New Android Project (新規 Android プロジェクト)」ウィンドウで、「Project name (プロジェクト名)」に「AndroidWSClient」と入力します。「Build Target (ビルド・ターゲット)」として「Android
2.2」を選択します。「Properties (プロパティー)」では、「Application name (アプリケーション名)」と「Package name
(パッケージ名)」を指定します。「Create Activity (アクティビティーを作成)」チェックボックスにチェックを入れ、アクティビティー・クラスとして「AndroidWSClient」と入力します。アクティビティーはユーザーとのやり取りを表し、Activity クラスを継承するクラスは UI 用のウィンドウを作成します。最低限必要な SDK のバージョンとして「8」を指定し、「Next (次へ)」をクリックします (図 9)。
図 9. 新規 Android プロジェクトを作成する
「New Android Test (新規 Android テスト)」プロジェクトから、テスト・プロジェクトを作成することもできますが、ここではテスト・プロジェクトは作成しません。「Finish (完了)」をクリックすると、Android プロジェクトが作成されます (図 10)。この Android プロジェクトは以下の必須コンポーネントで構成されています。
- Activity クラスを継承するアクティビティー・クラス (
AndroidWSClient) - Android アプリケーションのレイアウトを指定する
res/layout/main.xmlファイル AndroidManifest.xmlファイル。このファイルにはアプリケーションに関する不可欠の情報が含まれています (パッケージ名、アプリケーションのコンポーネント、プロセス、アクセス権、Android システムに対する最低限の API レベルなど)。
図 10. Android プロジェクト
Ksoap2-android ライブラリーをインストールする
Ksoap2-android ライブラリーは Android プラットフォームのための軽量で効率的な SOAP ライブラリーです。ksoap2-android
プロジェクトから ksoap2-android-assembly-2.4-jar-with-dependencies.jar をダウンロードします。Ksoap2-android アセンブリーの JAR を追加します。この JAR には「Java Build Path (Java のビルド・パス)」に対する依存関係が含まれています (図 11)。
図 11. Ksoap2-android ライブラリー
res/layout/main.xml で Android の UI コンポーネントのレイアウトを指定します。ここでは
Web サービスからのレスポンスがテキスト・メッセージとして表示される UI を作成します。まず、LinearLayout を作成します。このレイアウトではサブ要素が縦方向にリニアに配置されます。次に TextView 要素を追加します。この TextView 要素は id の結果を使用して、hello メソッドへのメソッド呼び出しに対する Web サービスのレスポンスを表示します。hello
メソッドを呼び出す場合には引数として名前を送信し、レスポンスとして Hello メッセージを取得します。あるいはタイトルに対する TextView 要素を作成することもできます。Android の Web サービス用クライアント・アプリケーションのグラフィカル・レイアウトを示したものが図 12 です。Android の画面は基本的に空白ですが、これは Web サービスのレスポンスをテキスト・メッセージとして表示するという前提のためです。
図 12. グラフィカル・レイアウト
レイアウト・ファイル main.xml をリスト 3 に示します。
リスト 3. レイアウト・ファイル main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/result" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> |
AndroidWSClient クラスは Android アプリケーションのアクティビティー・クラスであり、Activity クラスを継承しています。このセクションでは AndroidWSClient というアクティビティー・クラスを作成します。必要な Ksoap2-android クラスを以下のようにインポートします。
import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapPrimitive; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import org.ksoap2.serialization.PropertyInfo; |
アクティビティー・クラスの定数を表 1 に定義します。
表 1. アクティビティー・クラスの定数
| 定数 | 説明 |
|---|---|
| NAMESPACE | 名前空間は WSDL の targetNamespace です。 |
| URL | WSDL のURL です。URL の値は、WSDL の port 要素用の soap:address 要素の location 属性です。Web サービスも
Android 機器上でホストされている場合を除き、ホスト名として localhost
を指定してはなりません。なぜなら、アプリケーションは Android 機器上で実行される一方、Web サービスは localhost サーバー上にホストされるからです。ホスト名には、Web サービスをホストするサーバーの IP アドレスを指定します。 |
| METHOD_NAME | Web サービスによる操作の名前であり、WSDL から取得することができます。 |
| SOAP_ACTION | NAMESPACE+METHOD_NAME であり、String リテラルとして指定されます。 |
これらの定数の値は以下のとおりです。URL 定数の IP アドレスは以下の値とは異なる可能性があります。
private static final String NAMESPACE = "http://hello_webservice/"; private static String URL="http://192.168.1.68:7001/HelloWebService/HelloWSService?WSDL"; private static final String METHOD_NAME = "hello"; private static final String SOAP_ACTION = "http://hello_webservice/hello"; |
すべてのアクティビティー・クラスはアクティビティーを初期化するための onCreate
メソッドを実装する必要があります。setContentView メソッドとレイアウト・リソースを使って UI を定義します。
setContentView(R.layout.main); |
main.xml に定義された TextView 要素の findViewById メソッドを使用し、Android ウィジェットである TextView オブジェクトを作成します。
TextView lblResult = (TextView) findViewById(R.id.result); |
SOAP リクエストを作成するための org.ksoap2.serialization.SoapObject
オブジェクトを作成します。SOAP オブジェクトの名前空間、そして呼び出し対象のメソッド名を SoapObject コンストラクターで指定します。
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); |
SOAP メソッドが呼び出されたときに送信されるプロパティー情報を含めるための、org.ksoap2.serialization.PropertyInfo オブジェクトを作成します。各プロパティーには新しい PropertyInfo オブジェクトが必要です。hello メソッドは名前用に 1
つだけ引数をとります。プロパティーの名前を「arg0」と設定し、そのプロパティーの型を STRING_CLASS
と指定します。addProperty メソッドを使って PropertyInfo オブジェクトを SoapObject に追加します。
PropertyInfo propInfo=new PropertyInfo(); propInfo.name="arg0"; propInfo.type=PropertyInfo.STRING_CLASS; request.addProperty(propInfo, "John Smith"); |
次に、SOAP エンベロープを作成します。そのために、SoapSerializationEnvelope
クラスを使用します。このクラスは SoapEnvelop クラスを継承し、SOAP でシリアライズされたメッセージ構造を表現する SOAP シリアライズ・フォーマットをサポートしています。SOAP でシリアライズする主なメリットは移植しやすくなることです。
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); |
定数 SoapEnvelope.VER11 は SOAP バージョン 1.1 を意味します。SOAP
メソッドの呼び出しに対して送信されるメッセージとして、リクエスト・オブジェクト SoapObject をエンベロープに割り当てます。
envelope.setOutputSoapObject(request); |
J2SE ベースの HttpTransport レイヤーを表現する org.ksoap2.transport.HttpTransportSE オブジェクトを作成します。HttpTransportSE は SOAP メッセージのシリアライズとデシリアライズをカプセル化する org.ksoap2.transport.Transport クラスを継承しています。
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); |
SOAP_ACTION と SOAP エンベロープを使って SOAP 呼び出しを実行します。
androidHttpTransport.call(SOAP_ACTION, envelope); |
SoapSerializationEnvelope オブジェクトの getResponse メソッドを使って Web
サービスのレスポンスを取得し、そのレスポンス・オブジェクトをプリミティブ型のカプセル化に使われるクラスである SoapPrimitive にキャストします。
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse(); |
SOAP レスポンスの String メッセージを UI コンポーネント TextView に設定します。
lblResult.setText(resultsRequestSOAP.toString()); |
このアクティビティー・クラスを下記のリスト 4 に示します。
リスト 4. アクティビティー・クラス AndroidWSClient.java
package android.webservice.client;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.serialization.PropertyInfo;
import android.widget.TextView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
public class AndroidWSClient extends Activity {
private static final String NAMESPACE = "http://hello_webservice/";
private static String URL = "http://192.168.1.68:7001/HelloWebService/
HelloWSService?WSDL";
private static final String METHOD_NAME = "hello";
private static final String SOAP_ACTION = "http://hello_webservice/hello";
private TextView lblResult;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lblResult = (TextView) findViewById(R.id.result);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo propInfo=new PropertyInfo();
propInfo.name="arg0";
propInfo.type=PropertyInfo.STRING_CLASS;
request.addProperty(propInfo, "John Smith");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
lblResult.setText(resultsRequestSOAP.toString());
} catch (Exception e) {
}
}
}
|
Android 機器から Web サービスにアクセスするためには、アプリケーションがネットワーク・ソケットを開けるように、AndroidManifest.xml でアクセス許可を設定する必要があります。下記の uses-permission 要素を追加します。
<uses-permission android:name="android.permission.INTERNET"></uses-permission> |
アクセス許可が設定された AndroidManifest.xml を示したものが図 13 です。
図 13. インターネットへのアクセス許可を設定する
AndroidManifest.xml をリスト 5 に示します。
リスト 5. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.webservice.client"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".AndroidWSClient"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-sdk android:minSdkVersion="8" />
</manifest>
</uses-permission>
|
Android SDK には、Android アプリケーションを開発、テストするための仮想モバイル・デバイスとして、モバイル・デバイス・エミュレーターが用意されています。このエミュレーターは AVD (Android Virtual Device) を構成することができ、この構成を使用して他の仮想モバイル・デバイス・オプション (Android プラットフォームなど) を指定することができます。AVD を作成するためには、「Window (ウィンドウ)」 > 「Android SDK and AVD Manager (Android SDK および AVD マネージャー)」の順にクリックします。表示されたウィンドウで、「Virtual devices (仮想デバイス)」をクリックし、ウィンドウの右端にある「New (新規)」をクリックします (図 14)。
図 14. AVD を作成する
これにより、「Create new Android Virtual Device (新規 Android 仮想デバイスを作成)」ダイアログ・ボックスが表示されるので、「Name (名前)」を指定し、「Target (ターゲット)」として「Android 2.2-API Level 8」を選択します。「SD Card (SD カード)」のサイズを 100 MiB に設定します。これだけの容量があれば Web クライアント・アプリケーションのインストールには十分です。もっと小さな値 (10 など) を設定すると、「No space left on device (デバイス上に残りスペースがありません)」というエラーが発生する可能性があります。「Create AVD (AVD を作成)」をクリックし、AVD を作成します (図 15)。
図 15. AVD を構成する
新規の AVD が図 16 のように作成されます。
図 16. 新規の AVD
Android クライアントを実行し、Web サービスにアクセスする
Android
エミュレーターには、エミュレーターをカスタマイズするためのさまざまなオプションがあります。例えば、エミュレーターの大きさを設定するには、下記のオプションを使って scale の値を指定します。
-scale <value> |
エミュレーター・オプションを指定するためには、AndroidWSClient アプリケーションを右クリックし、「Run
As.. (実行)」 > 「Run Configurations (実効の構成)」の順に選択します。AndroidWSClient アプリケーションを選択し、「Target (ターゲット)」タブの「Additional Emulator
Command Line Options (エミュレーター・コマンド行の追加オプション)」フィールドで -scale オプションを指定して「Apply (適用)」をクリックします (図 17)。
図 17. エミュレーターの scale オプションを設定する
エミュレーター上に AndroidWSClient アプリケーションをインストールして実行するためには、AndroidWSClient を右クリックし、「Run As.. (実行)」 > 「Android Application (Android アプリケーション)」の順に選択します (図 18)。
図 18. Android アプリケーションを実行する
これにより、AndroidWSClient アプリケーションが AVD にインストールされます (図 19)。このアプリケーションをクリックし、AVD で Web サービス・クライアントを実行します。
図 19. Android Web サービス・クライアントがインストールされた様子
Web サービスが呼び出され、Web サービスからのレスポンスが Android エミュレーターに表示されます (図 20)。
図 20. Web サービスにアクセスする
この Android アプリケーションを実行した結果の出力をリスト 6 に示します。
リスト 6. Android アプリケーションからの出力
AndroidWSClient] Android Launch!
AndroidWSClient] adb is running normally.
AndroidWSClient] Performing android.webservice.client.AndroidWSClient activity launch
AndroidWSClient] Automatic Target Mode: launching new emulator with compatible AVD
'AndroidAVD'
AndroidWSClient] Launching a new emulator with Virtual Device 'AndroidAVD'
AndroidWSClient] New emulator found: emulator-5554
AndroidWSClient] Waiting for HOME ('android.process.acore') to be launched...
AndroidWSClient] HOME is up on device 'emulator-5554'
AndroidWSClient] Uploading AndroidWSClient.apk onto device 'emulator-5554'
AndroidWSClient] Installing AndroidWSClient.apk...
AndroidWSClient] Success!
AndroidWSClient] Starting activity android.webservice.client.AndroidWSClient on device
emulator-5554
AndroidWSClient] ActivityManager: Starting: Intent { act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER]
cmp=android.webservice.client/.AndroidWSClient }
|
この Android アプリケーションを実行した場合、以下のタスクが実行されます。
- 新しいエミュレーターが起動されます。
AndroidWSClient.apkがエミュレーターにアップロードされます。AndroidWSClient.apkがインストールされます。android.webservice.client.AndroidWSClientアクティビティーが起動されます。
学ぶために
- Android について学んでください。Android アプリケーションを作成するためのツールやドキュメントについても調べてください。
- developerWorks のSOA and web
services ゾーンには、Web サービスのスキルを磨くためのプロジェクト・リソースが豊富に用意されています。
- 「Develop
and deploy JAX-WS Web services on WebSphere Application Server Community Edition
V2.0」(developerWorks、2007年9月) は、WebSphere アプリケーション・サーバーで JAX-WS Web サービスを作成、デプロイする方法を学ぶためのチュートリアルです。
製品や技術を入手するために
- Android SDK をダウンロードしてください。
- ksoap2-android
ライブラリーをダウンロードしてください。
- Java EE 用の開発環境、Eclipse
の最新バージョンをダウンロードしてください。