錯誤碼映射外掛程式
用於將後端應答中返回的非正常請求,映射為用戶端期望的錯誤應答的情境。
1. 概述
錯誤碼映射外掛程式用於將後端應答中返回的非正常請求,映射為用戶端期望的錯誤應答的情境。
2. 快速開始
請先參考下面的例子,某後端的返回中,HTTP應答碼為200, 但錯誤資訊包含在包體中JSON欄位中。
HTTP 200 OK
Content-Type:application/json
{"req_msg_id":"d02afa56394f4588832bed46614e1772","result_code":"ROLE_NOT_EXISTS"}
在這個情境中,用戶端期望得到非200的應答,但希望通過不修改後端的方式實現
HTTP 404
X-Ca-Error-Message: Role Not Exists, ResultId=d02afa56394f4588832bed46614e1772
針對描述的中的情境,我們可以按照如下的方式配置錯誤碼映射外掛程式
---
# 參與映射的欄位
parameters:
statusCode: "StatusCode"
resultCode: "BodyJsonField:$.result_code"
resultId: "BodyJsonField:$.req_msg_id"
# 映射條件
errorCondition: "$statusCode = 200 and $resultCode <> 'OK'"
# 錯誤碼欄位
errorCode: "resultCode"
# 映射項
mappings:
- code: "ROLE_NOT_EXISTS"
statusCode: 404
errorMessage: "Role Not Exists, RequestId=${resultId}"
- code: "INVALID_PARAMETER"
statusCode: 400
errorMessage: "Invalid Parameter, RequestId=${resultId}"
# 預設映射(可選)
defaultMapping:
statusCode: 500
errorMessage: "Unknown Error, ${resultCode}, RequestId=${resultId}"
在這個例子中,我們將後端應答碼以及後端應答JSON包體中的result_code
欄位設定為了應答條件,如果後端應答碼為200,但result_code
欄位不等於'OK'
時,開始執行錯誤碼映射,這個例子中,我們使用result_code
作為錯誤碼欄位執行映射,配置了兩個錯誤碼:當ROLE_NOT_EXISTS
會返回給用戶端404應答,而INVALID_PARAMETER
會返回給用戶端400應答,其他錯誤碼返回500應答。
3. 外掛程式配置與映射規則
3.1. 外掛程式配置
錯誤映射外掛程式配置使用json
或yaml
格式配置,各個欄位的詳細說明如下:
parameters(
必選): 下面配置參與映射的欄位,以map
方式配置,參考文檔參數與條件運算式的使用errorCondition(
必選): 應答是否屬於錯誤應答的條件運算式,當執行結果為true
時,執行映射errorCode(
可選): 用於指定錯誤碼
欄位,用於匹配mappings
映射列表中的code
欄位mappings(
必選): 用於指定映射記錄
列表,網關將會用符合錯誤碼
或錯誤條件
記錄重新構造返回應答,詳細欄位為code(
可選): 唯一,設定這個欄位是codeParameter
欄位為必選,當錯誤碼
與code
欄位一致時,執行當前映射記錄
condition(
可選): 錯誤條件運算式,當運算式演算為true
時,執行當前映射記錄
statusCode(
必選): 用於指定當前映射記錄
的HTTP返回碼errorMessage(
可選): 用於指定當前映射記錄
的錯誤資訊,體現在應答的X-Ca-Error-Message
頭及日誌的errorMessage
欄位中responseHeaders(
可選): 以Map方式配置,用於設定當前映射記錄
的應答頭responseBody(
可選): 用於覆寫當前映射記錄
的應答包體
defaultMapping(
可選): 預設映射記錄
,如果mappings
中的所有記錄均未命中,則使用本條記錄作為應答statusCode(
必選): 用於指定當前映射記錄
的HTTP返回碼errorMessage(
可選): 用於指定當前映射記錄
的錯誤資訊,體現在應答的X-Ca-Error-Message
頭及日誌的errorMessage
欄位中responseHeaders(
可選): 以Map方式配置,用於設定當前映射記錄
的應答頭responseBody(
可選): 用於覆寫當前映射記錄
的應答包體
配置規則:
mappingCondition
,mappings[].condition
中的條件運算式使用的參數,與parameters
欄位中定義的欄位必須對應,否則會報錯,關於參數定義與條件運算式,參考參數與條件運算式的使用文檔errorCode
欄位中使用的參數必須為parameters
中定義的欄位mappings
列表記錄中的code
與condition
必須配置其中的一個,當配置code
時值必須唯一,當配置condition
時,將按照配置順序執行,越靠前的優先順序越高errorMessage
,responseBody
可以使用類似"${Code}: ${Message}"
的格式對訊息進行模板替換,欄位取值來自parameters
中提取到的值responseHeaders
的值,也可以使用${Message}
的方式執行模板替換responseBody
不配置時,透傳後端應答responseHeaders
不配置時,透傳後端應答的Headers, 否則使用配置索引值對覆蓋後端應答的Header,當值配置為''
時,刪除對應的HeaderdefaultMapping
沒有配置時,錯誤碼映射不生效,透傳後端應答
3.2. 映射參數
映射參數可通過如下的方式在parameters
參數中配置為索引值對,其中鍵作為變數名定義,值可以使用Location:Name
的方式配置,表示從當前應答或系統內容相關的特定位置中讀取。
---
# 參與映射的欄位
parameters:
statusCode: "StatusCode"
resultCode: "BodyJsonField:$.result_code"
resultId: "BodyJsonField:$.req_msg_id"
錯誤碼映射目前支援以下位置的參數,具體參數描述請參考參數與條件運算式的使用文檔。
位置名稱 | 適用範圍 | 說明 |
StatusCode | 應答 | 後端的HTTP應答碼,如: |
ErrorCode | 應答 | API Gateway系統錯誤碼 |
ErrorMessage | 應答 | API Gateway系統錯誤訊息 |
Header | 應答 | 使用 |
BodyJsonField | 應答* | 使用 |
System | 應答 | 使用 |
Token | 應答 | 當處於 |
ErrorCode
和ErrorMessage
會返回API Gateway的系統錯誤碼與系統錯誤資訊,請參考錯誤碼表文檔。使用
BodyJsonField
可以使用JSONPath來提取後端返回JSON的值,但如果後端應答的包體大小超過15360 Bytes則這個欄位將會無法提取到值,得到的是空值null
3.3. 執行規則
錯誤碼映射外掛程式會按照如下的順序執行:
根據
parameters
中配置的參數列表,從應答及系統上下文中擷取當前的參數表
依據
步驟1
得到的參數表,執行errorCondition
中配置的條件運算式,為true
則繼續執行,false
不生效
如果配置了
errorCode
欄位,則擷取errorCode
欄位的值,並尋找與mappings
中code
匹配的映射記錄
,
如果步驟3沒有匹配到
映射記錄
,則依次執行mappings
欄位配置了condition
的映射記錄
如果步驟3或4中匹配到了
映射記錄
,根據對應的配置構造應答,否則構造預設應答
3.4. 系統錯誤的映射及日誌
API Gateway系統錯誤碼出現在網關的檢查、校正、流控、外掛程式處理等場合,參考錯誤碼表文檔,使用
ErrorCode
作為映射參數,可以支援對系統錯誤碼的映射,可用於諸如:用戶端僅支援200應答,但希望將被限流的429應答映射為200應答的情境。當出現系統錯誤時,位置為
StatusCode
,Header
,BodyJsonField
等來自應答的欄位取值都將為null
,在寫條件運算式時需要注意,未出現系統錯誤時ErrorCode
位置的取值為OK
。API Gateway的系統錯誤碼會出現在
X-Ca-Error-Code
應答頭及日誌的errorCode
欄位中,這個值不會被錯誤碼映射外掛程式
改寫。日誌中的
statusCode
欄位記錄的是網關遞送給用戶端的應答碼的值,會被錯誤碼映射外掛程式
改寫。
4. 配置樣本
4.1. 映射包體錯誤碼
映射
---
# 參與映射的欄位
parameters:
statusCode: "StatusCode"
resultCode: "BodyJsonField:$.result_code"
resultId: "BodyJsonField:$.req_msg_id"
# 映射條件
errorCondition: "$statusCode = 200 and $resultCode <> 'OK'"
# 錯誤碼欄位
errorCode: "resultCode"
# 映射項
mappings:
- code: "ROLE_NOT_EXISTS"
statusCode: 404
errorMessage: "Role Not Exists, RequestId=${resultId}"
- code: "INVALID_PARAMETER"
statusCode: 400
errorMessage: "Invalid Parameter, RequestId=${resultId}"
# 預設映射(可選)
defaultMapping:
statusCode: 500
errorMessage: "Unknown Error, ${resultCode}, RequestId=${resultId}"
4.2 應答body映射
#
# 這個例子用於給前端返回定製的json錯誤body
---
# 指定映射參數
parameters:
statusCode: "StatusCode"
resultCode: "Header:X-Ca-Error-Code"
requestId: "Header:X-Ca-Request-Id"
errorMessage: "Header:X-Ca-Error-Message"
# 映射條件
errorCondition: "$statusCode != 200"
# 錯誤碼欄位
errorCode: "resultCode"
# 映射項
mappings:
- code: "I400MH"
statusCode: 200
responseHeaders:
Content-Type: "application/xml"
X-Ca-Error-Message: ""
X-Ca-Error-Code: ""
responseBody: |
{
"code":"89",
"message":"${errorMessage}",
"resultCode":"${resultCode}"
}
5. 使用限制
參數定義個數不超過16個。
單個運算式的字元數不超過512個字元。
BodyJsonField
位置的欄位對應答包體的限制為16380 Bytes, 超過後直接返回空值。外掛程式配置大小限制為50KB。
mappings
中以condition
方式配置映射記錄
不超過20條。