Oracle Application Server Web Services開発者ガイド 10g(10.1.3.1.0) B31868-01 |
|
この章では、Oracle Application Server Web ServicesがREST Webサービスの生成と使用をサポートする方法を説明します。この章の内容は、次のとおりです。
REST(Representational State Transfer)Webサービス・アーキテクチャは、World Wide Web Consortium(W3C)が策定したWebアーキテクチャに準拠し、そのアーキテクチャの理念を使用したものです。HTTPのセマンティクスを可能なかぎり使用します。REST Webサービスはメッセージの送信にXML文書を使用し、SOAPエンベロープは使用しません。SOAP Webサービスとは異なり、RESTはスタイルであるため、標準やベンダーによるツールのサポートはありません。
Oracle Application Server Web Servicesを使用し、RESTを使用してエンドポイントを公開すると、そのエンドポイントはSOAPポートとしても公開されます。OracleAS Web Servicesは、HTTPコマンドのサポートをGETおよびPOSTに制限しています。REST Webサービスは、他のOracleAS Web Servicesと同様にデプロイします。
セキュリティおよび信頼性などのWebサービス管理機能は、REST Webサービスの起動(RESTまたはSOAP)では使用できません。これは、通常この情報の保持に使用するSOAPヘッダーが、REST Webサービスの呼出しでは使用できないためです。
この項の内容は、次のとおりです。
WebServicesAssemblerを使用して、REST Webサービスの機能を、HTTPをプロトコルとして使用できるWebアプリケーションに追加できます。これには、Javaクラス、EJBおよびデータベース・リソースに基づいて作成されるWebサービス・アプリケーションがあります。WebServicesAssemblerのブール型引数restSupport
を使用すると、次のいずれかのコマンドでREST Webサービスをアセンブルできます。
Oracle固有の@Deployment
注釈には、オプションのブール型属性restSupport
を適用できます。属性の値がtrue
の場合は、注釈が適用されたポートは、RESTスタイルのGET
およびPOST
のリクエストおよびレスポンスをサポートします。
この項の内容は、次のとおりです。
次の手順は、WSDLからのREST Webサービスのアセンブル方法を例で示しています。この例では、トップダウン方式によるWebサービスのアセンブルに必要な手順のアウトラインのみを示しています。
genInterface
コマンドへの入力として指定します。 この例で使用されるWSDLを例12-1に示します。次は、genInterface
コマンドのサンプルです。
java -jar wsa.jar -genInterface -output build/src/service -wsdl wsdl/MovieFacility.wsdl -unwrapParameters false
このコマンドの説明:
genInterface
: 各ポート・タイプのサービス・エンドポイント・インタフェースと、WSDLに定義された複合型に対応するJava値タイプ・クラス(Bean)を作成します。また、XMLスキーマ型とJava値タイプ・クラス間のマッピングを記述するJAX-RPCマッピング・ファイルも作成されます。「genInterface」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
unwrapParameters
: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。false
に設定すると、生成対象のサービス・エンドポイント・インタフェースが、入力パラメータおよび戻り型をラップするラッパーとともに生成されます。「unwrapParameters」を参照してください。
topDownAssemble
コマンドを実行し、サービスを生成します。 restSupport
引数をtrue
に設定します。次に例を示します。
java -jar wsa.jar -topDownAssemble -wsdl ./wsdl/MovieFacility.wsdl -unwrapParameters false -className oracle.webservices.examples.rest.RpcLitMovieImpl -input build/classes/service -output build -ear dist/rpclit_topdown.ear -restSupport true
このコマンドの説明:
topDownAssemble
: WSDL記述をベースにしたWebサービスで必要となるクラスとデプロイメント・ディスクリプタを作成します。これらのファイルは、EARファイル、WARファイル、ディレクトリのいずれにも格納できます。「topDownAssemble」を参照してください。
wsdl
: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。「wsdl」を参照してください。
unwrapParameters
: この引数はdocument-literal操作に対してのみ設定でき、その他のメッセージ書式では無視されます。false
に設定すると、生成対象のサービス・エンドポイント・インタフェースが、入力パラメータおよび戻り型をラップするラッパーとともに生成されます。「unwrapParameters」を参照してください。
className
: Webサービスの実装クラスのクラス名(パッケージ名を含む)を指定します。「className」を参照してください。
input
: WEB-INF/classes
にコピーされるクラスを格納するJARまたはディレクトリを指定します。この引数は、WebServicesAssemblerによって使用されるクラスパスに追加されます。「input」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
ear
: 生成されるEARファイルの名前と位置を指定します。「ear」を参照してください。
restSupport
: Representational State Transfer(REST)のサポートをこのWebサービスに対して有効にするかどうかを指定します。「restSupport」を参照してください。
通常の方法でEARファイルをOC4Jの実行中インスタンスにデプロイします。EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
OracleAS Web Servicesでは、デプロイされたWebサービスごとにWebサービス・テスト・ページが提供されます。テスト・ページを使用すると、REST POSTまたはGETリクエストを生成して起動できます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。
例12-1は、「トップダウン方式でのREST Webサービスのアセンブル手順」でprc-literalサービスのアセンブルに使用されたWSDLフラグメントです。
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns0="http://www.oracle.com/rest/doc/types" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.oracle.com/rest" name="rest-service" targetNamespace="http://www.oracle.com/rest" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"> <types> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.oracle.com/rest/doc/types" elementFormDefault="qualified" targetNamespace="http://www.oracle.com/rest/doc/types"> <complexType name="Movie"> <sequence> <element name="Title" type="xsd:string"/> <element name="Director" type="xsd:string"/> <element name="Year" type="xsd:int" /> </sequence> </complexType> <complexType name="ArrayOfMovie"> <sequence> <element name="Movie" type="tns:Movie" maxOccurs="unbounded" /> </sequence> </complexType> </schema> </types> <message name="FindMoviesRequest"> <part name="TitleWords" type="xsd:string" /> <part name="Year" type="xsd:int" /> </message> <message name="FindMoviesResponse"> <part name="Movies" type="tns0:ArrayOfMovie" /> </message> <message name="AddMovieRequest"> <part name="Movie" type="tns0:Movie" /> </message> <message name="AddMovieResponse"> <part name="Added" type="xsd:boolean" /> </message> <portType name="MovieDB"> <operation name="findMovies"> <input message="tns:FindMoviesRequest" /> <output message="tns:FindMoviesResponse" /> </operation> <operation name="addMovie"> <input message="tns:AddMovieRequest" /> <output message="tns:AddMovieResponse" /> </operation> </portType> <binding name="HttpSoap11Binding" type="tns:MovieDB"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="findMovies"> <soap:operation soapAction="http://www.oracle.com/rest/findMovies"/> <input> <soap:body use="literal" parts="TitleWords Year" namespace="http://www.oracle.com/rest"/> </input> <output> <soap:body use="literal" parts="Movies" namespace="http://www.oracle.com/rest"/> </output> </operation> <operation name="addMovie"> <soap:operation soapAction="http://www.oracle.com/rest/addMovie"/> <input> <soap:body use="literal" parts="Movie" namespace="http://www.oracle.com/rest"/> </input> <output> <soap:body use="literal" parts="Added" namespace="http://www.oracle.com/rest"/> </output> </operation> </binding> <service name="rest-service"> <port name="HttpSoap11" binding="tns:HttpSoap11Binding"> <soap:address location="http://localhost:8888/webservice/webservice/"/> </port> </service> </definitions>
前述のWSDLを使用し、「トップダウン方式でのREST Webサービスのアセンブル手順」に記載の手順を実行することで、次のようなインタフェースが生成されます。
interface MovieDb { public Movie[] findMovies (String titleWords, int year); public boolean addMovie (Movie movie); }
生成されたインタフェース内の最初のメソッドは、単純なパラメータのみを持ちます。このメソッドは、HTTP GETを使用して起動できます。次に例を示します。
http://{yourhost}/{context-path}/{service-url}/findMovies?TitleWords=Star+Wars&Year=1977
この問合せ文字列は、次のXMLレスポンスを返します。
<ns0:findMoviesResponse xmlns:ns0="http://www.oracle.com/rest"> <Movies> <ns1:Movie xmlns:ns1="http://www.oracle.com/rest/doc/types"> <ns1:Title>tim</ns1:Title> <ns1:Director>tim</ns1:Director> <ns1:Year>1978</ns1:Year> </ns1:Movie> </Movies> </ns0:findMoviesResponse>
生成されたインタフェース内のaddMovie
メソッドは、複雑なパラメータを取るため、HTTP POSTによってのみ起動できます。たとえば、次のXMLメッセージを独自のWebサービスのURL、http://{
yourhost
}/{
context-path
}/{
service-url
}
に対してPOSTできます。
<ns0:addMovie xmlns:ns0="http://www.oracle.com/rest"> <Movies> <ns1:Movie xmlns:ns1="http://www.oracle.com/rest/doc/types"> <ns1:Title>tim</ns1:Title> <ns1:Director>tim</ns1:Director> <ns1:Year>1978</ns1:Year> </ns1:Movie> </Movies> </ns0:addMovie>
次の手順は、JavaクラスからのREST Webサービスのアセンブル方法を例で示しています。この例では、ボトムアップ方式によるWebサービスのアセンブルに必要な手順のアウトラインのみを示しています。
例12-2は、この例で使用しているStringTools
インタフェースです。
restSupport
引数をtrue
にしたassemble
コマンドを指定して、サービスのアーチファクトを生成します。
java -jar wsa.jar -assemble -appName tools -serviceName StringTools -interfaceName oracle.webservices.examples.rest.StringTools -className oracle.webservices.examples.StringToolsImpl -input ./build/classes/service -output build -use literal -ear dist/tools.ear -uri StringToolsService -restSupport true
このコマンドの説明:
assemble
: ボトムアップ方式でJavaファイルからWebサービスを生成します。このコマンドにより、デプロイ可能なアーカイブを作成するために必要なすべてのファイルが作成されます。「assemble」を参照してください。
appName
: アプリケーションの名前を指定します。この名前は、通常context
やuri
などの他の引数のベース値として使用されます。「appName」を参照してください。
serviceName
: サービス名を指定します。「serviceName」を参照してください。
interfaceName
: サービス・エンドポイント・インタフェース(SEI)を格納するJavaクラスの名前(パッケージ名を含む)を指定します。「interfaceName」を参照してください。
className
: Webサービスの実装クラスのクラス名(パッケージ名を含む)を指定します。「className」を参照してください。
input
: WEB-INF/classes
にコピーされるクラスを格納するJARまたはディレクトリを指定します。この引数は、WebServicesAssemblerによって使用されるクラスパスに追加されます。「input」を参照してください。
output
: 生成されるファイルを格納するディレクトリを指定します。そのディレクトリが存在しない場合は、作成します。「output」を参照してください。
use
: ボトムアップ方式Webサービス・アセンブリの場合、この引数は、生成されるWSDL内のメッセージ書式のuse
属性を指定します。「use」を参照してください。
ear
: 生成されるEARファイルの名前と位置を指定します。「ear」を参照してください。
uri
: Webサービスに使用するURIを指定します。「uri」を参照してください。
restSupport
: Representational State Transfer(REST)のサポートをこのWebサービスに対して有効にするかどうかを指定します。「restSupport」を参照してください。
通常の方法でEARファイルをOC4Jの実行中インスタンスにデプロイします。EARファイルのデプロイの詳細は、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
テスト・ページを使用すると、REST POSTまたはGETリクエストを生成して起動できます。Webサービス・テスト・ページへのアクセスおよびその使用方法の詳細は、「Webサービス・テスト・ページの使用方法」を参照してください。
例12-2は、前述のステップ2でREST Webサービスのアセンブルに使用されていたStringTools
インタフェースです。
interface StringTools { package oracle.webservices.examples.rest; import java.rmi.Remote; import java.rmi.RemoteException; public interface StringTools extends Remote{ public String appendStrings (String a, String b) throws RemoteException; public String toUpperCase (String c) throws RemoteException; public String concatArrayOfStrings (String s[]) throws RemoteException;
このインタフェースの最初の2つのメソッド、appendStrings
およびtoUpperCase
は、単純なパラメータを使用しています。このため、これらは、REST Webサービス操作として公開すると、HTTP GETを使用してアクセスできます。次の例は、アセンブリ時にdocument
スタイルを指定した場合の、appendStrings
操作のコールを示します。
http://{yourserver}/{context-path}/{service-URL}/appendStrings?String_1=Hello+&String_2 =World
この問合せ文字列は、次のXMLレスポンスを返します。
<appendStringsResponseElement xmlns="http://oracle.webservices.examples.rest/"> <result>Hello World</result> </appendStringsResponseElement>
このインタフェース内の3番目のメソッドconcatArrayOfStrings
は、複雑なパラメータを取ります。このため、これは、REST Webサービス操作として公開しても、HTTP GETではコールできません。HTTP POSTによってのみ、コールできます。次に例を示します。
<ns1:concatArrayOfStringsElementxmlns:ns1="http://oracle.webservices.examples.rest/"> <ns1:arrayOfString_1>a,</ns1:arrayOfString_1> <ns1:arrayOfString_1>b.</ns1:arrayOfString_1> </ns1:concatArrayOfStringsElement> <concatArrayOfStringsRequest xmlns="http://oracle.webservices.examples.rest/">
このリクエスト文字列は、次のXMLコードを返します。
<ns0:concatArrayOfStringsResponseElement xmlns:ns0="http://oracle.webservices.examples.rest/"> <ns0:result>a,b.</ns0:result> </ns0:concatArrayOfStringsResponseElement>
Webサービス・テスト・ページを使用して、REST Webサービスが正常にデプロイされたかどうかをテストできます。
RESTサポートがWebサービスに対して有効になっている場合は、オプションのブール型<rest-support>
サブ要素が、oracle-webservices.xml
デプロイメント・ディスクリプタの<port-component>
要素に追加されます。<rest-support>
がtrue
に設定されると、サブ要素が適用されるポートは、RESTスタイルのGET
およびPOST
のリクエストおよびレスポンスをサポートします。デフォルト値はfalse
です。
次の各項では、REST Webサービス・リクエストのクライアント・サイドでの構築方法、およびサーバー・サイドでの処理方法を説明します。
SOAPエンドポイントが次のURLにデプロイされていると仮定します。
http://example.com/my-app/my-service
このエンドポイントがREST対応の場合は、次のURLへのHTTP GETリクエストが受け入れられます。
http://example.com/my-app/my-service/{operationName}?{param1}={value1}&{param2}={value2}
この例において、{
operationName
}
はサービスに対するWSDL内の操作名の1つです。RPC-literal操作の場合は、{
param1
}
、{
param2
}
などが、操作の入力であるwsdl:message
内で定義される各部分の名前になります。ただし、これらの各部分はsimpleTypes
(xsd:int
など)である必要があります。
document-literal操作では、メッセージはパラメータを1つのみ持ちます。複数パラメータをシミュレートするため、WSDLには、スキーマでsequence
として定義されているパラメータを指定します。sequenceの各メンバーをパラメータと考えることができます。この場合、{
param1
}
、{
param2
}
などが、message
部分ではなくsequence型のメンバーになります。RPCの場合と同様に、これらのメンバーはsimpleTypes
である必要があります。
例12-3は、addNumbers
という名前の操作に対して定義されたリクエスト・メッセージです。
<wsdl:message name="AddNumbersRequest"> <wsdl:part name="a" type="xsd:int" /> <wsdl:part name="b" type="xsd:int" /> </wsdl:Message>
このリクエストは、次のURLを指定したGETで起動できます。
http://{yourhost}/{context-path}/{service-url}/addNumbers?a=23&b=24
例12-4は、OracleAS Web ServicesプラットフォームがGETリクエストからサーバー・サイドで作成するSOAPエンベロープを示します。このメッセージは、他の受信SOAPリクエストと同様に処理されます。
<soap:Envelope> <soap:Body> <ns:addNumbers> <ns:a>23</ns:a> <ns:b>24</ns:b> </ns:addNumbers> <soap:Body> <soap:Envelope>
例12-5は、addNumbers
サービスがdocument-literal操作として定義されている場合に送信されるリクエスト・メッセージです。
<wsdl:message name="AddNumbersRequest"> <wsdl:part name="params" type="tns:AddNumbersRequstObject" /> </wsdl:Message>
例12-6は、AddNumbersRequestObject
の定義を示しています。これはスキーマでも同じ定義になります。
<xsd:complexType name="AddNumbersRequestObject"> <xsd:complexContent> <xsd:sequence> <xsd:element name="a" type="xsd:int"/> <xsd:element name="b" type="xsd:int"/> </xsd:sequence> </xsd:complexContent> </xsd:complexType>
この操作は、次のURLを指定したGETリクエストによって起動できます。これは、例12-3のRPC-literalリクエストに対して使用したものと同じURLである点に注意してください。
http://{yourhost}/{context-path}/{service-url}/addNumbers?a=23&b=24
REST Webサービスでは、単純なXMLメッセージのHTTP POSTリクエストはサポートされていますが、SOAPエンベロープのHTTP POSTリクエストはサポートされていません。RESTリクエストでは、添付ファイル付きのメッセージはサポートされていません。REST WebサービスではSOAPリクエストもサポートされているため、指定されたリクエストがSOAPまたはRESTのどちらであるかを実装側で判断する必要があります。
SOAPサービスは、POSTリクエストを受信するとSOAPAction
ヘッダーを検索します。ヘッダーが存在する場合は、実装はこのリクエストをSOAPリクエストであると判断します。存在しない場合は、リクエストのroot要素のQName
が検索されます。それがSOAPエンベロープのQName
の場合は、メッセージはSOAPリクエストとして処理されます。そうでない場合は、RESTリクエストとして処理されます。
RESTリクエストは、リクエスト・ドキュメントをSOAPエンベロープでラップすることで処理されます。SOAP 1.2リクエストのContent-TypeヘッダーではないHTTPヘッダーのみが、そのまま受信されます。このContent-Typeヘッダーは、SOAP 1.2に対する適切なコンテンツ・タイプであるapplication/soap+xml
に変更されます。
たとえば、例12-7のRESTリクエストは、例12-8のSOAPエンベロープにラップされます。
<ns:addNumbers> <ns:a>23</ns:a> <ns:b>24</ns:b> </ns:addNumbers>
例12-8のリクエストは、通常のSOAPリクエストとして処理されます。
<soap:Envelope> <soap:Body> <ns:addNumbers> <ns:a>23</ns:a> <ns:b>24</ns:b> </ns:addNumbers> </soap:Body> </soap:Envelope>
RESTリクエストとして処理される(GETまたはPOST)リクエストに対するレスポンスも、RESTスタイルである必要があります。OracleAS Web Servicesプラットフォームは、サーバー上のSOAPレスポンスをクライアントに送信する前に、RESTレスポンスに変換します。RESTレスポンスは、SOAP本体の最初の子要素をルート要素として持つXML文書になります。たとえば、例12-9のSOAPエンベロープが、サーバー上にあると想定します。
<soap:Envelope> <soap:Body> <ns0:result xmlns:nso=" "> <ns:title>How to Win at Poker</ns:title> <ns:author>John Doe</ns:author> </ns0:result> </soap:Body> </soap:Envelope>
例12-10は、クライアントに返送されるレスポンスを示します。Content-Typeが常にtext/xml
である点に注意してください。SOAPヘッダーや添付ファイルは、クライアントに返送されません。
<ns0:result xmlns:ns0=" "> <ns:title>How to Win at Poker</ns:title> <ns:author>John Doe</ns:author> </ns0:result>
WebサービスのREST機能を有効化するオプションが、Oracle JDeveloperのJava Webサービスの作成ウィザードに用意されています。Oracle JDeveloperを使用してWebサービスのREST機能を有効化する方法の詳細は、Oracle JDeveloperのオンライン・ヘルプを参照してください。
「REST Webサービスのアセンブル」を参照してください。
詳細は、次を参照してください。
|
Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|