查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到 HTTP 狀態碼 500 Internal Server Error
,
錯誤代碼 protocol.http.EmptyPath
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 500 Internal Server Error
此外,您也可能會看到下列錯誤訊息:
{ "fault":{ "faultstring":"Request path cannot be empty", "detail":{ "errorcode":"protocol.http.EmptyPath" } } }
可能原因
如果後端伺服器的要求網址以流程變數表示,就會發生這個錯誤
target.url
,包含空白路徑。
根據規格 RFC 3986,第 3 節:語法元件和 RFC 3986,第 3.3 節:路徑:
URI 語法 包含下列元件:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
path
元件為「必要」元件,必須一律包含正斜線 (/
),即使路徑中沒有任何其他字元。
因此,如果後端伺服器的要求網址沒有 path
元件中,此元件甚至沒有正斜線 (/
),而 Apigee
Edge 會以 500 Internal Server Error
和錯誤代碼回應
protocol.http.EmptyPath
。
例如:如果 target.url
的值包含
https://www.mocktarget.apigee.net
,則發生這項錯誤,是因為
path
元件空白或遺失。
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
後端伺服器網址 (target.url) 含有空白路徑 | 以流程變數 target.url 表示的後端伺服器網址包含空白路徑。 |
邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
API Monitoring
程序 #1:使用 API 監控功能
如何使用 API Monitoring 診斷錯誤:
- 以使用者身分登入 Apigee Edge UI 適當角色。
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
protocol.http.EmptyPath
的儲存格,如下所示:錯誤程式碼
protocol.http.EmptyPath
的相關資訊顯示為 如下所示:按一下「查看記錄」 即可展開失敗要求的資料列。
- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
500
- 錯誤來源:
target
- 錯誤代碼:
protocol.http.EmptyPath
- 狀態碼:
- 如果「Fault Source」為
target
,且「Fault Code」是protocol.http.EmptyPath
,表示後端伺服器網址具有 空白路徑。
Trace
程序 2:使用追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段,並
- 等待
500 Internal Server Error
錯誤發生,或 - 如果可以重現問題,請發出 API 呼叫以重現問題
500 Internal Server Error
- 等待
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗的部分。
錯誤通常會在目標要求流程啟動後的流程中找到 階段,如下所示:
記下追蹤記錄中的錯誤值。
錯誤:要求路徑不得留空
由於這個錯誤是由 Apigee Edge 在「目標要求流程已開始」階段後發出, 表示後端伺服器網址中的
path
為「空白」。這會導致 最有可能發生的原因,是流量變數target.url
(代表 後端伺服器) 的要求,可能已透過 或要求流程- 檢查從 「已啟動目標要求流程」階段的錯誤點。
決定要更新流程變數
target.url
的政策。顯示 JavaScript 政策已更新資料流變數
target.url
的追蹤記錄範例:在上方顯示的追蹤記錄範例中,記下流程變數變數的值 「
target.url
」已更新至名為 SetTargetURL 的 JavaScript 政策,如下所示: 如下:target.url : https://mocktarget.apigee.net
- 請注意,
target.url
包含下列元件:- 配置:
https://mocktarget.apigee.net
- path:空白
- 配置:
- 因此,您會收到
Request path cannot be empty
錯誤。 - 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
向下捲動至「Phase Details」(階段詳細資料) -「Error Headers」(錯誤標頭) 部分,並找出 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
- 您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.EmptyPath
和target
分別採用,表示 這項錯誤是因為後端伺服器網址的路徑空白。回應標頭 值 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
程序 #3:使用 NGINX 存取記錄
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以透過 NGINX 存取記錄檔判斷
取得 HTTP
500 Internal Server Error
的重要資訊 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜尋是否有任何
500
錯誤和錯誤代碼 在特定期間內的protocol.http.EmptyPath
(如果問題是在 ) 或500
仍有任何要求失敗的情況。 如果在 X-Apigee-fault-code 比對中發現任何
500
錯誤protocol.http.EmptyPath
的值,然後判斷 X-Apigee-fault-source.NGINX 存取記錄中的 500 錯誤示例:
上述 NGINX 存取記錄的範例項目包含下列 X- Apigee-fault-code 和 X-Apigee-fault-source:
標頭 值 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
請注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值為
protocol.http.EmptyPath
和target
分別採用,表示 這項錯誤是因為後端伺服器網址包含空白路徑。
原因:後端伺服器網址 (target.url) 包含空白路徑
診斷
- 使用 API 監控、追蹤工具或 NGINX 存取記錄檔,判斷
500 Internal Server Error
的「錯誤程式碼」和「錯誤來源」,詳情請參閱: 常見的診斷步驟。 - 如果「Fault Code」為
protocol.http.EmptyPath
,且「Fault Source」出現 值為target
,就表示後端伺服器網址含有 空白 路徑。 在 Apigee 中,後端伺服器網址會以流程變數
target.url
表示 邊緣這類錯誤通常會發生在嘗試更新後端伺服器網址時target.url
動態使用任一政策 (在 Proxy/共用流程),因此含有「空白路徑」。- 判斷資料流變數
target.url
確實包含空白路徑, 請採取下列任一步驟,以此方式擷取該值:Trace
使用追蹤工具
如果您擷取了這個錯誤的追蹤記錄,請按照 使用追蹤工具 和:
- 確認
target.url
的路徑為空白。 如果是的話,請查看哪些政策已修改或更新
target.url
:包含空白路徑。範例追蹤記錄,顯示 JavaScript 政策已更新流程變數
target.url:
- 在上方的追蹤記錄範例中,請注意 JavaScript 政策已修改或
更新了
target.url
的值,加入空白路徑。 - 請注意,
target.url
包含下列元件:- 配置:
https://mocktarget.apigee.net
- path:空白
- 配置:
記錄
使用記錄檔伺服器中的記錄檔
- 如果沒有這個錯誤的追蹤記錄 (間歇性問題),請檢查
查看您是否記錄了流量變數值的相關資訊
target.url
,使用以下政策: MessageLogging 或 傳送至記錄伺服器的服務呼叫。 - 如有記錄檔,請查看記錄檔並:
- 驗證
target.url
是否包含空白路徑,並且 - 看看是否可以判斷修改的政策「
target.url
」 必須包含空白路徑
- 驗證
API Proxy
檢查失敗的 API Proxy
如果沒有這項錯誤的追蹤記錄或記錄檔,請查看失敗的 API 透過 Proxy 判斷哪些內容經過修改或更新流程變數
target.url
包含無效的路徑。請檢查下列事項:- API Proxy 中的政策
- 從 Proxy 叫用的任何共用流程
- 確認
檢查會修改或回應的特定政策 (例如 AssignMessage 或 JavaScript) 謹慎更新流程變數
target.url
,並判斷更新的原因target.url
表示路徑為空白。以下是更新資料流變數
target.url
的幾個政策範例 未包含空白路徑,就會引發這個錯誤。範例 #1
範例 1:更新
target.url
變數的 JavaScript 政策var url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
請注意,在上述範例中,資料流變數
target.url
已更新 包含https://mocktarget.apigee.net
值,包含在另一個變數中url
。請注意,
target.url
包含下列元件:- 配置:
https://mocktarget.apigee.net
- path:空白
由於路徑沒有任何內容,因此 Apigee Edge 會傳回
500 Internal Server Error
錯誤代碼protocol.http.EmptyPath
。範例 #2
範例 #2:更新
target.url
變數的 JavaScript 政策var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
在上述範例中,請注意,資料流變數
target.url
已由 將變數中的值https://mocktarget.apigee.net
串連起來url
和 另一個變數path
的值,且 值擷取自request.header.Path.
如果您可以存取實際要求或追蹤記錄,就能驗證實際值 已傳遞至
request.header.Path
。使用者提出要求的範例:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
在這個例子中,標頭路徑不會做為要求的一部分傳送。因此,值 JavaScript 政策中的變數路徑為
null
。舉例來說:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + null
target.url = https://mocktarget.apigee.netnull
請注意,
target.url
包含下列元件:- 配置:
https://mocktarget.apigee.netnull
- path:空白
範例 #3
範例 #3:AssignMessage Policy 透過更新
target.url
變數 其他變數<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
請注意,
target.url
包含下列元件:- 配置:
https://mocktarget.apigee.net
- path:空白
在上述所有範例中,後端伺服器網址的路徑:
target.url
為空白,所以 Apigee Edge 會傳回500 Internal Server Error
傳回錯誤代碼protocol.http.EmptyPath
。- 配置:
解決方法
根據規格
RFC 3986,第 2 節:語法元件,path
元件為
必要,且一律「必須」使用正斜線 (/),即使沒有
path
中還有其他字元。請執行下列步驟,
修正這個問題:
- 確保後端伺服器網址以流程變數表示
target.url
一律具有非空白路徑。- 在某些情況下,路徑中可能沒有資源名稱,接著請確保路徑
至少使用正斜線 (
/
)。 - 如果您使用任何其他變數來決定流量變數的值
target.url
,然後確保其他變數沒有空白的路徑。 - 如果您執行任何字串運算以判定流程變數的值
target.url
,然後確認字串的結果或結果 作業路徑不會空白
- 在某些情況下,路徑中可能沒有資源名稱,接著請確保路徑
至少使用正斜線 (
- 在「診斷」一文所述的範例中,您可以將這個問題修正為
說明如下:
範例 #1
範例 1:更新
target.url
變數的 JavaScript 政策為變數
url
加入正斜線 (/
) 即可修正這個問題 問題,如下所示:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
範例 #2
範例 #2:更新
target.url
變數的 JavaScript 政策var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
請務必傳送有效的路徑,例如
/iloveapis
要求標頭Path
以修正這個問題,如下所示:要求範例:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
範例 #3
範例 #3:透過 AssignMessage 政策更新
target.url
變數 其他變數請在 AssignMessage 政策的
<Value>
元素中新增有效的路徑。適用對象 例如,您可以將/json
做為 MockTarget API。 也就是將<Value>
元素修改為https://mocktarget.apigee.net/json
,如下所示:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
規格
Apigee Edge 會根據要求,後端伺服器網址 沒有空白路徑。 下列規格:
規格 |
---|
RFC 3986,第 3 節:語法元件 |
RFC 3986,第 3.3 節:路徑 |
如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊。
必須收集診斷資訊
如果按照上述說明操作後仍無法解決問題,請收集下列資訊 ,然後與 Apigee Edge 支援團隊聯絡。
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl
指令,用於重現500 Internal Server Error
及錯誤代碼protocol.http.EmptyPath
- API 要求的追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 偵測到失敗要求的完整錯誤訊息
- 環境名稱
- API Proxy 組合
- API 要求的追蹤檔
NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 訊息處理器系統記錄:
/opt/apigee/var/log/edge-message- processor/logs/system.log