連載
» 2002年10月12日 00時00分 公開

JavaBeansからWebサービスを作るパソコンで試してわかるWebサービス(3)(5/6 ページ)

[イチロー,樋口研究室監修]

Webサービス・クライアントを作る

 Webサービスが作成できたら、それにアクセスするWebサービス・クライアントが必要です。クライアントは次のようなプログラムになります。少し複雑なプログラムのように見えますが、順を追って中を見ていきましょう。そうすれば理解できるはずです。

  ●SimpleAddClient.java
package atmarkit;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.utils.Options;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;

public class SimpleAddClient {

  public static void main(String [] args) {

    try {
      Options options = new Options(args);

      
String endpointURL;

      if (args.length > 2 && args[2] != null) {
        endpointURL = args[2];
      } else {
        endpointURL = options.getURL();
      }
(1)
      

Service service = new Service();
      Call call = (Call) service.createCall();
      call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
      call.setReturnType( org.apache.axis.encoding.XMLType.XSD_INT );
(2)

call.addParameter( "inputValue", XMLType.XSD_INT, ParameterMode.IN);
      call.setOperationName( new QName("SimpleAddService", "setInputValue") );
      call.invoke( new Object[] { new Integer(args[0]) } );
(3)

      
call.removeAllParameters();
      call.setOperationName( new QName("SimpleAddService", "add") );
      call.invoke(new Object[] {});
(4)

      
call.setOperationName( new QName("SimpleAddService", "getResultValue") );
      Integer result1 = (Integer) call.invoke(new Object[] {});
      System.out.println(result1.toString());
(5)

      call.addParameter( "inputValue", XMLType.XSD_INT, ParameterMode.IN);
      call.setOperationName( new QName("SimpleAddService", "setInputValue") );
      call.invoke( new Object[] { new Integer(args[1]) } );

      call.removeAllParameters();
      call.setOperationName( new QName("SimpleAddService", "add") );
      call.invoke(new Object[] {});

      call.setOperationName( new QName("SimpleAddService", "getResultValue") );
      Integer result2 = (Integer) call.invoke(new Object[] {});
      System.out.println(result2.toString());

    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
(1) Webサービスのエンドポイント取得
Webサービス・クライアントは個々のWebサービスに直接アクセスするのではなく、WebサービスのエンジンであるAxisServletにアクセスしました(第2回参照)。このアクセスポイントをエンドポイント(End Point)といいます。ここでは、そのエンドポイントを取得しています。3つ目の引数がある場合は、それをエンドポイントとしますが、それ以外の場合はデフォルト値を取得しています。

(2) サービスとCallオブジェクトの生成

Serviceオブジェクトを生成し、そこからCallオブジェクトを取得します。このCallオブジェクトがWebサービスと通信をする媒体と思ってください。第2回の解説でいえば、SOAPエンベロープだと思っていただいてもいいでしょう。このSOAPエンベロープの中にさまざまなデータを入れて、Webサービスに送信することになります。


(3)(4)(5) Webサービスの呼び出し

(2)で作成したCallオブジェクトに値をセットしてWebサービスを呼び出します。(3)では、Webサービスの「setInputValue」メソッドを呼び出しています。引数の型を指定して(addParameter)、呼び出すWebサービスとその機能(メソッド)を指定して(setOperationName)、呼び出します(invoke)。(4)(5)も同様のことを繰り返しますが、WebサービスのaddメソッドやgetResultValueメソッドは引数を持たないため、removeAllParametersメソッドを実行していることに注意してください。

 また、(3)(4)(5)のいずれも引数や戻り値はすべてXML Schemaの整数型(XMLType.XSD_INT)を利用しています。このXML Schemaの整数型はJavaではプリミティブ型のintではなくクラスのInteger型を利用しています。その変換が必要なことに注意してください。

 ここまで分かれば、あとは第1引数と第2引数を利用して同じことを2回繰り返していることが分かるでしょう。前にテストしたJavaアプリケーション(SimpleAddTest)と比較してみるといいでしょう。呼び出しているメソッドは同じものですが、Webサービス・クライアントの場合、SOAPを利用したリモートプロシージャコールになる分だけ複雑になっています。

 少しだけ将来の話をしておきましょう。「このクライアントプログラムを書くのが面倒だ!」と感じているのならば、安心してください。Webサービス・クライアントをもっと簡単に作る方法が連載が進んでいったところで出てきます。第1回「Webサービスを学ぶ環境を作る」の最初にいったように、「マニュアル車を運転してから、オートマ、自動走行になる」の中の、いまはマニュアル車状態なのです。ちゃんとクラッチを踏んで安全運転していきましょう。

 さて、Webサービス・クライアントを作成しましょう。エディタで記述して<@WORK>\atmarkitディレクトリに保存してください。その後、下記のコマンドでコンパイルします。

>javac atmarkit\SimpleAddClient.java

 エラーなく終了し、<@WORK>\atmarkitディレクトリにSimpleAddClient.classができていればOKです。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。