ホーム  > X-plus >  XML解説

この記事を印刷する この記事を送る はてなブックマークに追加する
テキストリンクコードを取得する

Developer's Cafe XMLをおいしく味わおう!~Episode 16(最終回) : Javaの復習

2005年08月01日作成 

前回まで数回にわたって、.NET環境でのXMLの扱い方に触れました。今回は、話題をJavaに戻していきます。Javaで一通りXMLの扱い方を学べましたので、今回はJavaの応用的な使用方法である、「Webサービス」でのJavaの使い方に関して学んでいきましょう。

あれよあれよというまに、この連載も16回目になってしまいました。残念なことに(?!)今回で、この連載には一度区切りをつけることになりました 。いままで熱心に読んでくださった皆様、ほんとうにありがとうございました。

この雑誌がお手元に届くころには、すっかり夏になっているでしょうか。。。原稿を書き始めるちょっと前1になりますが、今年は各地の桜を見て回ってきました。その中でも良かったのは、弘前でしょう。


図1:弘前城の美しい桜

図1が、弘前城の桜です。写っているのはやぐらではなく、天守閣(ち、小さい、、、)なのですが、その周りをぐるっと、桜が囲んでいてとても美風景でした。写真には写っていませんが、後ろを向くと、青森の富士山こと岩木山も見えたりして、なんとも癒される風景なのでした。


図2:Webサービスを支える3つの技術

話は変わって、本題に入ります。今回は、再びJavaの話題を扱ってみたいと思います。スターウォーズ最新作、Episode3~シスの復讐~ の人気にあやかって「Javaの復習」なんてタイトルを考えてみたんですが(こういう解説を加えてしまうと単なるオヤヂギャグになりますが、、、)、特に深い意味はありません(笑).NETの話題に触れてきたんですが、この雑誌のほかのコーナーで.NETを扱う話題が出てきたので、私はJavaに戻ってもいいかなぁと思いまして、再びJavaの話題に戻ります。

JavaでXMLを扱う技術はどのように進歩してきたのでしょうか。最近は、基礎技術(DOMやSAX)はすっかり浸透してきたようで、あまり話題に上らなくなりました。その代わり、応用技術が注目を集めています。と、いうことで、最後に基礎技術から離れて応用技術の1つである、Webサービスの使用方法に関して、解説を行っていきたいと思います。

Webサービス??

さて、Javaでの実装方法をお伝えする前に、Webサービスってなんだろうってあたりと、それを支える技術に関して触れておきたいと思います。Webサービスとは、ネットワークを介して、様々なアプリケーションを相互接続できるようにするための技術、といえるでしょう。もちろん、同じような技術にMSのDCOMやJavaのRMIなどの技術も存在していますが、それらとの大きな違いは、実装言語や実行環境(OSやハードウェアなど)にできるだけ依存しないように工夫されているという点です。前述の技術はOSであったり、特定の開発言語でなければ通信できない、というデメリットが存在しました。Webサービスであれば、環境に依存しない仕様になっていますので、ありとあらゆるアプリケーションに接続が可能となるのです。では、デメリットはないのでしょうか?一般的に、「実行時の速度」がデメリット2になり得ます。環境に依存しないように作られているわけですので、開発言語に依存した手法等を使用できない場合もありますので、どうしても実行速度は犠牲にならざるを得ません。また、Webサービスで用いられるプロトコルも特殊なものではなく、汎用的に使用されるものが多いため、同様のことが言えます。

少し前の文献を見ますと 大抵Webサービスというのは、3つの技術から構成されることになっています(図2)。それは、Webサービスを利用するためのプロトコル、その利用方法の内容を規定・公開するためのインターフェース記述言語、広く一般にインターフェースを公開するための、公開検索ディレクトリサービスです。ぶっちゃけていいますと、公開検索ディレクトリサービスはほとんど使われていません。詳しくは後述しますが、いろいろと問題も多く今では2つの技術でほとんど成り立っています。


図3:SOAPで決められていること

