ページ

2014年10月29日水曜日

SOAPをJavaで

SOAPをJavaで体験してみる。

そもそもSOAPとは・・・
XML-RPCから発展した、Webサービスの為のXMLベースのRPCプロトコルである。
ウィキペディアより
http://ja.wikipedia.org/wiki/SOAP_(%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB)

様々な通信プロトコルで利用可能だが、実際は、TCP/IP, HTTP(S)で利用されている。
メッセージはheaderとbody、headerはオプショナルであり、ルーティングやセキュリティ、
トランザクション等のメタ情報を格納。bodyは主要な情報、ペイロードである。




















JavaでSOAPとなると、Apache-SOAPなるものがあるらしい。
http://www.atmarkit.co.jp/ait/articles/0103/02/news004_3.html
が、これを使かうにはアプリケーションサーバとXMLパーサがセットアップ済み
じゃないといけないらしい。。

今回は、アプリケーションサーバをTomcat、XMLパーサをXML4Jで構築。
http://homepage2.nifty.com/ann/Windows/xml/apache-soap.html

1. Tomcat管理ユーザの作成
  # useradd -s /sbin/nologin tomcat

2. Tomcatのダウンロード
  公式ページからダウンロード http://tomcat.apache.org/
  展開 & 設定
  # tar xvzf apache-tomcat-7.0.56.tar.gz
  # mv apache-tomcat-7.0.56 /usr/local
  # cd /usr/local/
  # chown -R tomcat:tomcat apache-tomcat-7.0.56/
  # ln -s apache-tomcat-7.0.56 tomcat

3. 環境変数の設定
  /etc/profileにJAVA_HOMEとCATALINA_HOMEを設定

  JAVA_HOME=/usr/java/jdk1.8.0_25
  PATH=$PATH:$JAVA_HOME/bin
  CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar
  CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.33-bin.jar
  CATALINA_HOME=/usr/local/tomcat
  export JAVA_HOME
  export PATH
  export CLASSPATH
  export CATALINA_HOME
 
4. 起動スクリプトの作成
  ↓参照
  http://homepage1.nifty.com/y-osumi/works/code/tomcat7/

  実際に起動してみる
  # /etc/init.d/tomcat start
  内部からはhttp://192.168.XX.XXX:8080にアクセスできたが
 
 
  外からはiptablesを設定していないので無理な模様・・・

5. iptablesの設定
  現在の状況を確認
  # iptables -L --line-number
 
  tomcatで使用するポート(8080)を許可するように設定
  # vi /etc/sysconfig/iptables
  以下の行を追加
  -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

 iptable再起動
 # /etc/rc.d/init.d/iptables restart

次にSOAP必要なライブラリを入手 & 配置

必要なjarファイル
・mail.jar -> http://www.oracle.com/technetwork/java/index-138643.html
・activation.jar -> http://www.oracle.com/technetwork/java/jaf11-139815.html
・soap.jar ->

soap.warを$CATALINA_HOME/webapps配下へ配置

それぞれを$CATALINA_HOME/libへ配置
所有者をtomcatに設定
# chown -R tomcat:tomcat mail.jar
# chown -R tomcat:tomcat activation.jar
Tomcat再起動!!

確認の為、http://192.168.XX.XXX:8080/soap/ に接続













無事、起動している事を確認!!

サーバー側にクラスを作る

簡単なクラスを作成
// SOAP
public class HelloSoap {
  public String say() {
    return "Hello World";
  }
}
~
コンパイルし、できたclassファイルをsoap/WEB-INF/classes配下にコピー
 # javac HelloSoap.java
 # cp -p /usr/local/tomcat/work/SOAP/HelloSoap.class .
Tomcatを再起動!!

サービスの登録

SOAPサーバにサービスを登録する。
登録内容は以下の通り。

ID : urn:HelloSoap
Methods : say
ProviderClass : HelloSoap














deploy後














クライアント側の準備

※事前に、soap.jarをCLASSPATHへ追加しておく。

// SOAPクライアント
import java.net.URL;
import org.apache.soap.rpc.*;
import org.apache.soap.Constants;
public class HelloSoapClient {
    final static String USAGE = "http://localhost:49152/soap/servlet/rpcrouter";
    public static void main(String[] args) {
        if(args.length < 1) {
            System.err.println("Usage: HelloWorldSOAPCliet " + USAGE);
            System.exit(1);
        }
        try {
            URL url = new URL(args[0]);
            // Callオブジェクトを生成
            Call call = new Call();
            // ターゲットとなるURIを指定
            call.setTargetObjectURI("urn:HelloSoap");
            // ターゲットとなるメソッドを指定
            call.setMethodName("say");
            // 直列化のスタイルを指定
            call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
            // 呼び出しを実行
            Response resp = call.invoke(url, "");
            // 戻り値を取得
            if(resp.generatedFault()) {
               System.out.println("Fault: " + resp.getFault());
            } else {
               Parameter result = resp.getReturnValue();
               System.out.println (result.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

コンパイル
# javac HelloSoapClient.java

実際の実行の前に、やりとりが見えるようにトンネル・モニタを実行します。
# java org.apache.soap.util.net.TcpTunnelGui 49152 localhost 8080

















いざ、実行!!
 # java HelloSoapClient http://localhost:49152/soap/servlet/rpcrouter

















無事、リクエストメッセージのやりとりができている事を確認しました
^^






0 件のコメント:

コメントを投稿