Apache HttpClient による Android クライアントを JAX-RS Web サービスに展開する

Apache HttpClient を使用して Android クライアントを作成する方法を学んでください

Apache HttpClient ライブラリーを使用して JAX-RS Web サービスにアクセスしてみましょう。RESTful な Web サービスを作成するには、JAX-RS のリファレンス実装である Jersey を使用すると、 Java 環境で簡単に作成することができます。Android は人気のスマートフォンです。この記事では、Android による JAX-RS クライアントを作成します。具体的には、Apache HttpClient ライブラリーを使用して、JAX-RS Web サービスにアクセスするためのクライアントを作成します。

Deepak Vohra, Consultant, Independent

Deepak Vohra は Sun 認定 Java プログラマーであり、Sun 認定の Web コンポーネント開発者でもあります。彼は Java Developer's Journal と XML Journal に記事を発表しています。



2011年 11月 11日

はじめに

Spring Android について探る

もう 1 つの選択肢として Spring Android があります。Spring Android による REST クライアントを使用して RESTful な Web サービスにアクセスする方法を、この記事と同じ著者の Deepak による以下の記事で学んでください。

Android の Spring クライアントを JAX-RS Web サービスに展開する

REST ソフトウェア・アーキテクチャーではリソースの表現を転送します。単純、軽量、高速といったメリットがある RESTful な Web サービスでは、URI によって特定される一連のリソースを公開し、これらのリソースは HTTP の GET、POST、PUT、DELETEメソッドに応答します。リソースにアクセスするためのフォーマットには、HTML、プレーン・テキスト、XML、PDF、JPEG、JSON などがあります。JAX-RS (Java API for RESTful Web services) は JSR 311 で定義されています。Jersey は JAX-RS のリファレンス実装であり、Jersey を使用すると RESTful な Web サービスを Java で簡単に作成することができます。

この記事では、人気のスマートフォン・プラットフォームである Android 用の JAX-RS クライアントを Apache HttpClient ライブラリーを使用して作成する方法について説明します。この記事で使用するサンプル・コードは「ダウンロード」セクションからダウンロードすることができます。


環境を設定する

よく使われる頭文字語

  • API: Application Programming Interface
  • HTML: HyperText Markup Language
  • HTTP: HyperText Transfer Protocol
  • IDE: Integrated Development Environment
  • JSON: JavaScript Object Notation
  • MIME: Multipurpose Internet Mail Extensions
  • POJO: Plain Old Java Object
  • REST: REpresentational State Transfer
  • SDK: Software Development Kit
  • UI: User Interface
  • URI: Uniform Resource Identifier
  • URL: Uniform Resource Locator
  • XML: Extensible Markup Language

JAX-RS Web サービスのクライアントを作成する前に、環境を構築する必要があります。「参考文献」のリンクを参照してください。

  1. Eclipse をインストールします。
  2. Eclipse に ADT (Android Development Tools) プラグインをインストールします。ADT には Eclipse で Android アプリケーションを作成するための一連の拡張機能が用意されています。
  3. SDK Platform Android 2.2 をインストールします。Android SDK には Android アプリケーションを作成するためのツールが用意されています。
  4. Android のエミュレーター、AVD (Android Virtual Device) を Eclipse で作成します。
  5. Jersey の JAR と主な依存関係を含む Jersey アーカイブ (jersey-archive-1.4.zip) をダウンロードします。Jersey バンドルのJAR である jersey-bundle-1.4.jar をダウンロードします。

    Jersey は JDK 6.0 を使用してビルドされています。そのため、JDK 6.0 もインストールする必要があります。

  6. Tomcat などの Web サーバー、または WebSphere や WebLogic サーバーなどのアプリケーション・サーバーをインストールします。リスト 1 に示す Jersey の JAR ファイルをアプリケーション・サーバーまたは Web サーバーのランタイムの CLASSPATH に追加します。
    リスト 1. Jersey の JAR ファイル
    C:\Jersey\jersey-bundle-1.4.jar;C:\Jersey\jersey-archive-1.4\lib\asm-3.1.jar;
    C:\Jersey\jersey-archive-1.4\lib\jsr311-api-1.1.1.jar