まず、プロトコルに関してですが、SOAP3というプロトコルが使用されます。このプロトコルはXMLベースのプロトコルで、メッセージの包み方と配達先の記述方法を規定しているプロトコルです。まぁ、よく使われるたとえですが、郵便にたとえると、封筒での手紙の包み方と、封筒への宛名の書き方などが決まっています(図3)。メッセージの内容、つまり封筒に包まれる手紙の内容に関しては、XML形式であれば、記述形式などを問わないことになっています。


図4:WSDLで記述できること

SOAPは、HTTPやSMTPといったメッセージを配達するトランスポートプロトコルの上に規定されているプロトコルとなっています。一般的にはHTTP上に実装されることが多くなっています。

次は、やり取りの内容を規定する記述言語に関してです。これはWSDLというXMLベースの記述言語を用います。これは「Web Services Description Language」の略で、前述したSOAPでやり取りする内容や方法を記述する言語です。要するに、公開したいインターフェース(クラスやらメソッドやら)の内容を記述できるものです(図4)。


図5:Webサービスを探す

Webサービスを提供する側はこれを用意しておくことによって、Webサービスを利用する側はこれを入手することによって、Webサービスの接続が可能になるわけです。

最後は公開検索ディレクトリサービスです。これは、どのようなものかというと、提供しているWebサービスを登録しておき、このディレクトリサービスから検索を行って、接続したいWebサービスを容易に探せるように、というものです(図5)。インターネットで言えば、gooとかYahooといったディレクトリ型検索サービスといえるでしょう。UDDIは一見すると便利そうですが、実際のところ、あまり使われていません 。なぜかといいますと、基本的にWebサービスは、ビジネス利用がその中心です。特にビジネス用途の場合、サービスの提供元がどのような会社で、信用に値する会社なのか、といったような信用情報なども必要です。そうした点をどのようにクリアするのか、といった規定がなく、今のところあまり使われていない技術となってしまっています。

さて、このような3つの要素がありますが、特にSOAPとWSDLを使ったWebサービスを、Javaでどのように実装するのかを見て行きましょう。

JavaでWebサービス

JavaでWebサービスを使うにはどうすればよいのでしょうか。Webサービスは簡単に言ってしまえば、(主に)HTTPプロトコル上でやり取りされる、XMLデータの交換です。Webサービスの使用に従ったXMLをやり取りできればそれでよいわけですが、、、、同じようなXMLをいちいち書いたり、エラーハンドリングなど、わざわざ書いていくと結構面倒ですね(-_-;) 。ということで、自分で1から書くのではなく、世の中に存在している便利なライブラリなどを使って、サクサクッと、Webサービスを作ってみましょう。

JavaでWebサービスを扱うためのライブラリはいくつか存在します。代表的なのは以下の2つといえるでしょう。

◇ Apache Webサービスプロジェクト
URL:http://ws.apache.org/
開発元:Apache Web Services Project
WebサーバApacheで有名な、Apache Projectのサブプロジェクトの1つにWebサービスのプロジェクトが存在しています。ここにWebサービスを利用するために必要な様々なライブラリが用意されています。
この中でも特に有名なのは、下記の2つでしょう。どちらもWebサービスを行う上での基本的なAPIや実行環境を持ったライブラリとなっています。
・ Apache AXIS 4
・ Apache SOAP

◇ JWSDP
URL:http://java.sun.com/webservices/jwsdp/index.jsp
開発元:SUN

Javaの開発元であるSUNが提供するWebサービスのライブラリが、JWSDPです。JWSDPとは、「Java Web Services Developer Pack」の略称で、その名の通り、Webサービスを実装するうえで必要となる、SUNが提供する様々なライブラリをまとめたお得な(?)パッケージとなっています。

これさえあれば、Webサービスが手軽にできてしまうのです。ただし若干の注意点が、、、前述しましたように、これは、Webサービスのための専用のAPIというわけではなく、様々なライブラリの集合体となっています。この中にはXMLを扱うための汎用的なライブラリ(JAXB、JAXP)等も含められています。これが必ずしも最新のものの組み合わせになっているわけではなく、JWSDPとして、動作する最新の組み合わせとなっています。そのため、インストールされている別個に導入したAPIとバッティングすることもあります。JWSDPを使用して、開発・実行する際には、明示的にJWSDPに含まれるライブラリ群を指定するようにしないと、正しく動作しないこともあるので、注意が必要です。

