Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere データ・アクセス API » SQL Anywhere Web サービス

 

Web サービス・クライアント関数とプロシージャの作成

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 を暗黙で指定します。

Web サービス・クライアント関数とプロシージャの名前

出力 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>
ネームスペース URI

すべての SOAP 要求は、メソッド・ネームスペース URI を必要とします。サーバ側の SOAP プロセッサはこの URI を使用して、要求のメッセージ本文内にあるさまざまなエンティティの名前を解釈します。

SOAP:DOC または SOAP:RPC の SOAP 関数またはプロシージャを作成する場合、ネームスペース URI を指定しなければ呼び出しが成功しない可能性があります。必要なネームスペース値は、WSDL 記述ドキュメントやサービスのマニュアルから取得できます。NAMESPACE 句は、SOAP 関数とプロシージャのみに適用します。デフォルトのネームスペース値はプロシージャの URI で、オプションのパス・コンポーネントとユーザおよびパスワードの値は含みません。

HTTPS 要求

セキュア 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 へそれを返します。

Web サービスのクライアント・プロシージャのロギング

HTTP 要求やトランスポート・データを含む Web サービス・クライアントの情報は、「Web サービス・クライアント・ログ・ファイル」に記録できます。このファイルへのロギングを有効にするには、-zoc サーバ・オプションを指定してデータベース・サーバを起動するか、sa_server_option システム・プロシージャを使用して WebClientLogging サーバ・プロパティを設定します。-zoc サーバ・オプションsa_server_option システム・プロシージャを参照してください。


HTTP ヘッダの修正