Eclipse プロジェクトを作成する

このセクションでは、Web プロジェクトを作成し、そのプロジェクトに JAX-RS ファセットを追加します。以下のステップで Eclipse プロジェクトを作成します。

  1. File (ファイル)」 > 「New (新規)」 > 「Other (その他)」の順に選択し、表示される「New (新規)」ウィンドウで 「Web」 > 「Dynamic Web Project (動的 Web プロジェクト)」の順に選択したら、「Next (次へ)」をクリックします。
  2. プロジェクト名を指定し (例えば AndroidJAX-RS など)、「New Runtime (新規ランタイム)」をクリックし、WebSphere、Tomcat、または WebLogic サーバー用の新規ターゲット・ランタイムを構成します。図 1 に入力が完了した「Dynamic Web Project (動的 Web プロジェクト)」ウィンドウを示します。
    図 1. 新規ランタイムを構成する
    新規ランタイム・プロジェクトを構成して作成する画面のスクリーン・キャプチャー
  3. 「New Server Runtime Environment (新規サーバー・ランタイム環境)」ウィンドウで、サーバーを選択し (Tomcat サーバー、WebSphere サーバー、WebLogic サーバーなど)、図 2 のように「Next (次へ)」をクリックします。
    図 2. アプリケーション・サーバーまたは Web サーバーを選択する
    アプリケーション・サーバーまたは Web サーバーを選択する画面のスクリーン・キャプチャー
  4. 「New IBM WebSphere v6.0 Runtime (新規 IBM WebSphere v6.0 ランタイム)」ウィンドウで、JRE と、 IBM WebSphere のインストール・ディレクトリーを構成します。「Dynamic Web Project (動的 Web プロジェクト)」ダイアログで「Next (次へ)」をクリックします。「Source folders on build path (ビルド・パス上のソース・フォルダー)」と「Default output folder (デフォルト出力フォルダー)」には Java のデフォルト設定を選択し、「Next (次へ)」をクリックします。
  5. 「Context root (コンテキスト・ルート)」には「AndroidJAX-RS」と指定し、「Content Directory (コンテンツ・ディレクトリー)」はデフォルト値を選択した後、「Next (次へ)」をクリックします。

    動的な Web プロジェクトが作成され、「Project Explorer (プロジェクト・エクスプローラー)」に追加されます。そのプロジェクトのノードを右クリックし、「Properties (プロパティー)」を選択します。

  6. Project Facets (プロジェクト・ファセット)」を選択した後、「JAX-RS (REST Web Services) 1.1」というプロジェクト・ファセットを選択します。図 3 のように「Further configuration required (より詳しい構成が必要)」をクリックします。
    図 3. JAX-RS プロジェクト・ファセットを構成する
    JAX-RS ファセットを構成する画面のスクリーン・キャプチャー
  7. 「JAX-RS Capabilities (JAX-RS 機能)」ウィンドウで、「JAX-RS servlet name (JAX-RS サーブレット名)」を「JAX-RS Servlet」と指定し、JAX-RS 実装ライブラリーを構成します。JAX-RS 実装ライブラリーのタイプとしては、「Type (型)」フィールドで「User Library (ユーザー・ライブラリー)」を選択し、「Manage libraries (ライブラリーを管理)」をクリックします。
  8. 「User Libraries (ユーザー・ライブラリー)」ウィンドウでは、「New (新規)」をクリックします。「New User Library (新規ユーザー・ライブラリー)」ダイアログでユーザー・ライブラリーの名前を指定し、「OK」をクリックします。

    これにより、ユーザー・ライブラリーが追加されます。「Add JARs (JAR 追加)」をクリックし、ユーザー・ライブラリーに Jersey JAR を追加します。図 4 のように、以下の Jersey JAR を追加します。

    • jersey-bundle-1.4.jar
    • C:\Jersey\jersey-archive-1.4\lib\asm-3.1.jar
    • C:\Jersey\jersey-archive-1.4\lib\jsr311-api-1.1.1.jar

    OK」をクリックします。

    図 4. Jersey JAR ファイルを追加する
    ビルド・パスに Jersey JAR ファイルを追加する画面のスクリーン・キャプチャー
  9. 「JAX-RS Capabilities (JAX-RS 機能)」ウィンドウで、図 5 のように「JAX-RS servlet class name (JAX-RS サーブレット・クラス名)」に「com.sun.jersey.spi.container.servlet.ServletContainer」を指定して、「OK」をクリックします。
    図 5. JAX-RS サーブレット・クラス名を指定する
    JAX-RS サーブレット・クラス名を指定する画面のスクリーン・キャプチャー
  10. 図 6 のように「Project Facets (プロジェクト・ファセット)」ウィンドウで「Apply (適用)」をクリックし、続いて「OK」をクリックします。
    図 6. JAX-RS プロジェクト・ファセットを適用する
    JAX-RS プロジェクト・ファセットを適用する画面のスクリーン・キャプチャー

