変換の例
例を使用して、APIゲートウェイを使用してバックエンド・サービスとの間で送受信される受信リクエストおよび送信レスポンスを変更する方法を学習します。
このセクションの例では、JSONファイルの次のAPIデプロイメント定義および基本的なAPIデプロイメント仕様を想定しています:
{
"displayName": "Marketing Deployment",
"gatewayId": "ocid1.apigateway.oc1..aaaaaaaab______hga",
"compartmentId": "ocid1.compartment.oc1..aaaaaaaa7______ysq",
"pathPrefix": "/marketing",
"specification": {
"routes": [
{
"path": "/weather",
"methods": ["GET"],
"backend": {
"type": "HTTP_BACKEND",
"url": "https://api.weather.gov"
},
"requestPolicies": {}
}
]
},
"freeformTags": {},
"definedTags": {}
}コンソールでダイアログを使用してAPIデプロイメント仕様を定義する場合も、例が適用されます。
例1: ヘッダー・パラメータを問合せパラメータに変換する
この例では、既存のHTTPバック・エンドが、ヘッダー・パラメータではなく問合せパラメータを含むリクエストのみを処理すると仮定します。しかし、HTTPバック・エンドでヘッダー・パラメータを含むリクエストを処理する必要があります。これを実現するには、リクエスト・ヘッダーから取得した値を問合せパラメータとしてHTTPバック・エンドに渡す問合せパラメータ変換リクエスト・ポリシーを含むAPIデプロイメント仕様を作成します。
"requestPolicies": {
"queryParameterTransformations": {
"setQueryParameters": {
"items": [
{
"name": "region",
"values": ["${request.headers[region]}"],
"ifExists": "OVERWRITE"
}
]
}
}
}この例では、curl -H "region: west" https://<gateway-hostname>/marketing/weatherのようなリクエストがhttps://api.weather.gov?region=westに解決されます。
例2: あるヘッダーから別のヘッダーに変換する
この例では、既存のHTTPバック・エンドが特定のヘッダーを含むリクエストのみを処理すると仮定します。しかし、HTTPバック・エンドで別のヘッダーを含むリクエストを処理する必要があります。これを実現するには、あるリクエスト・ヘッダーから取得した値を別のリクエスト・ヘッダーとしてHTTPバック・エンドに渡すヘッダー変換リクエスト・ポリシーを含むAPIデプロイメント仕様を作成します。
"requestPolicies": {
"headerTransformations": {
"setHeaders": {
"items": [
{
"name": "region",
"values": ["${request.headers[locale]}"],
"ifExists": "OVERWRITE"
}
]
}
}
}この例では、curl -H "locale: west" https://<gateway-hostname>/marketing/weatherのようなリクエストがリクエストcurl -H "region: west" https://api.weather.govに解決されます。
例3: JWTから取得した認証パラメータをリクエスト・ヘッダーとして追加する
この例では、既存のHTTPバック・エンドで、検証済JSON Webトークン(JWT)のsubクレームの値をJWT_SUBJECTという名前のヘッダーとしてリクエストに含める必要があると仮定します。APIゲートウェイ・サービスは、JWTに含まれるsubクレームの値を認証パラメータとしてrequest.auth表に保存しました。
JWT_SUBJECTという名前のヘッダーにsubの値を含めるには、ヘッダー変換リクエスト・ポリシーを含むAPIデプロイメント仕様を作成します。リクエスト・ポリシーは、request.auth表からsub値を取得し、それをJWT_SUBJECTヘッダーの値としてHTTPバック・エンドに渡します。
"requestPolicies": {
"headerTransformations": {
"setHeaders": {
"items": [
{
"name": "JWT_SUBJECT",
"values": ["${request.auth[sub]}"],
"ifExists": "OVERWRITE"
}
]
}
}
}この例では、リクエストが正常に検証されると、HTTPバック・エンドに渡されるリクエストにJWT_SUBJECTヘッダーが追加されます。
例4: 認可プロバイダ・ファンクションから取得したキーを問合せパラメータとして追加する
この例では、既存のHTTPバック・エンドで、認証の目的でリクエストにaccess_keyという問合せパラメータを含める必要があると仮定します。access_key問合せパラメータに、リクエストを正常に検証した認可プロバイダ・ファンクションによって戻されたapiKeyという名前のキーの値を指定する必要があります。APIゲートウェイ・サービスは、apiKey値を認証パラメータとしてrequest.auth表に保存しました。
リクエストにaccess_key問合せパラメータを含めるには、問合せパラメータ変換リクエスト・ポリシーを含むAPIデプロイメント仕様を作成します。リクエスト・ポリシーは、request.auth表からapiKey値を取得し、それをaccess_key問合せパラメータの値としてHTTPバック・エンドに渡します。
"requestPolicies": {
"queryParameterTransformations": {
"setQueryParameters": {
"items": [
{
"name": "access_key",
"values": ["${request.auth[apiKey]}"],
"ifExists": "OVERWRITE"
}
]
}
}
}この例では、access_key問合せパラメータは、HTTPバック・エンドに渡されるリクエストに、request.auth表のapiKey値とともに追加されます。https://<gateway-hostname>/marketing/weatherなどのリクエストは、https://api.weather.gov?access_key=fw5n9abi0epなどのリクエストに解決されます
例5: オプションの問合せパラメータのデフォルト値を追加する
この例では、既存のHTTPバック・エンドで、リクエストにcountryという問合せパラメータを含める必要があると仮定します。ただし、country問合せパラメータはオプションで、一部のAPIクライアント送信リクエストには含まれません。リクエストにすでにcountry問合せパラメータと値が含まれている場合は、両方をそのままHTTPバック・エンドに渡します。ただし、リクエストにcountry問合せパラメータがまだ含まれていない場合は、country問合せパラメータとデフォルト値をリクエストに追加します。
すべてのリクエストにcountry問合せパラメータが含まれるようにするには、問合せパラメータ変換リクエスト・ポリシーを含むAPIデプロイメント仕様を作成します。リクエスト・ポリシーは、country問合せパラメータがまだ含まれていないリクエストに、country問合せパラメータとデフォルト値を追加します。
"requestPolicies": {
"queryParameterTransformations": {
"setQueryParameters": {
"items": [
{
"name": "country",
"values": ["usa"],
"ifExists": "SKIP"
}
]
}
}
}この例では、https://<gateway-hostname>/marketing/weatherのようなリクエストがhttps://api.weather.gov?country=usaに解決されます。https://<gateway-hostname>/marketing/weather?country=canadaのようなリクエストはhttps://api.weather.gov?country=canadaに解決されます。