Webサービスの作成

Webサービスは、図のようにSOAP通信をするためのライブラリを使って通信します。

では、Webサービスを開発していきましょう。これから行っていく作業手順は、次のようになります。

1.サービスのコードを作成する
2.Webアプリケーションとしてまとめる

 

サービスのコードを作成する

まずは実際にサービスを提供するコードを作成します。ここでは、引数なしの呼び出しに対して文字列 "HelloWorld" を返すサービスの作成について考えてみましょう。

public class SampleService {
    public String helloworld() { 
        return("HelloWorld \n");
    }
}

このようにコードを作成し、コンパイルしておきます。

javac SampleService.java

 

Webアプリケーションとしてまとめる

サービスのコードを作成したら、今度はそのサービスをWebアプリケーションとしてまとめます。
WebOTX Webサービスでは、あらかじめWebサービスに対応したWebアプリケーションを作るためのテンプレートを用意していますので、それを利用します。Webアプリケーションとしてまとめる作業は、次のような手順で行います。

・soap_base.war (Webアプリケーションテンプレート) を展開する
・作成したサービスを格納する
・DeployedServices.xml (サービスの構成情報) を記述する
・Webアプリケーションとしてまとめ直す

soap_base.war (Webサービス作成用テンプレート) を展開する

soap_base.warファイル (Webサービス作成用テンプレート) を、JARコマンドを利用して任意のディレクトリに展開します。以降、C:\temp配下に展開するものとして説明します。

C:\temp>jar xvf <InstallDIR>/webservice/webapps/soap_base.war

※<InstallDIR>は、WebOTXのインストールディレクトリです。以降の説明でも同様です。

展開すると、次のようなテンプレートがあらわれます。
classes配下にサービスとなるファイルを格納し、DeployedServices.xmlファイルを編集するだけで、Webサービスを作成することができます。

    +
    |---- soap.xml , DeployedServices.xml 
    |
    +WEB_INF 
        |---------- web.xml
        |
        +classes
        |
        |
        +lib
        |---------- soap.jar

 

作成したサービスを格納する

次のように、展開したテンプレートのclasses配下に、作成したサービスを格納します。

C:\temp>copy <サービスをコンパイルしたディレクトリ>\SampleService.class WEB_INF\classes

SampleService.classの格納後は、次のような構成になります。

    +
    |---- soap.xml , DeployedServices.xml 
    |
    +WEB_INF 
        |---------- web.xml
        |
        +classes
        |---------- SampleService.class
        |
        +lib
        |---------- soap.jar

 

DeployedServices.xml (サービスの構成情報) を記述する

展開したテンプレートに含まれる「DeployedServices.xml」ファイルを編集します。サービスの構成情報は、あらかじめ書かれているdeployedServices要素の中に定義します。一つのサービスにつき、一つのservice要素で囲みます。
今回、作成しているアプリケーションでは、次のように記述します。

<deployedServices>
    <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
                 id="SampleService">
        <isd:provider type="java"
                      scope="Request"
                      methods="helloworld">
            <isd:java class="SampleService"/>
        </isd:provider>
        <isd:faultListener>org.apache.soap.server.DOMFaultListener</isd:faultListener>
    </isd:service>
<deployedServices>

青字になっているところが、このサービス固有の値です。provider要素の中に、サービスのクラスとメソッドを指定していることがわかります。idには、ユニークなサービス名を指定しますが、ここではSampleServiceを指定しました。この値は、クライアントからアクセスする時のkeyになります。

 

Webアプリケーションとしてまとめ直す

これまで展開して加工したテンプレートを、再びJARコマンドを使ってWARファイルにまとめ直し、Webアプリケーションの形にします。
テンプレートを展開したルートディレクトリで、次のようにコマンドを実行してWebアプリケーションを作成してください。

C:\temp>jar cvf hello.war *.*

これで、Webサービスに対応したWebアプリケーションの作成が終わりました。

 

 

Webサービスの公開

では、Webサービスをクライアントから利用できるように公開しましょう。作成したWebアプリケーションを、Webコンテナに転送して配備することで公開します。

 

Webコンテナに転送・配備する

Webアプリケーションを動作させるWebコンテナとWWWサーバを起動します。
ブラウザで次のURLにアクセスし、Webコンテナの管理コンソールを起動します。