ターゲット・ランタイムは JAX-RS プロジェクト・ファセットによって構成されます。「Properties (プロパティー)」ダイアログで「OK」をクリックします。

JAX-RS ユーザー・ライブラリーがプロジェクトに追加され、JAX-RS Servlet とサーブレット・マッピングが web.xml の中で構成されます。com.sun.jersey.config.property.resourceConfigClasscom.sun.jersey.config.property.packages に初期化パラメーターとして init-param 要素を追加する必要があります。リスト 2 は web.xml を示しています。

リスト 2. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/
xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/
ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>jaxrs</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

リソース・クラスを作成し、実行する

次のステップとして、ルート・リソース・クラスを使用して RESTful な Web サービスのリソースを作成します。ルート・リソース・クラスは @PATH アノテーションが付けられた POJO です。このクラスは、アノテーションとして @PATH または @GET@PUT@POST@DELETE が付けられた少なくとも 1 つのメソッドで構成されます。

  1. File (ファイル)」 > 「New (新規)」 > 「Other (その他)」の順に選択します。「New (新規)」ダイアログで「Java」 > 「Class (クラス)」の順に選択し、「Next (次へ)」をクリックします。
  2. 図 7 のように、「New Java Class (新規 Java クラス)」ウィンドウで以下のように指定します。
    • Source folder (ソース・フォルダー): AndroidJAX-RS/src
    • Package (パッケージ): jaxrs
    • Name (名前): HelloWorldResource

    Finish (完了)」をクリックします。

    図 7. リソース・クラスを作成する
    リソース・クラスを作成する画面のスクリーン・キャプチャー

この Java クラスに @PATH アノテーションを付けます。リスト 3 のコードは、この Java クラスをホストする URI のパスを /helloworld と指定しています。

リスト 3. リソース・クラスに @PATH アノテーションを付ける
@Path("/helloworld")
public class HelloWorldResource {
...
}

3 つの異なる MIME タイプを生成するために、3 つのリソース・メソッド getClichedMessage()getXMLMessage()getHTMLMessage() を追加します。各メソッドに @GET アノテーションを付けます。@GET アノテーションにより、これらのメソッドが HTTP GET リクエストを処理することを示します。これらの各メソッドの戻り型として、String を指定します。各メソッドに @PRODUCES アノテーションを付け、各メソッドに対し、それぞれ異なる MIME タイプを指定します。

ここでは、3 つのメソッドに MIME タイプとしてそれぞれ text/plaintext/xmltext/html を指定して、「Hello Android」という出力を生成します。getXMLMessage メソッドに @Produces ("text/xml") アノテーションを付けると、XML メッセージが生成されます。@GET アノテーションが付いたメソッドのうち、1 つのメソッドのみをコメント解除します。他にパスを識別するコンポーネントが指定されていない場合、@GET リクエストは @GET アノテーションが付いたメソッドにルーティングされます。リクエスト URI に一致するメソッドが複数ある場合には、JAX-RS の選択アルゴリズムを使用してリソース・メソッドが選択されます。例えば、@GET アノテーションが付いた複数のメソッドそれぞれに異なるパス ID を使用すると、@GET アノテーションが付いたメソッドを複数指定することができます。リスト 4 はルート・リソース・クラスを示しています。

