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
タグ