AWSのAPI Gatewayでリクエストの条件によりレスポンスをJSON/XMLに切り換える
APIのターゲットをMy_Lambda_for_API_Gatewayという名のLambdaとする。
def lambda_handler(event, context):
content_type = ''
body = ''
is_xml = ( 'xml' in event and event['xml'] != "" )
if is_xml:
import xml.etree.ElementTree as ET
root = ET.Element('res')
ET.SubElement(root, 'doc', event['body'])
body = ET.tostring(root, encoding='utf8').decode('utf8')
else:
import json
body = json.dumps(event['body'])
return body
event['xml']というパラメータでXMLとJSONの出力を切り換える。
API Gatewayで設定する。
API名: MyApi、デプロイされるステージ名: MyApiStageとする。
URLクエリ文字列パラメータとHTTPヘッダーの2通りで切り換える。
やることをまとめる。
- メソッドリクエスト
- 使用するパラメータを追加
- 統合リクエスト
-
- URLクエリ文字列パラメータ/HTTPヘッダー
- これらのデータをマッピングテンプレートで指定するデータの中に含められる
-
- URLクエリ文字列パラメータ xml を追加
- マッピング元を method.request.querystring.xml とする
- json形式のマッピングテンプレートに "xml": "$input.params('xml')" を追加("がないと空の場合にエラーするので、"も含める)
- HTTPヘッダー Format を追加
- マッピング元を method.request.header.Format とする
- json形式のマッピングテンプレートに "xml" : "$util.escapeJavaScript($input.params().get('header').get('Format'))" を追加
-
- マッピングテンプレート
- この先のサービスに送信するデータを指定
- Content-Typeはこのテンプレートに対する設定
- メソッドレスポンス
-
- 200 > 200のレスポンスヘッダー
- 統合レスポンスで扱えるようにContent-Typeを追加する
- 200 > 200のレスポンス本文
-
- レスポンス本文の形式(Content-Type)を追加する
- json形式で出力されるならapplication/jsonを追加
- xml形式で出力されるならapplication/xmlを追加
- レスポンスにより形式が変わるなら複数のコンテンツタイプを追加
- 統合レスポンス
-
- ヘッダーのマッピング
-
- レスポンスヘッダー: Content-Type, マッピングの値: integration.response.body.Content-Type を追加
- レスポンスに含まれるContent-Typeの値がヘッダーのContent-Typeへマッピングされる
- マッピングテンプレート
- レスポンス本文の形式がjsonならapplication/jsonを追加
- $input.json('$') とするとjson形式で出力される
curlコマンドで確認する。
- レスポンスをJSONで取得
- curl -i -X POST https://XXX.execute-api.REGION.amazonaws.com/MyApiStage/query -d '{"a":"b"}' -H "Content-Type:application/json"
- curl -i -X POST https://XXX.execute-api.REGION.amazonaws.com/MyApiStage/header -d '{"a":"b"}' -H "Content-Type:application/json"
- レスポンスをXMLで取得
- curl -i -X POST https://XXX.execute-api.REGION.amazonaws.com/MyApiStage/query?xml=1 -d '{"a":"b"}' -H "Content-Type:application/json"
- curl -i -X POST https://XXX.execute-api.REGION.amazonaws.com/MyApiStage/header -d '{"a":"b"}' -H "Content-Type:application/json" -H "Format:xml"
- OpenAPI 3+API Gateway拡張の形式
- 📁./Documents/2019-08-11-21-23-55.yaml
- XXX、REGION、OWNER_NUMBERを環境に合わせて書き換える。
2019/08/11 20:32