Webサービスを実装するときの異なる2つの実装方法

Webサービスを実装する、とひとくくりにいっても、大きく分けて、2つのタイプが存在します5(これは前述した2つのライブラリのいずれにも当てはまる事柄です)。

・ RPCタイル
・ メッセージスタイル

RPCスタイルとは、いわゆるRPC(リモートプロシージャコール)のWebサービス版です。このスタイルをサポートするライブラリのメリットは、Webサービスであることをあまり意識せずに開発が可能である、という点です。極端に表現すると、前後のちょっとした手続きやちょっとしたルールを除き、通常のJavaの開発をする感覚で、簡単にWebサービスが実装できてしまうことになります。Webサービスを実行するSOAPの細かなメッセージのやり取りは、「Webサービスランタイム」にお任せ、また、SOAPメッセージの作成も、「仲介プログラム」にお任せし、利用者が作成するのは、仲介プログラムに対する一般的なJava呼び出しのみです。一方、デメリットとしては、簡単がゆえに、公開している(あるいはされている)Webサービスのインターフェースを変更したいという場合に、作り直しが面倒という点です。このあたりの詳細は後述します(図6)。


図6:RPCスタイルのWebサービス

一方のメッセージスタイルとは何でしょうか?読んで字の如しですが(^_^;)、メッセージ交換をするためのWebサービスを実装するタイプです。データ交換など、XMLデータそのものをWebサービスで交換する場合に使用します。こちらはデメリットから入りますが、開発が面倒、というデメリットがあります。RPCスタイルとは異なり、そもそもSOAPに関してのある程度の知識が必要となりますし、SOAP構造を意識しながら、プログラムを行っていかなければなりません。そのため、通常のJavaプログラムとはいろいろと手間ややり方が変わってきます。他方、それによるメリットもあります。最初の作成時は面倒なのですが、その後インターフェースが変わったような場合などに、変更点のみを修正すればよいというメリットがあります(図7)。


図7:メッセージスタイルのWebサービス

まとめると表1のようになります。

早速実践に入っていきましょう。今回は、JESDPを取り上げて、Webサービスの使い方を学びましょう。

JWSDPを使う

早速JWSDPをインストールしてみましょう。ではインストール方法を紹介します、、、、ってやっていると紙面もなくなってきますので、各自でReadmeをみてインストールをがんばってみてください(^.^)

JWSDPにも、先ほど取り上げたようにWebサービスを実行するために2つのAPIが用意されています。RPCスタイルのAPIは、JAX-RPC、メッセージスタイルのAPIはSAAJというものです。今回は特にJAX-RPCを取り上げたいと思います。

JAX-RPCでは、Webサービスの内容を記述したWSDLという言語を中心に実装が回ります。WSDLはWebサービスのインターフェースを規定したものであると述べましたが、そこから、Javaのクラスを自動的に生成してくれるツールを備えているのです。これには先ほどの説明の中で述べた、Webサービスランタイムと、仲介プログラムの両方を自動的に生成してくれることになります。これは実に楽ですね!WSDLさえ記述できれば6、Webサービスの利用はとっても簡単になります。Webサービスを提供する側も、SOAPなどの面倒なプログラムを行わずとも、通常のJava開発と同じような手順で行えるので、開発が非常に楽になります。このJavaのツールは「wscompile」というツールです。

では、最後に、実際にWebサービスのプログラムを作って見ましょう。紙面の都合もありまして、今回は、Webサービス利用プログラムを作成してみます。
ん??利用ってことは、なにか提供されているサービスを使うってことですよね。。。じゃあ、準備としてWebサービスを提供するプログラムを作って、、、って、作っちゃうし!(三村風)というのは冗談で、世の中で公開されているWebサービスを利用するプログラムを作りましょう。

そのWebサービスとは、、、Google のWebサービスです。皆さんは、Google の検索がWebサービスでも使用できることをご存知でしたか?Google のWebサービスは以下のURLで公開されています。
http://www.google.com/apis/index.html