リスト 4. HelloWorldResource.java
package jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

// The Java class will be hosted at the URI path //"/helloworld"
@Path("/helloworld")
public class HelloWorldResource {

    // The Java method will process HTTP GET requests
     @GET
    // The Java method will produce content identified by the MIME Media
    // type "text/plain"
     @Produces("text/plain")
     public String getClichedMessage() {
    // Return some cliched textual content
     return "Hello Android";
     }

    // @GET
    // @Produces("text/xml")
    // public String getXMLMessage() {
    // return "<?xml version=\"1.0\"?>" + "<hello> Hello Android" + "</hello>";
    // }

//	@GET
    //@Produces("text/html")
    //public String getHTMLMessage() {
        //return "<html> " + "<title>" + "Hello Android" + "</title>"
            //	+ "<body><h1>" + "Hello Android" + "</body></h1>" + 
    "</html> ";
//	}

}

このリソース・クラスを実行すると、異なるタイプの出力が生成されます。テストを実行する際には、それぞれのテストの対象ではないメソッドをコメントアウトし、コメント解除されたメソッドが 1 つのみであるようにします。最初に、出力 MIME タイプとして text/xml をテストします。まだアプリケーション・サーバーまたは Web サーバーが起動されていない場合には、起動します。リソース・クラスを右クリックし、「Run As (実行)」 > 「Run on Server (サーバーで実行)」の順に選択します (図 8)。

図 8. リソース・クラスを実行する
JAX-RS アプリケーションで「Run As (実行)」 > 「Run on Server (サーバーで実行)」の順に選択した場合のポップアップ・メニューのスクリーン・キャプチャー

web.xml で指定されているように、サーバーで初期パラメーター com.sun.jersey.config.property.resourceConfigClasscom.sun.jersey.api.core.PackagesResourceConfig に初期化され、初期パラメーター com.sun.jersey.config.property.packagesjaxrs に初期化されます。ルート・リソース・クラス jaxrs.HelloWorldResource が検出されます。Jersey アプリケーション v1.4 が初期化され、AndroidJAX-RS モジュールがサーバーにデプロイされます。


Android クライアント・プロジェクトを作成する

このセクションでは、Android 用の JAX-RS クライアントを作成するための Android プロジェクトを作成します。

  1. Eclipse IDE で「File (ファイル)」 > 「New (新規)」 > 「Other (その他)」の順に選択します。「New (新規)」ダイアログで「Android」 > 「Android Project (Android プロジェクト)」の順に選択し、「Next (次へ)」をクリックします。
  2. 「New Android Project (新規 Android プロジェクト)」ウィンドウで、図 9 のようにフィールドに値を入力します。
    • Project name (プロジェクト名): AndroidJAXRSClient
    • Build Target (ビルド・ターゲット): Android Platform 2.2 API 8
    • Properties (プロパティー): 「Application name (アプリケーション名)」には「AndroidJAXRSClient」、「Package name (パッケージ名)」には「android.jaxrs」を入力します。
    • 「Create Activity (アクティビティーの作成)」を選択し、アクティビティー・クラスとして「AndroidJAXRSClient」を指定します。

      アクティビティーはユーザーとの対話を表し、Activity クラスを継承するクラスが UI 用のウィンドウを作成します。

    • Minimum SDK Version (最小 SDK バージョン): 8
    • Next (次へ)」をクリックします。
    図 9. JAX-RS クライアント・クラスを作成する
    「New Android Project (新規 Android プロジェクト)」ウィザードで「New Android Project (新規 Android プロジェクト)」を作成する画面のスクリーン・キャプチャー

Android プロジェクトの中には以下のファイルがあります。

  • Activity クラスを継承するアクティビティー・クラス (AndroidJAXRSClient)
  • Android アプリケーションのレイアウトを指定する res/layout/main.xml ファイル
  • AndroidManifest.xml ファイル。このファイルには、パッケージ名、アプリケーションのコンポーネント、プロセス、パーミッション、Android システムの最小 API レベルなど、アプリケーションの構成情報が含まれています。

