まず、Webサービス・クライアント作成のおさらいをしましょう。第3回では、Webサービス・クライアントを作る前に、JavaBeansをスタンドアロンのJavaアプリケーションとして動かしました。
SimpleAddBean.classは数字を加算して結果を返すJavaBeans
このときのJavaアプリケーションは次のようなプログラムでした(第3回より)。
●SimpleAddTest.java
package atmarkit;
public class SimpleAddTest {
public static void main(String[] args) {
SimpleAddBean myBean = new SimpleAddBean();
myBean.setInputValue(Integer.parseInt(args[0]));
myBean.add();
System.out.println(myBean.getResultValue());
myBean.setInputValue(Integer.parseInt(args[1]));
myBean.add();
System.out.println(myBean.getResultValue());
}
}
|
Beanをインスタンス化して、Beanの持つ機能を呼び出し、結果を得るというものでした(詳しくは第3回を参照してください)。
Javaアプリケーションでテストをした後、JavaBeansをWebサービス化しました。このWebサービス・プロバイダの作業は前回(第6回)でお話ししましたので、今回はWebサービス・リクエスターの作業をおさらいしてみます。
第3回のWebサービス・クライアントの作成では、いきなりプログラムを作りました。読者の中には「なぜ作れるんだ?」という疑問を持った方がいらっしゃるかもしれません。そうです。たまたま同じ人が「Webサービス・プロバイダ」を演じ、Webサービスを作成し、その人が「Webサービス・リクエスター」を演じ、Webサービス・クライアントを作ったからこそ(いきなりプログラムが)作れたのです。
そして、「マニュアル運転」Webサービス・クライアントでは、次のようなプログラムを作りました(第3回より)。
●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();
}
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 );
call.addParameter( "inputValue", XMLType.XSD_INT, ParameterMode.IN);
call.setOperationName( new QName("SimpleAddService", "setInputValue") );
call.invoke( new Object[] { new Integer(args[0]) } );
call.removeAllParameters();
call.setOperationName( new QName("SimpleAddService", "add") );
call.invoke(new Object[] {});
call.setOperationName( new QName("SimpleAddService", "getResultValue") );
Integer result1 = (Integer) call.invoke(new Object[] {});
System.out.println(result1.toString());
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();
}
}
}
|
いまさらですが、このプログラムは容易に理解できましたか? 確かにある程度決まった処理を記述していくものですが、とても簡単とはいえないと思います。
このように、これまでのWebサービス・クライアントは、Axisの提供するWebサービス専用のAPIを駆使していました。そのため、それなりに面倒なプログラミングになっていて、「直感的な」プログラミングとはかなりかけ離れたものでした。このプログラムを書くためには、SOAP RPCの動作を知っていることが前提です。「メッセージ」を組み立てて「実行(invoke)」し「結果」を受け取るというSOAP RPCの手順の繰り返しをプログラムの中に書いていく必要があります。第3回で解説したように、よく読めばJavaアプリケーションと対応していることが読み取れますが、Axis APIのマニュアルなしで書いていくことは難しいのではないでしょうか。
そこで、せっかくWebサービスの仕様をXMLで記述しているWSDLファイルがあるのですから、なんとかそこからWebサービス・クライアントを簡単に作れないものでしょうか。
これまでのWebサービス・クライアントのようにSOAPを意識したプログラミングではなく、あたかもJavaアプリケーションのように記述することができたなら、Webサービス・リクエスターは簡単にWebサービス・クライアントを作ることができるはずです。