ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server JAX-WS Webサービスの高度な機能のプログラミング
11g リリース1(10.3.6)
B61633-04
  目次へ移動
目次

前
 
次
 

20 RESTfulなWebサービスのプログラミング

この章では、RESTful(Representational State Transfer)なWebサービスを開発する方法について説明します。

この章の内容は以下のとおりです。

RESTfulなWebサービスの概要

RESTとは、Simple Object Access Protocol(SOAP)のように追加のメッセージ層を使用することなく、HTTPなどの標準化されたインタフェースでデータを転送するためのシンプルなインタフェースを記述したものです。RESTは、一意のURIで特定できるステートレス・サービスをリソース(特定の情報のソース)とみなし、これらを作成するための設計ルールのセットを提供します。クライアントはURI、標準化されたメソッドの固定セットを使用してリソースにアクセスし、リソースの表現が戻されます。クライアントは、新しいリソース表現を受け取るたびに転送状態に設定されます。

WebLogic Serverは、RESTfulなWebサービスの開発を実現するために次の方法をサポートしています。


注意:

Jersey JAX-RS RIは、RESTfulなWebサービスを構築するための、本番環境に対応できるオープン・ソースの参照実装を提供します。標準JAX-WS HTTPプロトコル・メソッドについてベスト・プラクティスとして推奨します

Jersey JAX-RS参照実装の使用

WebLogic Serverには、Webアプリケーションとしてパッケージされ、Jersey JAX-RS RIに基づくアプリケーションの実行に必要な事前に作成された共有ライブラリが含まれています。次のバージョンがサポートされています。

次の項では、Jersey JAX-RS RI共有ライブラリとその使用手順、および新しいバージョンのJersey JAX-RS RIの登録方法について説明します。

Jersey JAX-RS RI共有ライブラリの要約

共有ライブラリは、WL_HOME/common/deployable-librariesディレクトリに格納されています。

表20-1に、Jersey JAX-RS RIバージョン1.9 Webサービスをサポートする事前作成共有ライブラリを示します。

表20-1 Jersey JAX-RS RI 1.9の共有ライブラリ

機能 説明
  • Jersey

  • JAX-RS API

  • JSON処理およびストリーミング

  • ATOM処理

  • 共有ライブラリ名: jax-rs

  • JARファイル名: jersey-bundle-1.9.jar

  • WARファイル名: jersey-bundle-1.9.war

  • バージョン1.9

  • ライセンス: SUN CDDL+GPL


表20-2に、Jersey JAX-RS RI Version 1.1.5.1 Webサービスをサポートする事前作成共有ライブラリを対応する機能ごとにまとめます。共有ライブラリが必須か省略可能かも示します。

表20-2 Jersey JAX-RS RI 1.1.5.1の共有ライブラリ

機能 説明 必須/省略可能

Jersey

  • 共有ライブラリ名: jersey-bundle

  • JARファイル名: jersey-bundle-1.1.5.1.jar

  • WARファイル名: jersey-bundle-1.1.5.1.war

  • バージョン: 1.1.5.1

  • ライセンス: SUN CDDL+GPL

必須

JAX-RS API

  • 共有ライブラリ名: jsr311

  • JARファイル名: jsr311-api-1.1.1.jar

  • WARファイル名: jsr311-api-1.1.1.war

  • バージョン: 1.1.1

  • ライセンス: JSR311ライセンス

必須

JSON処理

  • 共有ライブラリ名: jackson-core-asl

  • JARファイル名: jackson-core-asl-1.1.1.jar

  • WARファイル名: jackson-core-asl-1.1.1.war

  • バージョン: 1.1.1

  • ライセンス: Apache 2.0

省略可能

JSON処理

  • 共有ライブラリ名: jackson-jaxrs

  • JARファイル名: jackson-jaxrs-1.1.1.jar

  • WARファイル名: jackson-jaxrs-1.1.1.war

  • バージョン: 1.1.1

  • ライセンス: Apache 2.0

省略可能