res/layout/main.xml ファイルの中では、Android UI コンポーネントのレイアウトを指定します。android:orientation="vertical" を指定することで LinearLayout を作成します。作成する UI コンポーネントには、Web サービスからのレスポンスがテキスト・メッセージとして表示されるようにします。そのために、jaxrs という ID を持つ TextView 要素を追加することで、get メソッドのうちの 1 つが呼び出された場合に JAX-WS Web サービスから返されるレスポンスが表示されるようにします。その get メソッドが呼び出されるとレスポンスとして Hello メッセージが XML、HTML、テキストのいずれかの形式で返されます。リスト 5 に main.xml ファイルを示します。

リスト 5. 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:id="@+id/jaxrs"
     android:layout_width="fill_parent" android:layout_height="wrap_content"
                />
</LinearLayout>

Android 機器から JAX-RS Web サービスにアクセスするためには、AndroidManifest.xml の中で android.permission.INTERNET パーミッションを有効にします。このパーミッションにより、アプリケーションがネットワーク・ソケットを開くことができます。そのためにはリスト 6 の uses-permission 要素を追加します。

リスト 6. INTERNET パーミッションを設定する
<uses-permission  android:name="android.permission.INTERNET"></uses-permission>

uses-sdk 要素を使用して最低限必要な Android バージョンを指定します。AndroidJAXRSClient のアクティビティーとして、intent-filteraction が、activity 要素とそのサブ要素で指定されます。リスト 7 に AndroidManifest.xml ファイルを示します。

リスト 7. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.jaxrs" android:versionCode="1" android:versionName="1.0">
     <uses-sdk android:minSdkVersion="8" />
     <application android:icon="@drawable/icon" android:label="@string/app_name">
       <activity android:name=".AndroidJAXRSClient" 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-sdk android:minSdkVersion="8" />
     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Android SDK には Apache HttpClient ライブラリーが含まれています。リスト 8 のクラスを AndroidJAXRSClient にインポートします。

リスト 8. Apache HttpClient ライブラリー
org.apache.http.HttpEntity;
org.apache.http.HttpResponse;
org.apache.http.client.ClientProtocolException;
org.apache.http.client.HttpClient;
org.apache.http.client.methods.HttpGet;
org.apache.http.impl.client.DefaultHttpClient;

AndroidJAXRSClient クラスは Activity クラスを継承します。onCreate(Bundle savedInstanceState) メソッドはアクティビティーが最初に呼び出された時に呼び出されます。リスト 9 のように、setContentView メソッドとレイアウト・リソースを使ってユーザー・インターフェースを定義します。

リスト 9. UI を定義する
setContentView(R.layout.main);

リスト 10 に TextView オブジェクトという Android ウィジェットの作成方法を示します。このオブジェクトの作成には、main.xml で定義された、jaxrs という ID を持つ TextView 要素の findViewById メソッドが使われています。

リスト 10. Android ウィジェットを作成する
TextView jaxrs = (TextView) findViewById(R.id.jaxrs);

HttpClient のデフォルトの実装は DefaultHttpClient です。リスト 11 のように DefaultHttpClient オブジェクトを作成します。

リスト 11. HttpClient を作成する
HttpClient httpclient = new DefaultHttpClient();

リスト 12 のように、サーバーから情報を取得するための HttpGet オブジェクトを作成します。URL としては、URI パス /helloworld 上にホストされているリソースの URL を指定し、localhost ではなくホストの IP アドレスを指定します。クライアントは Android 機器上で実行されますが、JAX-RS Web サービスが実行されるホストは Android 機器の localhost ではありません (ただし JAX-RS Web サービスも Android 機器上にホストされる場合は別ですが、ここで説明している例は、それには該当しません)。

リスト 12. HttpGet オブジェクトを作成する
HttpGet request = new HttpGet("http://192.168.1.68:7001/AndroidJAX-RS/jaxrs/helloworld");

受け付け可能なメディア・タイプを Accept ヘッダーを使用して指定します。Accept ヘッダーで設定するメディア・タイプは 1 つのみとし、このメディア・タイプは JAX-RS Web サービスで生成されるメディア・タイプに対応している必要があります。最初に実行する際に、リスト 13 のように Accept ヘッダーを text/xml に設定すると、レスポンスとして text/xml が出力されます。

リスト 13. Accept ヘッダーを設定する
request.addHeader("Accept", "text/xml");
//request.addHeader("Accept", "text/html");
//request.addHeader("Accept", "text/plain");

それぞれのレスポンス・タイプ (プレーン・テキスト、HTML、XML) で出力されるかどうかをテストします。受け付け可能なレスポンス・タイプはリソース・クラスで生成される MIME タイプと一致する必要があります。リソース・クラスが生成する MIME タイプは受け付け可能な MIME タイプと一致する必要があります。生成された MIME タイプと受け付け可能な MIME タイプとが一致しない場合には、com.sun.jersey.api.client.UniformInterfaceException が生成されます。例えば、受け付け可能な MIME タイプを text/xml に設定し、生成される MIME タイプを application/xml に設定すると、UniformInterfaceException が生成されます。リスト 14 のように、HttpGet オブジェクトを引数として HttpClientexecute() メソッドを呼び出し、HttpResponse オブジェクトを取得します。

リスト 14. HttpResponse を取得する
HttpResponse response = httpclient.execute(request);

getEntity() メソッドを使用して HttpResponse から HttpEntity を取得します (リスト 15)。

リスト 15. HttpEntity を取得する
HttpEntity entity = response.getEntity();

getContent() メソッドを使用して HttpGet から InputStream としてコンテンツを取得します (リスト 16)。

リスト 16. HttpEntity から InputStream を作成する
InputStream instream = entity.getContent();

JAX-RS Web サービスから返されるメッセージ用に StringBuilder を作成します (リスト 17)。

リスト 17. StringBuilder を作成する
StringBuilder sb =  new StringBuilder();

InputStream から BufferedReader を作成します (リスト 18)。

リスト 18. BufferedReader を作成する
BufferedReader r = new BufferedReader(new InputStreamReader(instream));

BufferedReader から 1 行ずつ読み込み、StringBuilder に追加します (リスト 19)。

リスト 19. BufferedReader を読み込む
for (String line = r.readLine(); line != null; line = r.readLine()) {
             sb.append(line);	
}

StringBuilder から String メッセージを取得し、InputStream を閉じます (リスト 20)

リスト 20. StringBuilder のメッセージを取得する
String jaxrsmessage = sb.toString();		
instream.close();

その String メッセージを TextView UI コンポーネントに設定します (リスト 21)。

リスト 21. StringBuilder のメッセージを設定する
jaxrs.setText(jaxrsmessage);

リスト 22 に AndroidJAXRSClient クラスを示します。

リスト 22. AndroidJAXRSClient.java
package android.jaxrs;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class AndroidJAXRSClient extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);

          TextView jaxrs = (TextView) findViewById(R.id.jaxrs);
          try {
               HttpClient httpclient = new DefaultHttpClient();
               HttpGet request = new HttpGet(
                  "http://192.168.1.68:7001/AndroidJAX-RS/jaxrs/helloworld");

               //request.addHeader("Accept", "text/html");
          //	request.addHeader("Accept", "text/xml");
               request.addHeader("Accept", "text/plain");
               HttpResponse response = httpclient.execute(request);
               HttpEntity entity = response.getEntity();
               InputStream instream = entity.getContent();
               String jaxrsmessage = read(instream);
               jaxrs.setText(jaxrsmessage);
          } catch (ClientProtocolException e) {
               e.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          }

     }

     private static String read(InputStream instream) {
          StringBuilder sb = null;
          try {
               sb = new StringBuilder();
               BufferedReader r = new BufferedReader(new InputStreamReader(
                         instream));
          for (String line = r.readLine(); line != null; line = r.readLine()) {
               	sb.append(line);
			}

			instream.close();

          } catch (IOException e) {
          }
          return sb.toString();

     }

}

図 10 は、この Android クライアント・アプリケーションのディレクトリー構造を示しています。

