簡単な例
このセクションでは、Web サービスの例、および Web サービスが認識できる要求メッセージと対応する応答メッセージの例を示します。
まず、Web サービスは以下のとおりです。
/// MyApp.StockService
Class MyApp.StockService Extends %SOAP.WebService
{
/// Name of the WebService.
Parameter SERVICENAME = "StockService";
/// TODO: change this to actual SOAP namespace.
/// SOAP Namespace for the WebService
Parameter NAMESPACE = "http://tempuri.org";
/// Namespaces of referenced classes will be used in the WSDL.
Parameter USECLASSNAMESPACES = 1;
/// This method returns tomorrow's price for the requested stock
Method Forecast(StockName As %String) As %Integer [WebMethod]
{
// apply patented, nonlinear, heuristic to find new price
Set price = $Random(1000)
Quit price
}
}
Web クライアントからこのメソッドを呼び出すと、クライアントによって SOAP メッセージが Web サービスに送信されます。この SOAP メッセージは以下のようになります (改行とスペースが、読みやすいように追加してあります)。
<?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:s='http://www.w3.org/2001/XMLSchema'>
<SOAP-ENV:Body>
<Forecast xmlns="http://tempuri.org">
<StockName xsi:type="s:string">GZP</StockName>
</Forecast>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
メッセージ本文 (<SOAP-ENV:Body> 要素) には、<Forecast> という名前の要素が含まれています。これは、クライアントが呼び出しているメソッドの名前です。<Forecast> には、<StockName> という 1 つの要素が含まれています。この要素の名前は、呼び出している Web メソッドの引数の名前に基づいています。この要素には、その引数の実際の値が含まれます。
Web サービスでは、要求されたアクションを実行し、SOAP メッセージを応答として送信します。応答メッセージは、以下のようになります。
<?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:s='http://www.w3.org/2001/XMLSchema'>
<SOAP-ENV:Body>
<ForecastResponse xmlns="http://www.myapp.org">
<ForecastResult>799</ForecastResult>
</ForecastResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
これらの例には、SOAP メッセージ自体の前に置かれる HTTP ヘッダは含まれていません。
Web サービスの生成
Web サービスは以下のいずれかの方法で作成できます。
Web サービス・ウィザードの使用法
Web サービス・ウィザードでは、簡単なスタブが生成されます。
-
[ファイル]→[新規作成] をクリックします。
[新規作成] ダイアログ・ボックスが表示されます。
-
[一般] タブをクリックします。
-
[新規 Web サービス] をクリックしてから [OK] をクリックします。
ウィザードが表示されます。
-
パッケージ名、クラス名、および Web サービス名の値を入力します。これらの入力は必須です。
-
オプションで、ネームスペースの URI を編集します (またはこの初期値を後で変更します)。これは、InterSystems IRIS ネームスペースではなく、XML ネームスペースです。
-
オプションで、別の行にメソッド名のリストを入力します。
-
[OK] をクリックします。
Web メソッドのスタブを含む新しい Web サービス・クラスが作成されました。以下はその例です。
/// MyApp.StockService
Class MyApp.StockService Extends %SOAP.WebService
{
/// Name of the WebService.
Parameter SERVICENAME = "StockService";
/// TODO: change this to actual SOAP namespace.
/// SOAP Namespace for the WebService
Parameter NAMESPACE = "http://tempuri.org";
/// Namespaces of referenced classes will be used in the WSDL.
Parameter USECLASSNAMESPACES = 1;
/// TODO: add arguments and implementation.
/// Forecast
Method Forecast() As %String [ WebMethod ]
{
;Quit "Forecast"
}
}
SOAP ウィザードと既存の WSDL の併用
WSDL が設計済みで、その WSDL に合わせて Web サービスを作成する必要があることも考えられます。これは、WSDL-first の開発と呼ばれています。InterSystems IRIS では、3 つの手順でこの開発を行います。
-
SOAP ウィザードを使用して、WSDL を読み取り、Web サービス・クラスおよびサポートするすべてのクラスを生成します。
このウィザードでは、Web クライアント・クラスも生成できます (こちらのほうがより一般的です)。
このウィザードの使用法の詳細は、"SOAP ウィザードの使用法" を参照してください。そのセクションで説明する手順に従い、さらにウィザード内の [ウェブ・サービスの作成] オプションを選択してください。
または、"プログラムによるクライアント・クラスの生成" の説明に従って、%SOAP.WSDL.ReaderOpens in a new tab クラスを使用します。
-
生成されたクラスを検証して、メソッド・シグニチャ内の %StringOpens in a new tab の値のいずれかに変更を加える必要があるかどうかを確認します。
ウィザードで WSDL を読み取る場合、InterSystems IRIS では文字列タイプの入出力を %StringOpens in a new tab として表現できることが前提となっていますが、そのように表現できないこともあります。まれに、文字列によっては、最大文字列長の制限を超えることがあります。
"生成されたクラスをきわめて長い文字列に合わせて調整する方法" を参照してください。
-
生成された Web サービスで、必要なアクションを実行するようにメソッドを編集します。
当初、各メソッドは次の例のようなスタブです。
Method Add(a As Test.ns2.ComplexNumber, b As Test.ns2.ComplexNumber) As Test.ns2.ComplexNumber
[ Final, SoapAction = "http://www.mynamespace.org/GSOAP.AddComplexWS.Add",
SoapBindingStyle = document, SoapBodyUse = literal, WebMethod ]
{
// Web Service Method Implementation Goes Here.
}
ウィザードには、Final や SoapBindingStyle などのコンパイラ・キーワードが含まれます。これらのキーワードの値は変更しないでください。
WSDL に WS-Policy 要素が含まれている場合、ウィザードでは、Web サービスの構成クラスも生成されます。既定の構成クラス名は、Web サービス名に Config を追加したものです。WS-Policy については、"Web サービスの保護" を参照してください。
既存の InterSystems IRIS Web サービスのサブクラスの作成
Web サービスを作成するには、既存の InterSystems IRIS Web サービス・クラスのサブクラスを作成してから、以下のようにクラスに SOAPMETHODINHERITANCE パラメータを追加します。
PARAMETER SOAPMETHODINHERITANCE = 1;
このパラメータの既定値は 0 です。このパラメータが 0 の場合、クラスは Web メソッドを Web メソッドとして継承しません。つまり、それらのメソッドは、一般メソッドとしては使用可能ですが、サブクラスによって定義された Web サービス内の Web メソッドとしてアクセスすることはできません。
このパラメータを 1 に設定した場合、クラスは、Web サービスであるスーパークラスで定義された Web メソッドを使用することができます。
カタログおよびテスト・ページについて
Web サービス・クラスをコンパイルすると、クラス・コンパイラによって便利なカタログ・ページが生成されます。そのカタログ・ページを使用して、Web サービスを検証することができます。このカタログ・ページは簡易的な、制限テストのページにリンクしています (生成もされます)。これらのページは、既定では無効になっています。テスト環境でのみ有効にします。
カタログおよびテスト・ページへのアクセス
現在使用しているネームスペースに Web アプリケーションが存在しない場合は、カタログおよびテスト・ページにアクセスできません。"Web アプリケーションの一部としての InterSystems IRIS Web サービス" を参照してください。また、既定ではこれらのページにはアクセスできません。これらのページにアクセスできるようにするには、ターミナルを開いて %SYS ネームスペースに移動し、次のコマンドを入力します。
set ^SYS("Security","CSP","AllowClass",webapplicationname,"%SOAP.WebServiceInfo")=1
set ^SYS("Security","CSP","AllowClass",webapplicationname,"%SOAP.WebServiceInvoke")=1
webapplicationname は、末尾にスラッシュを付けた Web アプリケーションの名前です。例えば、"/csp/mynamespace/" のようになります。
これらのページは、%Development リソースに対する USE 特権を持つユーザとしてログインした場合にのみ使用できます。
カタログおよびテスト・ページの表示
カタログ・ページの URL は以下のような構造になっています。
base/csp/app/web_serv.cls
ここで base は Web サーバのベース URL (必要な場合はポートを含む)、/csp/app は Web サービスがある Web アプリケーションの名前、web_serv は Web サービスのクラス名です。(通常、/csp/app は /csp/namespace です。)以下はその例です。
http://localhost:52773/csp/samples/MyApp.StockService.cls
これらのページに関する注意事項
カタログ・ページには、クラス名、ネームスペース、サービス名、およびクラスと Web メソッドについてのコメントが表示されます。[サービス詳細] リンクには、生成された WSDL が表示されます。詳細は "WSDL の表示" を参照してください。次にページに Web メソッドがリンクと共に表示されます (適切な許可がある場合)。指定されたメソッドのリンクにテスト・ページが表示され、そこから限られた方法でメソッドをテストできます。
テスト・ページに関する注記
このドキュメントでは、このページについてこれ以上は説明しません。Web サービスをより完全にテストするには、"Web クライアントの作成" の説明に従い、Web クライアントを生成して使用します。
WSDL の表示
Web サービスの定義に %SOAP.WebServiceOpens in a new tab を使用すると、その Web サービスを記述した WSDL ドキュメントが作成されて発行されます。Web サービスを変更してリコンパイルするたびに、それに応じて WSDL が自動的に更新されます。このセクションでは、以下の項目について説明します。
"InterSystems IRIS における WSDL のサポート" も参照してください。
Important:
定義により、Web サービスとその Web クライアントは、それぞれの実装にかかわらず (また、テクノロジの根本的な変更にかかわらず)、共通インタフェースに準拠する必要があります。WSDL とは、このインタフェースに関する標準準拠の記述のことです。次に示す事項に注意してください。
-
実際には、わずかに異なる複数の WSDL ドキュメントで、1 つの SOAP インタフェースを正しく記述できることが多くあります。
そのため、InterSystems IRIS で生成した WSDL は、InterSystems IRIS のバージョンごとに、わずかに異なることがあります。このような相違点については、このドキュメントでは説明していません。インターシステムズでは、W3C 仕様で要求されている Web サービスと、そのサービスに対応するクライアントとの相互運用性のみを保証しています。
-
W3C 仕様では、適合するインタフェースを記述する WSDL を生成できることを、Web サービスまたは Web クライアントのどちらに対しても要求していません。
利便性のために、WSDL ドキュメントが生成され、特定の URL で提供されます。ただし、WSDL を収容している Web アプリケーションが、パスワード認証や SSL 接続を要求する場合、この方法で WSDL にアクセスすることは実用的とはいえません。このような場合は、WSDL をファイルにダウンロードして、このファイルを代わりに使用する必要があります。また、前述したように、生成された WSDL には、実行時に追加される SOAP ヘッダに関する情報が含まれていません。実行時に追加される SOAP ヘッダに関する情報を WSDL ドキュメントに含める必要がある場合は、WSDL をファイルにダウンロードして、そのファイルを適切に変更してから使用する必要があります。
WSDL の表示
Web サービスの WSDL を表示するには、次の URL を使用します。
base/csp/app/web_serv.cls?WSDL
ここで base は Web サーバのベース URL (必要な場合はポートを含む)、/csp/app は Web サービスがある Web アプリケーションの名前、web_serv は Web サービスのクラス名です。(通常、/csp/app は /csp/namespace です。)
Note:
クラス名内のパーセント記号 (%) は、この URL ではアンダースコア文字 (_) に置き換えられます。
以下はその例です。
http://localhost:52773/csp/samples/MyApp.StockService.cls?WSDL
ブラウザに WSDL ドキュメントが表示されます。以下に例を示します。
Important:
すべてのブラウザでスキーマが正しく表示されるわけではありません。実際のスキーマを確認するには、ページのソースの表示が必要になることもあります。例えば、Firefox では右クリックして [ページのソースを表示] を選択します。
WSDL の生成
WSDL は静的ドキュメントとしても生成できます。%SOAP.WebServiceOpens in a new tab クラスには、そのために使用できるメソッドがあります。
FileWSDL()
ClassMethod FileWSDL(fileName As %String, includeInternalMethods As %Boolean = 1) As %Status
ここで、fileName はファイルの名前で、includeInternalMethods は、生成された WSDL に Internal としてマークされた Web メソッドが含まれるかどうかを指定します。
WSDL からの Internal Web メソッドの抑制
Web サービスに Internal とマークされている Web メソッドがある場合、既定では WSDL にこれらの Web メソッドが含まれます。これらのメソッドが WSDL に含まれないようにすることができます。これを実行するには、以下のいずれかを実行します。