JSON処理

  • 共有ライブラリ名: jackson-mapper-asl

  • JARファイル名: jackson-mapper-asl-1.1.1.jar

  • WARファイル名: jackson-mapper-asl-1.1.1.war

  • バージョン: 1.1.1

  • ライセンス: Apache 2.0

省略可能

JSONストリーミング

  • 共有ライブラリ名: jettison

  • JARファイル名: jettison-1.1.jar

  • WARファイル名: jettison-1.1.war

  • バージョン: 1.1

  • ライセンス: Apache 2.0

省略可能

ATOM処理

  • 共有ライブラリ名: rome

  • JARファイル名: rome-1.0.jar

  • WARファイル名: rome-1.0.war

  • バージョン: 1.0

  • ライセンス: Apache 2.0

省略可能


また、次の表にWebLogic Serverで使用可能な依存JARを示します。これらは共有ライブラリとして登録する必要はありません。

表20-3 依存JAR(WebLogic Serverで使用可能)

機能 JARファイル名

ATOM処理のためのjdomバージョン1.0 API

com.bea.core.jdom_1.0.0.0_1-0.jar

JAXBバージョン2.1.1 API

javax.xml.bind_2.1.1.jar

Servletバージョン2.5 API

Javax.servlet_1.0.0.0_2-5.jar


Jersey JAX-RS RI共有ライブラリの使用手順

Jersey JAX-RS RIを使用するには、次の手順を実行します。

  1. Jersey JAX-RS RI共有ライブラリを1つ以上のWebLogic Serverインスタンスに登録します。「WebLogic ServerインスタンスへのJersey JAX-RS RI共有ライブラリの登録」を参照してください。

  2. Jersey JAX-RS RI共有ライブラリを使用するように、RESTfulなWebサービスを含むWebアプリケーションを構成します。「Jersey JAX-RS RIを使用するWebアプリケーションの構成」を参照してください。

  3. JAX-RS Webサービスおよびクライアントを作成します。「JAX-RS Webサービスおよびクライアントの作成」を参照してください。

必要に応じて、さらに新しいバージョンのJersey JAX-RS RI共有ライブラリを構築してデプロイできます。「新しいバージョンのJersey JAX-RS RIの登録」を参照してください。

Jersey JAX-RS RIの詳細やRESTfulなWebサービスの開発例は、http://jersey.java.netを参照してください。

WebLogic ServerインスタンスへのJersey JAX-RS RI共有ライブラリの登録

共有Java EEライブラリを1つ以上のWebLogic Serverインスタンスに登録するには、ライブラリをターゲットのサーバーにデプロイして、そのデプロイメントを共有することを指示します。共有Java EEライブラリは、ライブラリを参照するアプリケーションをデプロイするのと同じWebLogic Serverインスタンスにターゲット指定する必要があります。

参照側アプリケーションがデプロイされると、WebLogic Serverは共有ライブラリ・ファイルをそのアプリケーションにマージします。必須ライブラリが登録されていないサーバー・インスタンスに参照側アプリケーションをデプロイしようとすると、参照側アプリケーションのデプロイが失敗します。

アプリケーションで必要な機能および使用するJersey JAX-RS RIのバージョンに基づいて、「Jersey JAX-RS RI共有ライブラリの要約」で定義されている1つ以上のJersey JAX-RS共有ライブラリを次のように登録できます。

  1. Jersey JAX-RS RIのバージョン1.9または1.1.5.1のうち、使用するバージョンを選択します。選択したバージョンに基づいて、表20-2または表20-1のいずれかを参照し、アプリケーションで必要な共有ライブラリを決定します。

  2. 共有ライブラリを登録するWebLogic Serverターゲットを決定します。共有ライブラリは、参照側アプリケーションをデプロイするのと同じWebLogic Serverインスタンスに登録する必要があります(後で必要に応じて参照側アプリケーションをデプロイできるように、ドメイン内のすべてのサーバーにライブラリをデプロイしてもかまいません)。

  3. 共有ライブラリ・ファイルを手順2で決定したターゲット・サーバーにデプロイし、-libraryオプションを使用してデプロイメントをライブラリとして指定することで、共有ライブラリを登録します。

    次に、Jersey JAX-RS RIバージョン1.9をサポートする共有ライブラリのデプロイ例を示します。

    weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jersey-bundle-1.9.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library
    

    JAX-RS RIバージョン1.1.5.1を使用する場合の、Jersey JAX-RS RIの基本機能とJAX-RS APIをサポートする共有ライブラリのデプロイ方法を次の例に示します。

    weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jersey-bundle-1.1.5.1.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library
    
    weblogic.Deployer -verbose -noexit -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jsr311-api-1.1.1.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library
    

    weblogic.Deployerの詳細は、「Oracle WebLogic Serverへのアプリケーションのデプロイ」のweblogic.Deployerコマンドライン・リファレンスに関する項を参照してください。

