SQL Anywhere データベースは、Web サービスを提供すると同時に、Web サービスを利用します。Web サービスは、それがクライアント・プロシージャまたは関数と同じデータベースに存在していないかぎり、インターネットで利用できる標準の Web サービスである場合や、SQL Anywhere データベースによって提供される Web サービスである場合があります。
SQL Anywhere は、HTTP と SOAP の両方の Web サービス・クライアントとして機能できます。この機能は、ストアド関数またはストアド・プロシージャにより提供されます。
クライアント関数とプロシージャは、以下の SQL 文を使用して作成し、操作します。
たとえば、Web サービス・クライアント関数の作成に使用される CREATE FUNCTION 文と CREATE PROCEDURE 文の構文は、次のとおりです。
CREATE FUNCTION [ owner.]procedure-name ( [ parameter, ... ] ) RETURNS data-type URL url-string [ proc-attributes ]
CREATE PROCEDURE [ owner.]procedure-name ( [ parameter, ... ] ) URL url-string [ proc-attributes ]
この構文の鍵となるのは、URL 句です。この句は、プロシージャでアクセスする Web サービスの URL を提供するために使用されます。URL 句の基本的な構文は、次のとおりです。
url-string : '{ HTTP | HTTPS | HTTPS_FIPS }://[ user:password@ ]hostname[ :port ][ /path ]'
オプションのユーザおよびパスワード情報により、認証を必要とする Web サービスにアクセスできます。ホスト名には、Web サービスを提供しているコンピュータの名前または IP アドレスを使用できます。
ポート番号は、サーバがデフォルト以外のポート番号で受信する場合のみ必要です。デフォルトのポート番号は、HTTP サーバの場合は 80 で、HTTPS サービスの場合は 443 です。
パスは、サーバ上のリソースまたは Web サービスを識別します。
要求は、別の SQL Anywhere データベースによって提供されたものか、インターネットで利用可能なものかにかかわらず、どの Web サービスにも送信できます。Web サービスが同じデータベース・サーバによって提供されている場合は、その Web サービスをクライアント関数と同じデータベースに置くことはできません。同じデータベース内の Web サービスにアクセスしようとすると、「403 Forbidden」のエラーが返されます。
感嘆符は代入パラメータに使用されるため、プロシージャ定義の文字列のどこかに含まれる感嘆符はエスケープする必要があります。! 文字のエスケープを参照してください。
プロシージャ・コールに関するより詳細な情報を提供するための句は、他にも次のようなものがあります。
proc-attributes : [ TYPE { 'HTTP[ :{ GET | POST[:MIME-type] | PUT[:MIME-type] | DELETE | HEAD } ]' | 'SOAP[:{ RPC | DOC } ]' } ] [ NAMESPACE namespace-string ] [ CERTIFICATE certificate-string ] [ CLIENTPORT clientport-string ] [ PROXY proxy-string ] [ SET protocol-option-string]
TYPE 句は、SQL Anywhere に Web サービス・プロバイダへの要求のフォーマット方法を指定するために重要です。標準の SOAP タイプの RPC と DOC を使用できます。GET や POST などの標準の HTTP メソッドも使用可能で、それぞれ HTTP:GET および HTTP:POST と指定されます。HTTP を指定すると、HTTP:POST を暗黙で指定したことになります。
タイプに SOAP が選択されると、SQL Anywhere は自動的に要求を SOAP 要求に必要な標準フォーマットの XML ドキュメントとしてフォーマットします。SOAP 要求は常に XML ドキュメントであるため、タイプに SOAP が選択された場合、必ず HTTP POST 要求を暗黙的に使用して SOAP 要求ドキュメントがサーバに送信されます。SOAP の指定は、SOAP:RPC を暗黙で指定します。
出力 SOAP 要求の構築時には、プロシージャ名が SOAP 操作名として使用されます。さらに、パラメータの名前も SOAP 要求エンベロープのタグ名に表示されます。したがって、これらの名前を SOAP サーバで必要なとおりに正しく指定することは、SOAP ストアド・プロシージャの定義において重要なポイントです。これは、SOAP プロシージャと関数の名前には、SQL Anywhere のプロシージャ名と関数名に適用されるもの以外にも、制約が加えられることを意味します。
次の文は、MyOperation という SOAP ストアド・プロシージャを作成します。
CREATE PROCEDURE MyOperation ( a INTEGER, b CHAR(128) ) URL 'HTTP://localhost' TYPE 'SOAP:DOC'; |
次の文などにより、このプロシージャが呼び出されると、SOAP 要求が生成されます。
CALL MyOperation( 123, 'abc' ); |
プロシージャ名は、要求本文内の <m:MyOperation>
タグに表示されます。プロシージャに対する 2 つのパラメータ a と b は、それぞれ <m:a>
と <m:b>
になります。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://localhost"> <SOAP-ENV:Body> <m:MyOperation> <m:a>123</m:a> <m:b>abc</m:b> </m:MyOperation> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
すべての SOAP 要求は、メソッド・ネームスペース URI を必要とします。サーバ側の SOAP プロセッサはこの URI を使用して、要求のメッセージ本文内にあるさまざまなエンティティの名前を解釈します。
SOAP:DOC または SOAP:RPC の SOAP 関数またはプロシージャを作成する場合、ネームスペース URI を指定しなければ呼び出しが成功しない可能性があります。必要なネームスペース値は、WSDL 記述ドキュメントやサービスのマニュアルから取得できます。NAMESPACE 句は、SOAP 関数とプロシージャのみに適用します。デフォルトのネームスペース値はプロシージャの URI で、オプションのパス・コンポーネントとユーザおよびパスワードの値は含みません。
セキュア HTTP 要求を発行するためには、クライアントはサーバの証明書、またはサーバの証明書の署名に使用する証明書にアクセスします。この証明書によって、SQL Anywhere で要求を暗号化する方法が指定されます。証明書の値は、セキュアでないサーバ宛ての要求をセキュア・サーバへリダイレクトする場合にも必要です。
証明書情報を提供するには、2 つの方法があります。証明書をファイルに保存してファイル名を指定する方法と、証明書全体を文字列値として提供する方法です。両方を行うことはできません。
証明書属性は、次のようにセミコロンで区切られた key=value ペアとして構成された文字列値として提供されます。
certificate-string : { file=filename | certificate=string } ; company=company ; unit=company-unit ; name= common-name
次のキーを使用できます。
キー | 省略形 | 説明 |
---|---|---|
file | 証明書のファイル名 | |
certificate | cert | 証明書そのもの。Base64 形式でエンコードされています。 |
company | co | 証明書で指定された会社 |
unit | 証明書で指定された会社の部署 | |
name | 証明書で指定された通称 |
たとえば、次の文は、クライアントと同じコンピュータ上にある Web サービスへの安全な要求を行うプロシージャを作成します。
CREATE PROCEDURE test() URL 'HTTPS://localhost/myservice' CERTIFICATE 'file=C:\srv_cert.id;co=iAnywhere; unit=SA;name=JohnSmith'; |
TYPE 句が含まれていないため、要求は SOAP:RPC タイプであると見なされます。サーバのパブリック証明書は、C:\srv_cert.id ファイルにあります。
ファイアウォールを介して Web サービスにアクセスする場合、サーバへの接続を確立するときに使用するポートを SQL Anywhere に対して指定する必要があることがよくあります。通常、ポート番号は動的に取得されるため、ファイアウォールによって特定範囲のポートへのアクセスが制限されていないかぎり、デフォルトの動作を使用してください。
ClientPort オプションは、クライアント・アプリケーションが TCP/IP を使って通信するポート番号を指定します。次の例で示すように、単一のポート番号、または個々のポート番号の組み合わせやポート番号の範囲を指定することができます。
CREATE PROCEDURE test () URL 'HTTPS://localhost/myservice' CLIENTPORT '5040,5050-5060,5070'; |
ポート番号のリストまたは範囲を指定することをおすすめします。ポート番号を 1 つだけ指定すると、アプリケーションが維持できるのは、一度に 1 つの接続のみとなります。また、1 つの接続を閉じた後は、数分のタイムアウト時間が生じます。その間、同じリモート・サーバとポートを使って新しい接続は作成できません。ポート番号のリストや範囲を指定すると、アプリケーションは、いずれかのポート番号との接続が確立するまで、試行を続けます。
この機能は、ClientPort ネットワーク・プロトコル・オプションと類似しています。ClientPort プロトコル・オプション [CPORT]を参照してください。
プロキシ・サーバを使用して実行しなければならない Web サービス要求もあります。そのような場合は、PROXY 句を使用してプロキシ・サーバの URL を指定します。
値のフォーマットは、URL 句と同じですが、ユーザ、パスワード、パス値などは無視されます。
proxy-string : '{ HTTP | HTTPS }://[ user:password@ ]hostname[ :port ][ /path ]'
プロキシ・サーバを指定すると、SQL Anywhere は要求をフォーマットし、指定されたプロキシ URL を使用してそれをプロキシ・サーバに送ります。プロキシ・サーバは、最終送信先へ要求を転送し、応答を取得し、SQL Anywhere へそれを返します。
HTTP 要求やトランスポート・データを含む Web サービス・クライアントの情報は、「Web サービス・クライアント・ログ・ファイル」に記録できます。このファイルへのロギングを有効にするには、-zoc サーバ・オプションを指定してデータベース・サーバを起動するか、sa_server_option システム・プロシージャを使用して WebClientLogging サーバ・プロパティを設定します。-zoc サーバ・オプションとsa_server_option システム・プロシージャを参照してください。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |