RESTful Web サービス プロキシ with WADL の公開

このトピックでは、RESTful Web サービスとゲートウェイを使用する方法について説明します。
gateway83
このトピックでは、RESTful Web サービスと
Layer7 API Gateway
を使用する方法について説明します。
RESTful Web サービスの使用
RESTful Web サービスおよびリソースの使用は、一般的に Web サービスおよび Web API を公開するための代替方法を提供します。RESTful Web サービスは、WS-* 形式の Web サービスの代替となるものであり、REST (Representational State Transfer)のガイドラインおよび原則に従って作成されます。RESTful Web サービスの特性の一部を以下に示します。
  • リソースは HTTP URI によって一意に識別されます。
  • リソースに対するアクションは HTTP 動詞(メソッド)によって指定されます。
  • リソース表現は HTTP ペイロードです。
  • Content-Type は XML に制限されません。任意のタイプ(JSON など)を使用できます。
Layer7 API Gateway
は、WS-* (SOAP、WSDL を使用する)サービスと同じ程度に RESTful Web サービスを保護するために役立ちます。
追加リソース
REST の原則およびガイドラインの詳細については、http://en.wikipedia.org/wiki/Representational_State_Transfer を参照してください。
Layer7 API Gateway
と RESTful Web サービスの使用の詳細については、CA Technologies の以下のリソースを参照してください
RESTful Web サービスの保護
以下の表では、
Layer7 API Gateway
を使用して RESTful Web サービスを保護する手順の概要について説明します。
注: 「XML アプリケーション」という用語には語弊があります。RESTful Web サービスで XML を使用しない場合、
Layer7 API Gateway
はその他の多くの Content-Type をサポートできます。
目的
方法
既存の RESTful Web サービスのトラフィックをルーティングおよび検証するポリシーの作成
手順 1:
SOAP ポリシーと同じ方法でポリシーを作成します。ただし、SOAP Web サービスの公開ウィザードではなく、Web API の公開ウィザードを使用します。「*」ワイルドカード文字を使用して、そのサービスのすべての有効な URL とポリシーを関連付けるように解決 URI パターンを設定してください(理由: 単一の URL エントリ ポイントがある WS-* 形式の Web サービスとは異なり、RESTful Web サービスは HTTP URL の URI 部分を使用して対象のリソース ID を参照します。そのため、同じポリシーが適用されていても、使用される URL はリソースごとに異なります。URL パターンによって異なるポリシーを指定できます)。
公開後、
Layer7 API Gateway
は RESTful Web サービスのエントリ ポイントになります。Gateway は、各受信リクエストのサービス エンドポイントを再構成およびプロキシします。レスポンスは同様にリバース プロキシされます。
詳細については、「非 SOAP アプリケーションの公開」を参照してください。
手順 2:
Route via HTTP(S) アサーションのデフォルト動作では、RESTful Web サービスのエントリ ポイント URI ではなく、明示的なエンドポイント URL にルーティングされます。URI をダウンストリームにレプリケートするには、コンテキスト変数 ${request.http.uri} を使用して HTTP ルーティング ターゲットの一部として指定します。たとえば、以下のようにターゲット URL を指定します。
http://downstreamServiceHost/something${request.http.uri}
${request.http.uri} 変数の詳細については、「トランスポート レイヤ変数」を参照してください。
ポリシーの一部として URI の特定の部分を使用する必要がある場合は、Evaluate Regular Expression アサーションを使用して受信 URL (${request.http.url}) からその部分を抽出できます。
手順 3:
RESTful Web サービスが XML 内のリソースをフォーマットする場合、XML 関連のアサーションを使用して受信コンテンツを検証できます。このようなアサーションの例には、Validate XML Schema、Evaluate Request XPath、Evaluate Response XPath アサーションがあります。サービスが JSON を使用する場合は、代わりに Validate JSON Schema アサーションを使用します。
テキスト ベースの Content-Type については、Evaluate Regular Expression アサーションを使用して特定のパターンを評価できます。
セキュリティ脅威保護アサーションは、RESTful Web サービスの入力を検証する場合にも役立ちます。
HTTP パラメータの検証
特定の HTTP パラメータの検証は、Validate HTML Form Data アサーションを使用して実行できます。このアサーションにより、以下を適用できます。
  • 許可される HTTP メソッド(GET、POST)
  • リクエスト内に存在する必要がある HTTP パラメータ
  • リクエスト内の各パラメータの出現回数
  • リクエスト内のパラメータが出現する場所(URL、本文、またはリクエスト内の任意の場所)
  • 名前のないフィールドの存在(許可/禁止)
詳細については、「Validate HTML Form Data アサーション」を参照してください。
JSON スキーマの検証
JSON スキーマに対して JSON データ構造およびプロパティ タイプ/値を検証する必要がある場合は、Validate JSON Schema アサーションをポリシーに追加します。
コンテキスト変数サフィックス「.mainpart」を使用して、特定のメッセージ(リクエスト、レスポンスなど)の JSON ペイロードにアクセスします。このサフィックスの詳細については、「コンテキスト変数」の「コンテキスト変数のデータ型」を参照してください。
詳細については、「Validate JSON Schema アサーション」を参照してください。
JSON と XML の変換
XML から JSON に変換するには、Apply XSL Transformation アサーションを使用します。JSON から XML に変換するには、Set Context Variable アサーションおよびコンテキスト変数を使用します。
セキュリティ オプション
HTTP に適切な認証メカニズム使用して、リクエスタを認証および許可できます。これらの例には以下が含まれます。
  • Require SSL or TLS Transport
  • Require SSL or TLS Transport with Client Authentication
  • Require HTTP Basic Credentials
  • Require Windows Integrated Authentication Credentials
キャッシュ
キャッシュできるリソースは RESTful Web サービスのプロパティです。
Layer7 API Gateway
は、RESTful Web サービスのこの面を実装するのに役立つ以下のアサーションを提供しています。
  • Store to Cache
  • Look Up in Cache
ポリシーの設定
ほとんどのアサーションは RESTful Web サービスに使用できますが、SOAP 固有のアサーションは適切ではありません。ポリシー検証機能によって警告されます。
詳細については、「ポリシーの設定」を参照してください。
HTTP 動詞の制限
ポリシーと関連付けられた HTTP メソッド(動詞)に対する制限を設定できます。たとえば、URI パターンによって異なる動詞を許可できます。RESTful Web サービスでは、GET、PUT、POST、DELETE メソッドを使用できます。
ダウンストリームに送信される HTTP メソッドを設定するには、Route via HTTP(S) アサーションを使用します。
コンテキスト変数 ${request.http.method} を使用して、受信した動詞に基づいてポリシーを分岐することもできます。
HTTP ヘッダへのアクセス
以下のようなコンテキスト変数パターンを使用して、さまざまな HTTP ヘッダ値にアクセスできます。
${<target>.http.header.<name>}
「<target>」は、request、response、またはメッセージ コンテキスト変数のいずれかです。「<name>」は取得されるヘッダ値です。
例:
  • ${request.http.header.content-type} は、ヘッダから Content-Type (たとえば、「text/xml」)を取得します。
  • ${request.http.header.date} は、HTTP ヘッダから日付を取得します。
${<target>.http.header.<name>} 変数は、HTTP 経由で受信したか、HTTP 経由で受信したリクエストへのデフォルトのレスポンス メッセージにのみ使用可能です。後者の場合、使用可能なヘッダは、レスポンスが最終的に送信されるときにレスポンス ヘッダに追加される予定のヘッダのみです。この変数の詳細については、「トランスポート レイヤ変数」を参照してください。