Jersey JAX-RS RIを使用するWebアプリケーションの構成

Jersey共有ライブラリを使用するように、RESTfulなWebサービスを含むWebアプリケーションを構成する必要があります。特に、アプリケーションに関連付けられている次の2つのデプロイメント記述子ファイルを更新する必要があります。

WebリクエストをJerseyサーブレットに委任するためのweb.xmlの更新

すべてのWebリクエストをJerseyサーブレットcom.sun.jersey.spi.container.servlet.ServletContainerに委任するように、web.xmlファイルを更新します。web.xmlファイルは、アプリケーション・アーカイブのルート・ディレクトリのWEB-INFディレクトリにあります。

次に、web.xmlファイルの更新例を示します。

<web-app>
    <servlet>
        <display-name>My Jersey Application</display-name>
        <servlet-name>MyJerseyApp</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>myPackage.myJerseyApplication</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyJerseyApp</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

前述の例に示したように、次の要素を定義する必要があります。

  • <servlet-class>要素は、Jersey JAX-RS RIへのエントリ・ポイントであるサーブレットを定義します。この値は、常にcom.sun.jersey.spi.container.servlet.ServletContainerに設定する必要があります。

  • <init-param>要素は、javax.ws.rs.Applicationを拡張するクラスを定義します。

  • <servlet-mapping>要素は、MyJerseyAppサーブレットにマップされる基本URLパターンを定義します。URLのhttp://<host>:<port>よりも後の部分に<webAppName>を付加したものが、WebLogic Serverによって<url-pattern>と比較されます。パターンが一致すると、この要素にマップされたサーブレットが呼び出されます。

web.xmlデプロイメント記述子の詳細は、Oracle WebLogic ServerのためのWebアプリケーション、サーブレットおよびJSPの開発のweb.xmlデプロイメント記述子の要素に関する項を参照してください。

共有ライブラリを参照するためのweblogic.xmlの更新

アプリケーションで必要な共有ライブラリを参照するようにweblogic.xmlファイルを更新します。weblogic.xmlファイルは、アプリケーション・アーカイブのルート・ディレクトリのWEB-INFディレクトリにあります。

<exact-match>ディレクティブを使用すると、デプロイされた共有ライブラリの最新バージョンが使用されるかどうかを制御できます。trueに設定すると、新しいバージョンがWebLogic Serverにデプロイされているかどうかに関係なく、weblogic.xmlに指定されたバージョンが使用されます。falseに設定すると、weblogic.xmlファイルでの指定内容にかかわらず、WebLogic Serverにデプロイされている最新バージョンが使用されます。

たとえば、<exact-match>ディレクティブをfalseに設定し、「新しいバージョンのJersey JAX-RS RIの登録」の説明に従い、より新しいバージョンのJerseyソフトウェアを共有ライブラリとして登録すると、アプリケーションでは新しい方の共有ライブラリが自動的に使用されます。このケースでは、最新バージョンを使用するためにweblogic.xmlファイルを編集する必要はありません。

次の例は、JAX-RS RIバージョン1.9を使用するためにweblogic.xmlファイルを更新する方法を示しています。

