本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
API 閘道映射範本和存取日誌變數參考
本節提供 Amazon API Gateway 定義用於資料模型、授權方、映射範本和 CloudWatch 存取日誌的變數和函數參考資訊。如需如何使用這些變數和函數的詳細資訊,請參閱的映射範本 REST APIs。如需 Velocity 範本語言 (VTL) 的詳細資訊,請參閱VTL參考
主題
注意
若為 $method
和 $integration
變數,請參閱 Amazon API Gateway API請求和回應資料映射參考。
$context
資料模型、授權方、映射範本和 CloudWatch 存取記錄的變數
下列$context
變數可用於資料模型、授權方、映射範本和 CloudWatch 存取日誌。API Gateway 可能會新增其他內容變數。
如需只能在 CloudWatch 存取日誌中使用的$context
變數,請參閱 僅適用於存取記錄的 $context 變數。
參數 | 描述 |
---|---|
$context.accountId |
API 擁有者 AWS 的帳戶 ID。 |
$context.apiId |
識別碼 API Gateway 會指派給您的 API。 |
$context.authorizer.claims. |
成功驗證方法發起人之後,從 Amazon Cognito 使用者集區傳回之宣告的屬性。如需詳細資訊,請參閱 使用 Amazon Cognito 使用者集區做為授權者來控制對 REST API 的存取。 注意呼叫 |
$context.authorizer.principalId |
與用戶端傳送並從 API Gateway Lambda 授權方 (先前稱為自訂授權方) 傳回之權杖相關聯的主要使用者身分。如需詳細資訊,請參閱使用 API Gateway Lambda 授權方。 |
$context.authorizer. |
從 API Gateway Lambda 授權方函數傳回的
呼叫 用於 如需詳細資訊,請參閱使用 API Gateway Lambda 授權方。 |
$context.awsEndpointRequestId |
AWS 端點的請求 ID。 |
$context.deploymentId |
API 部署的 ID。 |
$context.domainName |
用來叫用 的完整網域名稱API。這應該與傳入的 |
$context.domainPrefix |
|
$context.error.message |
包含API閘道錯誤訊息的字串。此變數只能用於GatewayResponse內文映射範本中的簡單變數取代,該範本不會由 Velocity 範本語言引擎和存取日誌中處理。如需詳細資訊,請參閱 使用 CloudWatch 指標監控 WebSocket API執行 和 設定閘道回應以自訂錯誤回應。 |
$context.error.messageString |
$context.error.message 的引用值,即 "$context.error.message" 。 |
$context.error.responseType |
一種 類型GatewayResponse。此變數只能用於GatewayResponse內文映射範本中的簡單變數取代,該範本不會由 Velocity 範本語言引擎和存取日誌中處理。如需詳細資訊,請參閱 使用 CloudWatch 指標監控 WebSocket API執行 和 設定閘道回應以自訂錯誤回應。 |
$context.error.validationErrorString |
字串,其中包含詳細的驗證錯誤訊息。 |
$context.extendedRequestId |
API Gateway 產生並指派給API請求的延伸 ID。延伸請求 ID 包含有助於偵錯和疑難排解的資訊。 |
$context.httpMethod |
使用HTTP的方法。有效值包含: |
$context.identity.accountId |
與請求相關聯的 AWS 帳戶 ID。 |
$context.identity.apiKey |
對於需要API金鑰API的方法,此變數是與方法請求相關聯的API金鑰。對於不需要API金鑰的方法,此變數為 null。如需詳細資訊,請參閱API Gateway RESTAPIs中 的使用計劃和API金鑰 。 |
$context.identity.apiKeyId |
與需要API金鑰之API請求相關聯的API金鑰 ID。 |
$context.identity.caller |
已簽署請求之發起人的主體識別符。支援使用IAM授權的資源。 |
$context.identity.cognitoAuthenticationProvider |
發出請求的呼叫者使用的所有 Amazon Cognito 身分驗證提供者的逗號分隔清單。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。 例如,適用於 Amazon Cognito 使用者集區的身分, 如需可用 Amazon Cognito 身分驗證提供者的相關資訊,請參閱 Amazon Cognito 開發人員指南 中的使用聯合身分。 |
$context.identity.cognitoAuthenticationType |
提出請求的發起人的 Amazon Cognito 身分驗證類型。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。可能的值包括用於已驗證身分的 |
$context.identity.cognitoIdentityId |
提出請求的發起人的 Amazon Cognito 身分 ID。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。 |
$context.identity.cognitoIdentityPoolId |
提出請求的發起人的 Amazon Cognito 身分集區 ID。僅在使用 Amazon Cognito 登入資料簽署請求時才可使用。 |
$context.identity.principalOrgId |
|
$context.identity.sourceIp |
立即TCP連線的來源 IP 地址,向API閘道端點發出請求。 |
$context.identity.clientCert.clientCertPem |
用戶端在相互TLS身分驗證期間提供的 PEM編碼用戶端憑證。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會出現此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。 |
$context.identity.clientCert.subjectDN |
用戶端提供之憑證主體的辨別名稱。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。 |
$context.identity.clientCert.issuerDN |
用戶端提供之憑證發行者的辨別名稱。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。 |
$context.identity.clientCert.serialNumber |
憑證的序號。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。 |
$context.identity.clientCert.validity.notBefore |
憑證無效之前的日期。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。 |
$context.identity.clientCert.validity.notAfter |
憑證無效之後的日期。當用戶端API使用已啟用相互TLS功能的自訂網域名稱存取 時,會顯示此狀態。僅在相互TLS身分驗證失敗時出現在存取日誌中。 |
$context.identity.vpcId |
向API閘道端點VPC提出請求的 VPC ID。 |
$context.identity.vpceId |
向API閘道VPC端點發出請求的VPC端點的端點 ID。僅當您擁有私有 時才會顯示API。 |
$context.identity.user |
將針對資源存取授權之使用者的主體識別符。支援使用IAM授權的資源。 |
$context.identity.userAgent |
API 呼叫者的 |
$context.identity.userArn |
驗證後識別的有效使用者的 Amazon Resource Name (ARN)。如需詳細資訊,請參閱https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html。 |
$context.isCanaryRequest |
|
$context.path |
請求路徑。例如,對於 的非代理請求URLhttps://{rest-api-id}.execute-api.{region}.amazonaws.com/{stage}/root/child ,$context.path 值為 /{stage}/root/child 。 |
$context.protocol |
請求通訊協定,例如 HTTP/1.1 。注意API Gateway APIs可接受 HTTP/2 請求,但 API Gateway 會使用 HTTP/1.1 將請求傳送至後端整合。因此,即使用戶端傳送使用 HTTP/2 的請求,請求通訊協定也會記錄為 HTTP/1.1。 |
$context.requestId |
請求的 ID。用戶端可以覆寫此請求 ID。 |
$context.requestOverride.header. |
請求標題會覆寫。如果定義了此參數,則它包含要使用的標頭,而不是在整合請求窗格中定義的HTTP標頭。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼。 |
$context.requestOverride.path. |
請求路徑會覆寫。如果定義了此參數,則它包含要使用的請求路徑,而不是整合請求窗格中定義的URL路徑參數。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼。 |
$context.requestOverride.querystring. |
請求查詢字串會覆寫。如果定義了此參數,則包含要使用的請求查詢字串,而不是整合請求窗格中定義的URL查詢字串參數。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼。 |
$context.responseOverride.header. |
回應標題會覆寫。如果此參數已經定義,它包含要傳回的標頭 (而不是在 Integration Response (整合回應) 窗格中定義為 Default mapping (預設映射) 的 Response header (回應標頭))。如需詳細資訊,請參閱 使用映射範本覆寫 API的請求和回應參數和狀態碼。 |
$context.responseOverride.status |
回應狀態碼會覆寫。如果此參數已經定義,它包含要傳回的狀態碼 (而不是在 Integration Response (整合回應) 窗格中定義為 Default mapping (預設映射) 的 Method response status (方法回應狀態))。如需詳細資訊,請參閱使用映射範本覆寫 API的請求和回應參數和狀態碼。 |
$context.requestTime |
CLFdd/MMM/yyyy:HH:mm:ss +-hhmm )。 |
$context.requestTimeEpoch |
Epoch |
$context.resourceId |
API Gateway 指派給資源的識別碼。 |
$context.resourcePath |
您資源的路徑。例如,對於 的非代理請求URI |
$context.stage |
API 請求的部署階段 (例如 |
$context.wafResponseCode |
從 AWS WAF 收到的回應: |
$context.webaclArn |
ACL 用來決定是否允許或封鎖請求ARN的 Web 完整。如果階段未與 Web 建立關聯,則不會設定 ACL。如需詳細資訊,請參閱用 AWS WAF 於在 API Gateway 中保護您的其餘 API。 |
$context
變數範本範例
如果您的API方法將結構化資料傳遞至需要資料以特定格式顯示的後端,您可能想要在映射範本中使用$context
變數。
以下範例顯示一個映射範本,其會將傳入的 $context
變數映射至整合請求承載中名稱稍有不同的後端變數:
注意
其中一個變數是API金鑰。此範例假設 方法需要 API金鑰。
{ "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' }
僅適用於存取記錄的 $context
變數
以下 $context
變數僅適用於存取記錄。如需詳細資訊,請參閱在 API Gateway RESTAPIs中設定 CloudWatch 的記錄。(如需 WebSocket APIs,請參閱 使用 CloudWatch 指標監控 WebSocket API執行。)
參數 | 描述 |
---|---|
$context.authorize.error |
授權錯誤訊息。 |
$context.authorize.latency |
授權延遲 (以毫秒為單位)。 |
$context.authorize.status |
從授權嘗試傳回的狀態碼。 |
$context.authorizer.error |
從授權方傳回的錯誤訊息。 |
$context.authorizer.integrationLatency |
以毫秒為單位的授權方整合延遲。 |
$context.authorizer.integrationStatus |
從 Lambda 授權方傳回的狀態碼。 |
$context.authorizer.latency |
授權方延遲 (以毫秒為單位)。 |
$context.authorizer.requestId |
AWS 端點的請求 ID。 |
$context.authorizer.status |
從授權方傳回的狀態碼。 |
$context.authenticate.error |
從驗證嘗試傳回的錯誤訊息。 |
$context.authenticate.latency |
驗證延遲 (以毫秒為單位)。 |
$context.authenticate.status |
從驗證嘗試傳回的狀態碼。 |
$context.customDomain.basePathMatched |
傳入請求相符的API映射路徑。當用戶端使用自訂網域名稱存取 時適用API。例如,如果用戶端將請求傳送至 |
$context.endpointType |
的端點類型API。 |
$context.integration.error |
從整合傳回的錯誤訊息。 |
$context.integration.integrationStatus |
對於 Lambda 代理整合,從 傳回的狀態碼 AWS Lambda,而不是後端 Lambda 函數碼。 |
$context.integration.latency |
整合延遲 (以毫秒為單位)。等同於 $context.integrationLatency 。 |
$context.integration.requestId |
AWS 端點的請求 ID。等同於 $context.awsEndpointRequestId 。 |
$context.integration.status |
從整合傳回的狀態碼。對於 Lambda 代理整合而言,這是您的 Lambda 函數程式碼傳回的狀態碼。 |
$context.integrationLatency |
整合延遲 (以毫秒為單位)。 |
$context.integrationStatus |
對於 Lambda 代理整合,此參數代表從 傳回的狀態碼 AWS Lambda,而不是後端 Lambda 函數碼。 |
$context.responseLatency |
回應延遲 (以毫秒為單位)。 |
$context.responseLength |
回應承載長度 (以位元組為單位)。 |
$context.status |
方法回應狀態。 |
$context.waf.error |
從 傳回的錯誤訊息 AWS WAF。 |
$context.waf.latency |
以毫秒為單位的 AWS WAF 延遲。 |
$context.waf.status |
從 傳回的狀態碼 AWS WAF。 |
$context.xrayTraceId |
X-Ray 追蹤的追蹤 ID。如需詳細資訊,請參閱 AWS X-Ray 使用 API Gateway REST API 進行設定。 |
$input
變數
$input
變數代表映射範本要處理的方法請求承載和參數。它提供下列函數:
變數和函數 | 描述 |
---|---|
$input.body |
傳回原始請求承載做為字串。您可以使用 |
$input.json(x) |
此函數會評估JSONPath運算式,並將結果傳回為JSON字串。 例如, 會 |
$input.params() |
傳回所有請求參數的映射。我們建議您使用 |
$input.params(x) |
從路徑、查詢字串或標頭值 (以此順序搜尋) 傳回方法請求參數值,而參數名稱字串為 |
$input.path(x) |
使用JSONPath運算式字串 ( 例如,如果表達式
|
$input
變數範本範例
下列範例示範如何在映射範本中使用$input
變數。您可以使用模擬整合或 Lambda 非代理整合,將輸入事件傳回給 API Gateway,以嘗試這些範例。
參數對應範本範例
下列範例會透過JSON承載將所有請求參數傳遞至整合端點header
,包括 querystring
、 path
和 :
#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&querystring2=value3
標頭
"header1" : "value1"
、"header2" : "value2"
、"header3" : "value3"
。
此映射範本的輸出應如下所示:
{ "params" : { "path" : { "path" : "myparam" } , "querystring" : { "querystring1" : "value1,value2" , "querystring2" : "value3" } , "header" : { "header3" : "value3" , "header2" : "value2" , "header1" : "value1" } } }
JSON 映射範本範例
建議您使用 $input
變數來取得查詢字串和請求內文,而不論是否使用模型。您可能也想要取得 參數和承載,或承載的子區段。下列三個範例示範如何執行此操作。
下列範例使用映射範本來取得承載的子區段。此範例會取得輸入參數name
,然後取得整個POST內文:
{ "name" : "$input.params('name')", "body" : $input.json('$') }
對於包含查詢字串參數name=Bella&type=dog
和下列內文的請求:
{ "Price" : "249.99", "Age": "6" }
此映射範本的輸出應如下所示:
{ "name" : "Bella", "body" : {"Price":"249.99","Age":"6"} }
如果JSON輸入包含 無法剖析的未逸出字元 JavaScript,APIGateway 可能會傳回 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\"} }
JSONPath 表達式範例
下列範例示範如何將JSONPath運算式傳遞至 json()
方法。您也可以使用句點 .
來指定 屬性,以讀取請求主體物件的子區段:
{ "name" : "$input.params('name')", "body" : $input.json('$.Age') }
對於包含查詢字串參數name=Bella&type=dog
和下列內文的請求:
{ "Price" : "249.99", "Age": "6" }
此映射範本的輸出應如下所示:
{ "name" : "Bella", "body" : "6" }
如果方法請求承載包含 無法剖析的未逸出字元 JavaScript,APIGateway 可能會傳回400
回應。套用$util.escapeJavaScript()
以確保JSON輸入可以正確剖析。
$util.escapeJavaScript($input.json('$.Age'))
套用的上一個範例如下所示:
{ "name" : "$input.params('name')", "body" : "$util.escapeJavaScript($input.json('$.Age'))" }
在此情況下,此映射範本的輸出應如下所示:
{ "name" : "Bella", "body": "\"6\"" }
請求和回應範例
下列範例$input.json()
針對路徑為 的資源使用 $input.params()
$input.path()
、 和 /things/{id}
:
{ "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,APIGateway 可能會傳回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\":{}}"}
如需其他映射範例,請參閱「的映射範本 REST APIs」。
$stageVariables
階段變數可用於參數映射和映射範本,以及作為方法整合中ARNs和URLs方法整合中使用的預留位置。如需詳細資訊,請參閱RESTAPI在API閘道中使用階段變數。
語法 | 描述 |
---|---|
$stageVariables. 、$stageVariables[' 或 ${stageVariables[' |
|
$util
變數
$util
變數包含要在映射範本中使用的公用程式函數。
注意
除非另有說明,否則預設字元集為 UTF-8。
函式 | 描述 |
---|---|
$util.escapeJavaScript() |
使用字串規則逸出 JavaScript 字串中的字元。 注意此函數會將任何一般單引號 (
|
$util.parseJson() |
採取 "stringified" JSON並傳回結果的物件表示法。您可以使用此函數的結果,以 Apache Velocity 範本語言 () 原生方式存取和操作承載的元素VTL。例如,如果您有下列承載:
並使用下列映射範本
您將會收到下列輸出:
|
$util.urlEncode() |
將字串轉換為「application/x-www-form-urlencoded」格式。 |
$util.urlDecode() |
解碼「應用程式/x-www-form-urlencoded」字串。 |
$util.base64Encode() |
將資料編碼為 base64 編碼字串。 |
$util.base64Decode() |
解碼 base64 編碼字串中的資料。 |