図 10. Android アプリケーションのディレクトリー構造
Android クライアント・アプリケーションのディレクトリー構造を示す画面のスクリーン・キャプチャー

クリックして大きなイメージを見る

図 10. Android アプリケーションのディレクトリー構造

Android クライアント・アプリケーションのディレクトリー構造を示す画面のスクリーン・キャプチャー

Android クライアントを実行する

ここまでで、Android クライアントを実行して JAX-RS Web サービスを呼び出し、XML メッセージを出力する準備が整いました。図 11 のように、「AndroidJAXRSClient」プロジェクトを右クリックし、「Run As (実行)」 > 「Android Application (Android アプリケーション)」の順に選択します。

図 11. Android JAX-RS クライアントを実行する
Android アプリケーションを右クリックして「Run As (実行)」 > 「Android Application (Android アプリケーション)」の順に選択した画面のスクリーン・キャプチャー

図 12 に示すように、Android AVD が起動し、JAX-RS クライアント・アプリケーションが Android 機器にインストールされます。

図 12. Android JAX-RS クライアントが Android にインストールされる
Android JAX-RS クライアントが Android にインストールされた画面のスクリーン・キャプチャー

AndroidJAXRSClient アクティビティーが起動され、JAX-RS Web サービスのリソースによって生成された XML メッセージが Android 機器に出力されます (図 13)。

図 13. Android 機器に出力された XML メッセージ
Android 機器に XML メッセージが出力された画面のスクリーン・キャプチャー

同様に、text/html メディア・タイプを生成するメソッドがリソース・クラスでコメント解除され、Accept ヘッダーでも text/html メディア・タイプを受信するように設定されると、HTML メッセージが出力されます。例えば、リスト 23 のようにリソース・クラスで当該メソッドのコメントを解除します。

リスト 23. リソース・クラスで HTML を生成する
@GET
@Produces("text/html")
public String getHTMLMessage() {
          return "<html> " + "<title>" + "Hello Android" + "</title>"
     + "<body><h1>" + "Hello Android" + "</body></h1>" + "</html> ";
     }

クライアント・クラスで、addHeader の呼び出しをコメント解除します (リスト 24)。

リスト 24. メディア・タイプを Accept に設定する
request.addHeader("Accept", "text/html");

AndroidJAXRSClient アプリケーションを再度実行すると、図 14 に示すような HTML レスポンスが得られます。

図 14. Android 機器に HTML が出力される
Android 機器に HTML が出力された画面のスクリーン・キャプチャー

テキスト・レスポンスを取得するためには、リソース・クラスで当該メソッドのコメントを解除します (リスト 25)。

リスト 25. リソース・クラスでメディア・タイプとしてテキストを生成する
@GET
@Produces("text/plain")
public String getClichedMessage() {
return "Hello Android";
 }

クライアント・クラスで、以下のように Accept ヘッダーのメディア・タイプの設定をコメント解除します (リスト 26)。

リスト 26. Accept ヘッダーを設定する
request.addHeader("Accept", "text/plain");

AndroidJAXRSClient アプリケーションを再度実行すると、図 15 に示すようなテキスト・メッセージが出力されます。

図 15. Android 機器にテキスト・メッセージを出力する
Android 機器にテキスト・メッセージが出力された画面のスクリーン・キャプチャー

まとめ

この記事では、JAX-RS Web サービスを作成する方法と、その Web サービスを Android クライアントから呼び出す方法について学びました。また XML、HTML、テキストのいずれかの形式でメッセージを送信して Android 機器に表示する方法を学びました。


ダウンロード

内容ファイル名サイズ
Sample code scripts from the articleandroid-jaxrs-sourcecode.zip852KB

参考文献

学ぶために

製品や技術を入手するために

  • Android SDK: Android SDK をダウンロードし、開発を開始してください。
  • Eclipse Downloads: Eclipse for Java EE をダウンロードしてください。
  • IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source, Web development, SOA and web services
ArticleID=772509
ArticleTitle=Apache HttpClient による Android クライアントを JAX-RS Web サービスに展開する
publish-date=11112011