http://<ホスト名>:<ポート番号>/manager ・・・・・・・・・・・・・インストールしたWebコンテナのバージョンが4.0.2の場合
http://<ホスト名>:<ポート番号>/admin ・・・・・・・・・・・・・・・インストールしたWebコンテナのバージョンが3.2.3の場合

管理コンソールにアクセスすると、最初にログイン画面になります。

ログインすると、管理コンソールが表示されます。

管理コンソールが起動したら、「WebAP管理」の「転送」を選択します。

WARファイル・・・・・・C:\temp\hello.war (作成したWARファイルの格納場所を指定)
URL・・・・・・・・・・・・・/hello (このWebアプリケーションのURLを指定)

ここでは同時に配備も行うにチェックを入れ、転送をクリックします。
Webコンテナに作成したWebアプリケーションが転送・配備されます。最後に、Webコンテナ、Webサーバを再起動してください。
再起動は、Webコンテナで新規に作成したWebアプリケーションのURLを、Webサーバに反映させるために行います。
これでWebサービスの公開が終わりました。

 

 

クライアントの作成・実行

では、Webサービスを利用するクライアントを作成しましょう。

クライアントコードの作成

Webサービスにアクセスするクライアントコードを次のように作成します。

import java.io.*;
import java.net.*;
import java.util.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;


public class SampleClient {
    public static void main (String[] args) throws Exception {
  
        String sturl = "http://localhost/hello/servlet/rpcrouter";
        if(args.length > 1) sturl = args[0];

        //callオブジェクトの作成
        //  サービス名(TargetObjectURI)、メソッド名、EncodingStyleURI(固定値)をセット 
        Call call = new Call ();
        call.setTargetObjectURI ("SampleService");
        call.setMethodName ("helloworld");
        call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

        //呼び出し、レスポンス取得、SOAP Faultのハンドリング
        URL url = new URL(sturl);
        Response resp = call.invoke (url,"soap_action" );
        if(resp.generatedFault()){
            Fault fault = resp.getFault ();
            System.out.println ("SOAP Fault Code = " + fault.getFaultCode ()); 
            System.out.println ("SOAP Fault String = " + fault.getFaultString ());
        }else{
            Parameter result = resp.getReturnValue ();
            Object res_value = result.getValue();
            System.out.println ("Return value = "+ res_value);
        }
    }
}

次に、クライアント用のライブラリ(wowscl.jar)をクラスパスに追加してください。

set CLASSPATH=<InstallDIR>\WebService\lib\wowscl.jar;%CLASSPATH%

クラスパスを追加した環境で、次のようにコンパイルを行います。

javac SampleClient.java

クライアントアプリケーションの実行

作成したクライアントアプリケーションを実行させる前に、クライアントアプリケーションを実行するディレクトリが、クラスパスに追加されているかを確認してください。追加されていない場合は、次のようにして実行するディレクトリをクラスパスに追加します。

set CLASSPATH=.;%CLASSPATH%

クライアントアプリケーションを実行します。

java SampleClient

これはサーバとクライアントを1台のマシンにしてテストする時の方法です。サーバマシンとクライアントマシンを別にする時は、サーバの動作しているホスト名を指定したURLで実行します。

java SampleClient http://<ホスト名>/hello/servlet/rpcrouter

正常に動作すると、次のように表示されます。

Return value = HelloWorld

サーバ・クライアント間に流れているSOAPメッセージを確認したい場合や、通信ログを採取する場合は、サーバマシンで次のコマンドを使ってTCP Tunnel Monitorを起動してください。

<InstallDIR>\WebService\tools\tunnel

TCP Tunnel Monitorの初期設定では、ポート8080番でクライアントと通信し、ポート80番でサーバと通信するようになっているので、クライアントからアクセスするポート番号を8080に変えて実行します。

java SampleClient http://localhost:8080/hello/servlet/rpcrouter

これで、WebOTXを使ったWebサービスの作成は終了です。なお、詳細については、WebOTXに付属するオンラインマニュアルをご覧ください。

前のページへ


もどる
Copyright © XMLコンソーシアム 2002 All rights reserved.
Copyright © NEC Corporation 1994-2002.