|
|
| |
2002/02/03 田中宏和 |
| Last Update
2002/12/01 |
|
 |
SOAP編 |
 |
◆SOAPとは? |
| SOAPはSimple Object Access Protocolの略です。他のコンピューターにあるWebサービスを呼び出すためのプロトコルです。下位プロトコルにHTTPやSMTPを使用するためファイヤーウォールなどあっても他のコンピューターにあるオブジェクトにアクセスすることができます。 |
| ◆SOAPメッセージとは? |
| SOAPを使用した通信はSOAPメッセージと呼ばれるメッセージを送ることで行います。SOAPメッセージはSOAPエンベロープ、SOAPヘッダ、SOAPボディから構成されます。 |
| ◆ここでの環境 |
| OS |
Windows 2000 |
| J2SE SDK |
1.3.1_01 |
| サーバー |
Tomcat 4.0.3 |
|
|
|
|
| ◆動作環境の整備 |
■環境変数CLASSPATHの設定
以下がここで使用するライブラリと環境変数CLASSPATHに設定するJARファイルです。
| JavaMail(ここではバージョン1.2) |
mail.jar |
| JAF(ここではバージョン1.01) |
activation.jar |
| Xerces(ここではバージョン2.2.1) |
xalan.jar,xercesImpl.jar
(Xerces-J-tools.2.1.1.zipに入っています) |
| Apache
SOAP(ここではバージョン2.3.1) |
soap.jar |
|
| 一番下の、Apache SOAPは、JavaでSOAPを使用するためのAPIです。これは、アプリケーションサーバーでSOAPを利用できるようにするために必要になります。また、クライアントプログラムで使用するAPIも入っています。 |
| ■Tomcatを動作可能にする |
| Servlet編を参考にしてTomcatを使用可能にしてください。 |
| ■TomcatへのWEBアプリケーションの配置 |
| TomcatでSOAPを利用可能にするには、Apache SOAPをダウンロードして解凍したフォルダのwebappsフォルダの下にあるsoap.warファイルをTomcatのフォルダの下にあるwebappsフォルダの下にコピーします。コピーしましたらTomcatを起動しましょう。これでApache
SOAPが利用可能になります。 |
(参考)
Tomcatのバージョンが3.2の場合の設定
Tomcatのバージョンが3.2の場合、Tomcatが使用しているXMLパーサーのバージョンが古いためうまく動きません。なぜかというと、Tomcatが起動時に設定するCLASSPATHの順番が
1.Tomcatが使用するライブラリ
2.ユーザーがCLASSPATHに指定したライブラリ
になっているためです。 Tomcatが使用するライブラリに古いXMLパーサーが含まれているのでそれが使用されてしまい正しく動作しません。
この問題を解決するには起動停止用バッチファイルの[Tomcatのフォルダ]\bin\tomcat.batを修正します。
105行目の(Tomcat 3.2.1の場合は69行目)
set CP=%CP%;%CLASSPATH%
を以下のように修正します。
set CP=[xercesImpl.jarのパス];[xalan.jarのパス];%CP%;%CLASSPATH% |
|
|
|
| ◆サーバー側のクラスの作成 |
| 次にサーバー側のクラスを作ります。以下がそのソースです。「Hello World」と返すメソッドを一つだけ持つ単純なものです。 |
| ■ソースコード |
| HelloWorldSOAP.java(ここからダウンロード) |
public class HelloWorldSOAP {
public String sayHelloWorld() {
return "Hello World";
}
} |
|
|
| ■コンパイル |
| コマンドプロンプト |
| C:\JavaHello\SOAP>javac
HelloWorldSOAP.java
C:\JavaHello\SOAP> |
|
| ■クラスファイルのコピー |
| コンパイルしたクラスファイルをTomcatをインストールしたフォルダの下のwebapps\soap\WEB-INF\classesの下にコピーしてください。コピーしましたら、Tomcatを再起動しましょう。 |
|
|
| ◆サービスの登録 |
| 次にApache SOAPサーバーにWEBサービスを登録します。下のURLで設定できます。 |
| http://localhost:8080/soap/admin/index.html |
Deployボタンを押してください。設定フォームが表示されます。ここで設定する項目は以下の通りです。
ID→サービスを識別するURI
Methods→メソッド名
Provider Class→クラス名
これ以外はデフォルトのままでOKです。 |
| ID |
urn:HelloWorldSOAP |
| Methods |
sayHelloWorld |
| Provider
Class |
HelloWorldSOAP |
|
 |
