您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
整合式開發人員入口網站的 API 呼叫失敗,並顯示 Unknown Error
,或在「Try this API」(試用這個 API) 面板中沒有任何回應。
錯誤訊息
您可能會在整合式入口網站中,看到空白回應或下列 API 要求錯誤訊息:
Unknown Error
在「開發人員工具」>「控制台」分頁中,系統會顯示下列錯誤:
Access to XMLHTTPRequest at 'API_URL' from origin 'URL_of_Integrated_DevPortal' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
「開發人員工具」>「 Console」分頁中顯示的一般錯誤訊息如下:
可能原因
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
未處理的政策錯誤 | 當 API 要求的執行階段流程中有任何政策失敗時,系統會傳送預設的錯誤回應,但不會傳送 CORS 標頭。 | Edge 公有雲使用者 |
Access-Control-Allow-Origin 的多個值 | 在「指派郵件政策」中使用「新增」而非「設定」。 | Edge 公有雲使用者 |
原因:未處理的政策錯誤
診斷
- 確認只有在預期出現非
2XX
回應時才會發生問題。 - 如果是失敗的要求,請確認 Proxy 流程中有政策。
-
追蹤要求,並檢查含有
continueOnError="false"
的政策是否失敗,並引發錯誤。 - 如果是,請確認是否已在錯誤回應流程中執行 AssignMessage CORS 政策。
- 如果不是,就是此問題的原因。
這是因為如果含有元素continueOnError="false"
的任何政策失敗,要求就會進入錯誤回應流程。如果錯誤回應流程中沒有任何明確的錯誤處理機制,系統就會傳回與政策相對應的預設錯誤回應。這項錯誤回應沒有任何 CORS 標頭。因此,整合式開發人員入口網站的 API 呼叫會失敗,並顯示Unknown error
。
以下螢幕截圖顯示錯誤訊息範例和成功訊息範例。
整合式入口網站「試用這個 API」面板和 Proxy「Trace」視窗中的錯誤訊息範例:
整合式入口網站的「試用這個 API」面板和 Proxy「Trace」視窗中的成功訊息範例:
解析度
- 您必須導入 錯誤規則來處理錯誤回應,而不是採用預設的錯誤訊息。使用合適的標頭加入 AssignMessage CORS 政策,並在 FultRule 中叫用該政策。
- 您有時可能無法為每項錯誤定義錯誤規則;因此,可以導入預設錯誤規則來執行 AssignMessage CORS 政策:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ProxyEndpoint name="proxy-endpoint-name"> <Description/> <!-- Add a default fault rule to add CORS --> <DefaultFaultRule name="fault-rule"> <Step> <Name>add-cors</Name> </Step> </DefaultFaultRule> <FaultRules/> <!-- <Flows /> Rest of the proxy definition --> </ProxyEndpoint>
原因:Access-Control-Allow-Origin 的多個值
診斷
- 檢查 追蹤記錄工作階段中 Access-Control-Allow-Origin 標頭的值。
- Access-Control-Allow-Origin 標頭僅允許設定一個值。設定多個值可能會導致 CORS 問題,而開發人員入口網站將無法顯示任何回應。
- 如果追蹤記錄中的 Access-Control-Allow-Origin 標頭值如下所示:
*,*
,表示目標伺服器和 AssignMessage CORS 政策都會設定其值。 - 當使用者將
<Add> element
用於政策中的 Access-Control-Allow-Origin,或後端本身設定多個值時,就可能發生這種情況。
範例 Access-Control-Allow-Origin 等於 *,*
:
範例 Access-Control-Allow-Origin 等於 *
:
使用 <Add>
的範例:
使用 <Set>
的範例:
解析度
- 建議您針對 Access-Control-Allow-Origin 使用
<Set> element
(而非<Add> element
),因為僅允許單一值。 - 或者,您也可以只在一個位置設定 Access-Control-Allow-Origin 標頭,也就是 AssignMessage CORS 政策或目標伺服器。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AssignMessage async="false" continueOnError="false" enabled="true" name="set-cors"> <DisplayName>Set CORS</DisplayName> <FaultRules/> <Properties/> <Set> <Headers> <Header name="Access-Control-Allow-Origin">*</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
如果您仍需獲得 Apigee 支援團隊的協助,請參閱「必須收集診斷資訊」一文。
必須收集診斷資訊
收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
- 機構組織名稱
- 環境名稱
- API Proxy 名稱
- 請完成用來重現錯誤的 curl 指令
- API 要求的追蹤檔
- 目標/後端伺服器的回應完整輸出內容,以及酬載大小