<library-ref>
    <library-name>jax-rs</library-name>
    <specification-version>1.1</specification-version>
    <implementation-version>1.9</implementation-version>
    <exact-match>false</exact-match>
</library-ref>

次の例は、JAX-RS RIバージョン1.1.5.1を使用するためにweblogic.xmlファイルを更新する方法を示しています。すべての共有ライブラリ参照は、すべてのWebアプリケーションに必要なわけではありません。ただし、jersey-bundleおよびjsr311共有ライブラリは共にJersey JAX-RS RIを使用する必要があります。この例では、<exact-match>はfalseに設定され、WebLogic Serverにデプロイされた共有ライブラリの最新バージョンが使用されるように指定します。

<library-ref>
    <library-name>jersey-bundle</library-name>
    <specification-version>1.1.1</specification-version>
    <implementation-version>1.1.5.1</implementation-version>
    <exact-match>false</exact-match>
</library-ref>
<library-ref>
    <library-name>jsr311</library-name>
    <specification-version>1.1.1</specification-version>
    <implementation-version>1.1.1</implementation-version>
    <exact-match>false</exact-match>
</library-ref>
<library-ref>
    <library-name>jackson-core-asl</library-name>
    <specification-version>1.0</specification-version>
    <implementation-version>1.1.1</implementation-version>
    <exact-match>false</exact-match>
</library-ref>
<library-ref>
    <library-name>jettison</library-name>
    <specification-version>1.1</specification-version>
    <implementation-version>1.1</implementation-version>
    <exact-match>false</exact-match>
</library-ref>
<library-ref>
    <library-name>rome</library-name>
    <specification-version>1.0</specification-version>
    <implementation-version>1.0</implementation-version>
    <exact-match>false</exact-match>
</library-ref>

weblogic.xmlデプロイメント記述子の詳細は、Oracle WebLogic ServerのためのWebアプリケーション、サーブレットおよびJSPの開発のweblogic.xmlデプロイメント記述子の要素に関する項を参照してください。

JAX-RS Webサービスおよびクライアントの作成

Jersey JAX-RS RIを登録して、Webアプリケーションを構成したら、JAX-RS Webサービスとクライアントの作成を開始できます。次に、単純なWebサービスとクライアントを示します。

JAX-RSおよびサンプルの詳細は、http://wikis.sun.com/display/Jersey/MainにあるJersey RIのドキュメントを参照してください。

単純なRESTful Webサービス

次に、RESTfulなWebサービスの非常に単純な例を示します。

package samples.helloworld;
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
 
// Specifies the path to the RESTful service
@Path("/helloworld")
public class helloWorld {
 
   // Specifies that the method processes HTTP GET requests 
   @GET
   @Path("sayHello")  
   @Produces("text/plain")
   public String sayHello() {
      return "Hello World!";
   }
}
単純なRESTfulクライアント

次に、事前に定義されたRESTful Webサービスを呼び出す簡単なRESTfulクライアントを示します。このサンプルでは、Jersey JAX-RS RIによって具体的に提供されるクラスを使用します。このクラスはJAX-RS規格の一部ではありません。

package samples.helloworld.client;
 
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
 
public class helloWorldClient {
   public helloWorldClient() {
      super();
   }
 
   public static void main(String[] args) {
      Client c = Client.create();
      WebResource resource = c.resource("http://localhost:7101/RESTfulService-Project1-context-root/jersey/helloWorld");
      String response = resource.get(String.class);
   }
}

新しいバージョンのJersey JAX-RS RIの登録