このサービスを利用するためには、無料のアカウントを取得する必要があります。左のメニューに用意されている「Create Account」から、アカウントを各自取得してください。次に、Webサービスのインターフェースが記述された、WSDL文書を入手します。以下のURLに存在します7。XMLファイルですので、そのまま、ローカルに保存しましょう。
http://api.google.com/GoogleSearch.wsdl

さて、これで準備は整いました。まず。WSDLファイルかWebサービスの仲介プログラムを作成します。これにはwscompileのための設定用XMLファイルを記述する必要があります。以下にそのファイルの内容を示します。
-----
リスト1:Config.xmlの例
<?xml version="1.0" encoding="UTF-8"?>
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
   <wsdl location="GoogleSearch.wsdl"
         packageName="sample.googlesearch " />

</configuration>
-----

ここまで準備ができたら、
wscompile -gen:client -keep config.xml

と、コマンドを打ちます。これで、沢山(^_^;)Javaのファイルができれば出来上がりです。なんで、こんなにJavaのファイルができるんでしょうか。。。。そんなに複雑なAPIなのでしょうか。いえいえ、そんなことはありません。これ、実は、仲介プログラムの下のWebサービスランタイムの部分も一緒に作成されているからなんです。Googleを利用する場合は、このうちのわずかなJavaファイルを利用するだけです。
では、最後にプログラムを作ってみましょう。必要な手順は以下の通りです。

1)仲介プログラムのインスタンスの作成
2)WebサービスURLの設定
3)Webサービスメソッドの実行
え、、たったこれだけ?って思われる人もいるでしょう。そうなんです。たったこれだけです。ね、Webサービスって簡単でしょ。では、非常に短い実際のコードをご覧ください。

-----
リスト2:GoogleSearchSample.java
import java.io.*;
import javax.xml.rpc.*;
import sample.googlesearch.*;

public class GoogleSearchSample {
  public static void main(String[] args) {
    try {

    // 1)仲介プログラムのインスタンスの作成
    GoogleSearchPort_Stub stub = (GoogleSearchPort_Stub)(new GoogleSearchService_Impl().getGoogleSearchPort());
   
    // 2)WebサービスURLの設定
    stub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,"http://api.google.com/search/beta2");
   
    // 3)Webサービスメソッドの実行(検索を実行)
    GoogleSearchResult SearchResult = stub.doGoogleSearch("License-Key","Kensaku-shitai-kotoba",1,10,false,"",false, "", "","");
   
    //検索結果件数の表示
    System.out.println(SearchResult.getEstimatedTotalResultsCount());

    //検索結果Elementの取得
    ResultElement[] SearchResulte = SearchResult.getResultElements();

    //検索結果Elementの内容を1件ずつ表示(検索結果を1件ずつ表示)
    for (int i = 0 ; i < 10 ; i++){
      System.out.println(i + "件目¥n");
      System.out.println(SearchResulte[i].getTitle());
      System.out.println(SearchResulte[i].getSummary());
      System.out.println(SearchResulte[i].getURL());
      System.out.println("~~~~~~~");

    }

   } catch (Exception e) {
      e.printStackTrace();
      System.exit(1);
   }
  }
}
-----


これを実際にコンパイルして、実行してみると!!!!興味のある方は、実際のGoogleの検索結果と見比べてみてください。
と、まぁ、こんな感じでRPCスタイルを使うと非常に簡単にWebサービスの利用ができます。

まとめ

最後の方は駆け足になりましたが(^_^;)ざっとWebサービスに関してご紹介しました。Webサービスの提供を考えておられた方にはちょっと物足りなかったでしょうか。。。
さて、これで、この連載は一回終了となります。ここまで辛抱強く(?)読んでくださってありがとうございました。少しでもXMLFをプログラムするためにはどうすればよいのだろうってことの理解の助けになれば、幸いです。
(吉田 晃伸)



この記事と関連の高い記事

関連キーワード:.NET


関連キーワード:SOAP


関連キーワード:WSDL


関連キーワード:Webサービス


関連キーワード:XML


関連キーワード:遊撃手




ページトップへ戻る