

# API Gateway のテンプレート変換のマッピングに変数を使用する例
<a name="api-gateway-mapping-variable-examples"></a>

以下の例は、マッピングテンプレートで `$context` 変数、`input` 変数、`util` 変数を使用する方法を説明しています。入力イベントを API Gateway に返すモック統合または Lambda 非プロキシ統合を使用できます。サポートされているデータ変換のすべての変数のリストについては、「[API Gateway のデータ変換の変数](api-gateway-mapping-template-reference.md)」を参照してください。

## 例 1: 統合エンドポイントに複数の `$context` 変数を渡す
<a name="context-variables-template-example"></a>

次の例は、統合リクエストペイロード内で、受信 `$context` 変数をわずかに異なる名前のバックエンド変数にマッピングするマッピングテンプレートを示しています。

```
{
    "stage" : "$context.stage",
    "request_id" : "$context.requestId",
    "api_id" : "$context.apiId",
    "resource_path" : "$context.resourcePath",
    "resource_id" : "$context.resourceId",
    "http_method" : "$context.httpMethod",
    "source_ip" : "$context.identity.sourceIp",
    "user-agent" : "$context.identity.userAgent",
    "account_id" : "$context.identity.accountId",
    "api_key" : "$context.identity.apiKey",
    "caller" : "$context.identity.caller",
    "user" : "$context.identity.user",
    "user_arn" : "$context.identity.userArn"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{
  stage: 'prod',
  request_id: 'abcdefg-000-000-0000-abcdefg',
  api_id: 'abcd1234',
  resource_path: '/',
  resource_id: 'efg567',
  http_method: 'GET',
  source_ip: '192.0.2.1',
  user-agent: 'curl/7.84.0',
  account_id: '111122223333',
  api_key: 'MyTestKey',
  caller: 'ABCD-0000-12345',
  user: 'ABCD-0000-12345',
  user_arn: 'arn:aws:sts::111122223333:assumed-role/Admin/carlos-salazar'
}
```

変数の 1 つは API キーです。この例では、メソッドが 1 つの API キーを要求することを前提としています。

## 例 2: すべてのリクエストパラメータを JSON ペイロードを介して統合エンドポイントに渡す
<a name="input-examples-mapping-templates"></a>

次の例では、`path` パラメータ、`querystring` パラメータ、`header` パラメータを含むすべてのリクエストパラメータを JSON ペイロードを介して統合エンドポイントに渡します。

```
#set($allParams = $input.params())
{
  "params" : {
    #foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
    "$type" : {
      #foreach($paramName in $params.keySet())
      "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
      #if($foreach.hasNext),#end
      #end
    }
    #if($foreach.hasNext),#end
    #end
  }
}
```

リクエストに次の入力パラメータがある場合:
+ `myparam` という名前のパスパラメータ
+ クエリ文字列パラメータ `querystring1=value1,value2`
+ ヘッダー `"header1" : "value1"`

このマッピングテンプレートの出力は、次のようになります。

```
{"params":{"path":{"example2":"myparamm"},"querystring":{"querystring1":"value1,value2"},"header":{"header1":"value1"}}}
```

## 例 3: メソッドリクエストのサブセクションを統合エンドポイントに渡す
<a name="input-example-json-mapping-template"></a>

 次の例では、入力パラメータ `name` を使用して、パラメータ `name` のみを取得し、入力パラメータ `input.json('$')` を使用してメソッドリクエスト本文全体を取得します。

```
{
    "name" : "$input.params('name')",
    "body" : $input.json('$') 
}
```

クエリ文字列パラメータ `name=Bella&type=dog` と次の本文を含むリクエストの場合:

```
{
    "Price" : "249.99",
    "Age": "6"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body" : {"Price":"249.99","Age":"6"}
}
```

このマッピングテンプレートは、クエリ文字列パラメータ `type=dog` を削除します。

 JSON の入力に JavaScript で解析できない文字がエスケープされずに含まれている場合、API Gateway は 400 レスポンスを返すことがあります。JSON の入力を正しく解析できるようにするには、`$util.escapeJavaScript($input.json('$'))` を適用します。

前の例に `$util.escapeJavaScript($input.json('$'))` を適用した結果は次のとおりです。

```
{
    "name" : "$input.params('name')",
    "body" : "$util.escapeJavaScript($input.json('$'))"
}
```

この場合、このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body": {"Price":"249.99","Age":"6"}
}
```

## 例 4: JSONPath 式を使用してメソッドリクエストのサブセクションを統合エンドポイントに渡す
<a name="input-example-inputs-mapping-template"></a>

次の例では、JSONPath 式を使用して、リクエスト本文から入力パラメータ `name` と `Age` のみを取得します。

```
{
    "name" : "$input.params('name')",
    "body" : $input.json('$.Age')  
}
```

クエリ文字列パラメータ `name=Bella&type=dog` と次の本文を含むリクエストの場合:

```
{
    "Price" : "249.99",
    "Age": "6"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body" : "6"
}
```

このマッピングテンプレートは、クエリ文字列パラメータ `type=dog` と `Price` フィールドを本文から削除します。

 メソッドリクエストのペイロードに JavaScript で解析できない文字がエスケープされずに含まれている場合、API Gateway は `400` レスポンスを返すことがあります。JSON の入力を正しく解析できるようにするには、`$util.escapeJavaScript()` を適用します。

前の例に `$util.escapeJavaScript($input.json('$.Age'))` を適用した結果は次のとおりです。

```
{
    "name" : "$input.params('name')",
    "body" : "$util.escapeJavaScript($input.json('$.Age'))" 
}
```

この場合、このマッピングテンプレートの出力は、次のようになります。

```
{
    "name" : "Bella",
    "body": "\"6\""
}
```

## 例 5: JSONPath 式を使用してメソッドリクエストに関する情報を統合エンドポイントに渡す
<a name="input-example-request-and-response"></a>

次の例では、`$input.params()`、`$input.path()`、`$input.json()` を使用して、メソッドリクエストに関する情報を統合エンドポイントに送信します。このマッピングテンプレートは、`size()` メソッドを使用してリスト内の要素の数を提供します。

```
{
    "id" : "$input.params('id')",
    "count" : "$input.path('$.things').size()",
    "things" : $input.json('$.things')
}
```

パスパラメータ `123` と次の本文を含むリクエストの場合:

```
{
      "things": {
            "1": {},
            "2": {},
            "3": {}
      }
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{"id":"123","count":"3","things":{"1":{},"2":{},"3":{}}}
```

 メソッドリクエストのペイロードに JavaScript で解析できない文字がエスケープされずに含まれている場合、API Gateway は `400` レスポンスを返すことがあります。JSON の入力を正しく解析できるようにするには、`$util.escapeJavaScript()` を適用します。

前の例に `$util.escapeJavaScript($input.json('$.things'))` を適用した結果は次のとおりです。

```
{
     "id" : "$input.params('id')",
     "count" : "$input.path('$.things').size()",
     "things" : "$util.escapeJavaScript($input.json('$.things'))"
}
```

このマッピングテンプレートの出力は、次のようになります。

```
{"id":"123","count":"3","things":"{\"1\":{},\"2\":{},\"3\":{}}"}
```