WebLogic Serverで提供されるバージョンよりも新しいJersey JAX-RS RI共有ライブラリを使用する場合、次の手順を実行する必要があります。

  1. 関連するJersey JARファイルの必要なバージョンをJersey Webサイト(http://jersey.java.net)からダウンロードします。

  2. 手順1でダウンロードしたJARファイルを拡張し、Oracle WebLogic Serverのためのアプリケーションの開発の共有Java EEライブラリの作成に関する項の手順を実行して、新しい共有ライブラリを作成します。

  3. 共有ライブラリ・ファイルを手順2で決定したターゲット・サーバーにデプロイし、-libraryオプションを使用してデプロイメントをライブラリとして指定することで、共有ライブラリを登録します。次の手順を実行する必要があります。

    • -name引数に、表20-2に定義されている標準Jersey JAX-RS RI共有ライブラリ名を設定します。たとえば、jersey-bundleと設定します。

    • 異なる共有ライブラリのバージョンを区別するために、-libSpecVer引数と-libImplVer引数を設定します。

    次に、最新バージョンのJersey JAX-RS RI機能のデプロイ例を示します。weblogic.Deployerの詳細は、「Oracle WebLogic Serverへのアプリケーションのデプロイ」のweblogic.Deployerコマンドライン・リファレンスに関する項を参照してください。

    weblogic.Deployer -verbose -noexit -name jersey-bundle -source C:\myinstall\wlserver_10.3\common\deployable-libraries\jersey-bundle-1.2.war -targets myserver -adminurl t3://localhost:7001 -user system -password ******** -deploy -library -libspecver 1.2 -libimplver 1.2
    
  4. Webアプリケーションを再構成する必要があるかどうかを判別します。

    「Jersey JAX-RS RIを使用するWebアプリケーションの構成」の説明に従って、Webアプリケーションを構成するときにweblogic.xmlファイルで<exact-match>ディレクティブをfalseに設定すると、最新の指定バージョンの共有ライブラリが使用され、Webアプリケーションの構成を更新する必要はありません。

    <exact-match>ディレクティブをtrueに設定する場合、つまり最新バージョンではないJersey JAX-RS RIを使用したい場合は、該当する共有ライブラリを参照するようにweblogic.xmlを更新する必要があります。詳細は、「Jersey JAX-RS RIを使用するWebアプリケーションの構成」を参照してください。

  5. 新たに登録したバージョンのJersey JAX-RS共有ライブラリを使用する必要があるアプリケーションを再デプロイします。

XML over HTTPを使用するWebサービスのプログラミング


注意:

「Jersey JAX-RS参照実装の使用」で説明されているように、ベスト・プラクティスとしてJersey JAX-RS RI共有ライブラリ・ソリューションの使用をお薦めします。Jersey JAX-RS RIでは、RESTfulなWebサービスを構築するために本番環境として使用できるオープン・ソースのRIが提供され、すべてのHTTPメソッドがサポートされます。

HTTPプロトコルを使用してWebサービス・リソースにアクセスする場合、リソース識別子はリソースのURLであり、このリソースで実行される標準の操作はHTTPの1つのメソッド(GET、PUT、DELETE、POST、またはHEAD)です。


注意:

このJAX-WS実行で、サポートされたHTTPメソッドのセットがGETおよびPOSTに限定されています。DELETE、PUTおよびHEADがサポートされません。これらのメソッドを含むどのHTTPリクエストも405不可のメソッドというエラー・メッセージが表示され、拒否されます。

PUTおよびDELETEの機能が必須の場合、POSTメソッドで実行される実際のメソッドをトンネリングすることによって目的のアクションを実行できます。これは、オーバーロードPOSTと呼ばれる回避策です。「REST過負荷POST」でのWeb検索は、これを実行するためのいくつかの方法を返します。


javax.xml.ws.Provider<T>インタフェースのinvoke()メソッドを使用してRESTfulに類似したエンドポイントを構築します(http://download.oracle.com/javaee/5/api/javax/xml/ws/Provider.htmlを参照)。Providerインタフェースは、サービス・エンドポイント・インタフェース(SEI)を構築するための動的な代替手段を提供します。

この項の手順では、XML over HTTPを使用してWebサービスを実装するために必要なJWSファイルをプログラミングおよびコンパイルする方法について説明します。この手順では、これらのJWSファイルをゼロから作成する方法を示しています。既存のJWSファイルを更新する場合は、この手順をガイドとして利用してください。

Antベースの開発環境を設定済であり、かつjwsc Antタスクを実行してWebサービスをデプロイするためのターゲットを追加できる、作業用のbuild.xmlファイルがあることが前提となっています。詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』を参照してください。

表20-4 RESTfulなWebサービスのプログラミング手順

#
手順 説明

1

XML over HTTPを使用するWebサービスを実装する、新しいJWSファイルを作成するか、既存のJWSファイルを更新します。

使い慣れたIDEまたはテキスト・エディタを使用します。「XML over HTTPを使用するWebサービスのプログラミングのガイドライン」を参照してください。

2

build.xmlファイルを更新して、JWSファイルをWebサービスにコンパイルするjwsc Antタスクの呼出しを含めます。

例:

   <jwsc srcdir="." destdir="output/restEar">
      <jws file="NearbyCity.java" type="JAXWS"/>
    </jwsc>

詳細は、『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のjwsc WebLogic WebサービスAntタスクの実行に関する項を参照してください。

3

Antターゲットを実行して、Webサービスを構築します。

例:

prompt> ant build-rest

4

Webサービスを通常どおりデプロイします。

『Oracle WebLogic Server JAX-WS Webサービス・スタート・ガイド』のWebLogic Webサービスのデプロイとアンデプロイに関する項を参照してください。

5

Webサービス・クライアントからWebサービスにアクセスします。

「クライアントからWebサービスにアクセスする」を参照してください。


XML over HTTPを使用するWebサービスのプログラミングのガイドライン

次のサンプルでは、XML over HTTPを使用するWebサービスを実装する簡単なJWSファイルを示します。太字で示されたJavaコードに対応するコーディングのガイドラインについては、サンプルの後の説明を参照してください。

package examples.webservices.jaxws.rest;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.BindingType;
import javax.xml.ws.Provider; 
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.http.HTTPBinding;
import javax.xml.ws.http.HTTPException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.util.StringTokenizer;

@WebServiceProvider(
   targetNamespace="http://example.org",
   serviceName = "NearbyCityService")
@BindingType(value = HTTPBinding.HTTP_BINDING) 

public class NearbyCity implements Provider<Source> { 
  @Resource(type=Object.class)
  protected WebServiceContext wsContext;

  public Source invoke(Source source)  { 
    try {
        MessageContext messageContext = wsContext.getMessageContext();

        // Obtain the HTTP mehtod of the input request.
        javax.servlet.http.HttpServletRequest servletRequest = 
          (javax.servlet.http.HttpServletRequest)messageContext.get(
           MessageContext.SERVLET_REQUEST);
        String httpMethod = servletRequest.getMethod();
        if (httpMethod.equalsIgnoreCase("GET"));
        {

            String query =
                 (String)messageContext.get(MessageContext.QUERY_STRING); 
            if (query != null && query.contains("lat=") &&
                query.contains("long=")) {
                return createSource(query); 
            } else {
                System.err.println("Query String = "+query);
                throw new HTTPException(404);
            }
            } catch(Exception e) {
              e.printStackTrace();
              throw new HTTPException(500);
            }
        }
        } else {
   // This operation only supports "GET"
       throw new HTTPException405);
   }
    private Source createSource(String str) throws Exception {
        StringTokenizer st = new StringTokenizer(str, "=&/");
        String latLong = st.nextToken();
        double latitude = Double.parseDouble(st.nextToken());
        latLong = st.nextToken();
        double longitude = Double.parseDouble(st.nextToken());
        City nearby = City.findNearBy(latitude, longitude);
        String body = nearby.toXML();
        return new StreamSource(new ByteArrayInputStream(body.getBytes()));
    }

    static class City {
         String city;
         String state;
         double latitude;
         double longitude;
         City(String city, double lati, double longi, String st) {
             this.city = city;
             this.state = st;
             this.latitude = lati;
             this.longitude = longi;
         }

         double distance(double lati, double longi) {
            return Math.sqrt((lati-this.latitude)*(lati-this.latitude) + 
                (longi-this.longitude)*(longi-this.longitude)) ;
         }

         static final City[] cities = {
            new City("San Francisco",37.7749295,-122.4194155,"CA"),
            new City("Columbus",39.9611755,-82.9987942,"OH"),
            new City("Indianapolis",39.7683765,-86.1580423,"IN"),
            new City("Jacksonville",30.3321838,-81.655651,"FL"),
            new City("San Jose",37.3393857,-121.8949555,"CA"),
            new City("Detroit",42.331427,-83.0457538,"MI"),
            new City("Dallas",32.7830556,-96.8066667,"TX"),
            new City("San Diego",32.7153292,-117.1572551,"CA"),
            new City("San Antonio",29.4241219,-98.4936282,"TX"),
            new City("Phoenix",33.4483771,-112.0740373,"AZ"),
            new City("Philadelphia",39.952335,-75.163789,"PA"),
            new City("Houston",29.7632836,-95.3632715,"TX"),
            new City("Chicago",41.850033,-87.6500523,"IL"),
            new City("Los Angeles",34.0522342,-118.2436849,"CA"),
            new City("New York",40.7142691,-74.0059729,"NY")};
        static City findNearBy(double lati, double longi) {
            int n = 0;
            for (int i = 1; i < cities.length; i++)  {
                if (cities[i].distance(lati, longi) <  
                     cities[n].distance(lati, longi)) {
                    n = i;
                }
            }
            return cities[n];
        }

        public String toXML() {
             return "<ns:NearbyCity xmlns:ns=\"http://example.org\"><City>"
                  +this.city+"</City><State>"+ this.state+"</State><Lat>"
                  +this.latitude +
                  "</Lat><Lng>"+this.longitude+"</Lng></ns:NearbyCity>";
        }
    }
}

XML over HTTPを使用するWebサービスを実装するJWSファイルをプログラミングする際には、次のガイドラインに従います。ガイドラインのコード・スニペットは、前述のサンプルでは太字で示されています。

  • プロバイダWebサービスを実装するために必要なパッケージをインポートします。

    import javax.xml.ws.WebServiceProvider;
    import javax.xml.ws.BindingType;
    import javax.xml.ws.Provider;
    
  • Provider実装クラスにアノテーションを追加し、HTTPに対するバインディング・タイプを設定します。

    @WebServiceProvider(
       targetNamespace="http://example.org",
       serviceName = "NearbyCityService")
    @BindingType(value = HTTPBinding.HTTP_BINDING)
    
  • Providerインタフェースのinvoke()メソッドを実装します。

    public class NearbyCity implements Provider<Source> {
      @Resource(type=Object.class)
      protected WebServiceContext wsContext;
    
      public Source invoke(Source source)  {
      ...
      }
    
  • 処理のためQUERY_STRINGのフィールドで、処理するのにjavax.xml.ws.handler.MessageContextでQUERY_STRINGフィールドを使用したリクエスト文字列を取得します(メッセージURL http://download.oracle.com/javaee/5/api/javax/xml/ws/handler/MessageContext.htmlを参照してください)。その後、問合せ文字列がcreateSource()メソッドに渡され、指定した値に最も近い市、州、緯度、経度が返されます。

    String query =
                 (String)messageContext.get(MessageContext.QUERY_STRING); 
    .
    .
    .
    return createSource(query);
    

クライアントからWebサービスにアクセスする

Webサービス・クライアントからWebサービスにアクセスするには、リソースのURIを使用します。例:

URL url = new URL (http://localhost:7001/NearbyCity/NearbyCityService?lat=35&long=-120);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
// Get result
InputStream is = connection.getInputStream();

この例では、緯度(lat)と経度(long)の値を指定して、必要なリソースにアクセスしています。

XML over HTTPを使用するWebサービスの保護

Webアプリケーションの保護に使用するメソッドと同じメソッドを使用して、XML over HTTPを使用するWebサービスを保護することができます。詳細は、Oracle WebLogic Serverロールおよびポリシーによるリソースの保護のWebアプリケーションおよびEJBリソースの保護のオプションに関する項を参照してください。