

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用變數進行 API Gateway 映射範本轉換的範例
<a name="api-gateway-mapping-variable-examples"></a>

以下範例說明如何在映射範本中使用 `$context`、`input` 和 `util` 變數。您可以使用模擬整合或 Lambda 非代理整合，將輸入事件傳回至 API Gateway。如需資料轉換支援的所有變數的清單，請參閱 [用於 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'
}
```

其中一個變數是 API 金鑰。此範例假設該方法需要 API 金鑰。

## 範例 2：透過 JSON 承載將所有請求參數傳遞至整合端點
<a name="input-examples-mapping-templates"></a>

下列範例會透過 JSON 承載將所有請求參數 (包含 `path`、`querystring` 和 `header`) 傳遞至整合端點：

```
#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 回應。套用 `$util.escapeJavaScript($input.json('$'))` 以確保 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` 回應。套用 `$util.escapeJavaScript()` 以確保 JSON 輸入可正確剖析。

套用 `$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` 回應。套用 `$util.escapeJavaScript()` 以確保 JSON 輸入可正確剖析。

套用 `$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\":{}}"}
```