| 設定しましたら、一番下のDeployボタンを押してください。これでサービスがサーバーに登録されました。 |
|
|
| ◆クライアント側のソース |
| HelloWorldSOAPClient.java(ここからダウンロード) |
import java.net.URL;
import org.apache.soap.Constants;
import org.apache.soap.rpc.*;
public class HelloWorldSOAPClient {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8080/soap/servlet/rpcrouter");
// Callオブジェクトを生成
Call call = new Call();
// ターゲットとなるURIを指定
call.setTargetObjectURI("urn:HelloWorldSOAP");
// ターゲットとなるメソッドを指定
call.setMethodName("sayHelloWorld");
// 直列化のスタイルを指定
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// 呼び出しを実行
Response resp = call.invoke(url, "");
// 戻り値を取得
Parameter ret = resp.getReturnValue();
System.out.println(ret.getValue());
} catch (Exception e) {
e.printStackTrace();
}
}
} |
|
|
| ◆クライアントプログラムのコンパイルと実行 |
| さっそくコンパイルして実行してみましょう! |
| コマンドプロンプト |
| C:\JavaHello\SOAP>javac
HelloWorldSOAPClient.java
C:\JavaHello\SOAP>java HelloWorldSOAPClient
Hello World
C:\JavaHello\SOAP> |
|
| おおおお!!表示されましたね! |
|
|
| ◆TCP トンネル/モニタ を使用して送受信したデータを見てみよう! |
| Apache SOAPにはデバック用にTCP トンネル/モニタが付いています。これを使用すると、送信したデータと受信したデータが見れます。 |
| ■クライアントコードの変更 |
| まず、クライアントコードのURLのポートの指定を適当な値に変更します。ここでは、8001にしました。 |
| HelloWorldSOAPClient.java |
import java.net.URL;
import org.apache.soap.Constants;
import org.apache.soap.rpc.*;
public class HelloWorldSOAPClient {
public static void main(String[] args) {
try {
URL url = new URL("http://localhost:8001/soap/servlet/rpcrouter");
// Callオブジェクトを生成
Call call = new Call();
// ターゲットとなるURIを指定
call.setTargetObjectURI("urn:HelloWorldSOAP");
// ターゲットとなるメソッドを指定
call.setMethodName("sayHelloWorld");
// 直列化のスタイルを指定
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// 呼び出しを実行
Response resp = call.invoke(url, "");
// 戻り値を取得
Parameter ret = resp.getReturnValue();
System.out.println(ret.getValue());
} catch (Exception e) {
e.printStackTrace();
}
}
} |
|
|
|
|
| ■TCP トンネル/モニタ の起動 |
起動方法は以下のようになります。 java org.apache.soap.util.net.TcpTunnelGui
listenport tunnelhost tunnelport
実行してみましょう。 |
| コマンドプロンプト |
| C:\JavaHello\SOAP>java
org.apache.soap.util.net.TcpTunnelGui 8001
localhost 8080 |
|
| 起動されると、以下のようなウインドウが現れます。 |
 |
| ■クライアントコードのコンパイルと実行 |
| コマンドプロンプト |
| C:\JavaHello\SOAP>javac
HelloWorldSOAPClient.java
C:\JavaHello\SOAP>java HelloWorldSOAPClient
Hello World
C:\JavaHello\SOAP> |
|
| ■TCP トンネル/モニタ 画面の確認 |
| クライアントプログラムを実行すると、TCP トンネル/モニタ にはサーバーに送信したデータとサーバーから受信したデータが表示されます。おおおお! |
 |
|
|
| ◆送信したデータ |
| 送信データ |
POST /soap/servlet/rpcrouter HTTP/1.0
Host: localhost:8001
Content-Type: text/xml; charset=utf-8
Content-Length: 417
SOAPAction: ""
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHelloWorld xmlns:ns1="urn:HelloWorldSOAP"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
</ns1:sayHelloWorld>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> |
|
| (一行で表示できないので改行してある部分があります) |
黒い字の部分・・・HTTPヘッダー
青い字の部分・・・SOAPメッセージ(XML) |
| ◆受信したデータ |
| 受信データ |
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=488A7B2DDBF2EC829C8A9690AA2FC5B6; Path=/soap
Content-Type: text/xml; charset=utf-8
Content-Length: 487
Date: Sun, 01 Dec 2002 10:18:19 GMT
Server: Apache Coyote/1.0
Connection: close
<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ns1:sayHelloWorldResponse xmlns:ns1="urn:HelloWorldSOAP"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<return xsi:type="xsd:string">Hello World</return>
</ns1:sayHelloWorldResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> |
|
| (一行で表示できないので改行してある部分があります) |
黒い字の部分・・・HTTPヘッダー
青い字の部分・・・SOAPメッセージ(XML) |
|
|
(参考文献)
Apache SOAP v2.3.1 ドキュメント |
■書籍
Java関連の書籍 |
|
| |
|
| |
| ツールの部屋
- Java関連の書籍
- デザインパターン - 情報交換掲示板
- HOME |