您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
整合式開發人員入口網站的 API 呼叫失敗,且「Try this API」面板中顯示 Unknown Error 或空白回覆。
錯誤訊息
在 integrated portal 中,您可能會看到空白回應,或是 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.
在「開發人員工具」>「控制台」分頁中看到的通用錯誤訊息如下:
可能原因
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
|---|---|---|
| 未處理的政策錯誤 | 如果 API 要求在執行階段流程中發生任何政策失敗情形,系統會傳送不含 CORS 標頭的預設錯誤回應。 | Edge Public Cloud 使用者 |
| Access-Control-Allow-Origin 的多個值 | 在指派訊息政策中使用「新增」而非「設定」。 | Edge Public Cloud 使用者 |
原因:未處理的政策錯誤
診斷
- 確認只有在預期會收到非
2XX回應時,才會發生問題。 - 如果要求失敗,請確認 Proxy 流程中是否有政策。
-
追蹤要求,並檢查是否有政策
continueOnError="false"失敗並引發錯誤。 - 如果是,請確認錯誤回應流程中是否執行了 AssignMessage CORS 政策。
- 如果沒有,這就是問題的原因。
這是因為當含有continueOnError="false"元素的任何政策失敗時,要求就會進入錯誤回應流程。如果錯誤回應流程中沒有任何明確的錯誤處理機制,系統就會傳回對應政策的預設錯誤回應。這個錯誤回應沒有任何 CORS 標頭。因此,整合式開發人員入口網站的 API 呼叫會失敗,並顯示Unknown error。
以下螢幕截圖顯示錯誤訊息和成功訊息的範例。
整合式入口網站「Try this API」(試用這個 API) 面板和 Proxy「Trace」(追蹤) 視窗中的錯誤訊息範例:
整合式入口網站「Try this API」(試用這個 API) 面板和 Proxy「Trace」(追蹤) 視窗中的成功訊息範例:
解析度
- 您必須實作 錯誤規則來處理錯誤回應,而不是依賴預設錯誤訊息。加入含有適當標頭的 AssignMessage CORS 政策,並在 FaultRule 中叫用該政策。
- 有時可能無法為每個錯誤定義錯誤規則,因此可以實作預設錯誤規則,執行 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 政策都在設定值。 - 如果使用者在政策中對「Access-Control-Allow-Origin」使用
<Add> element,或後端本身設定多個值,就可能發生這種情況。Access-Control-Allow-Origin
Access-Control-Allow-Origin 等於 *,* 的範例:
Access-Control-Allow-Origin 等於 * 的範例:
使用 <Add> 的範例:
使用 <Set> 的範例:
解析度
- 建議使用
<Set> element(而非<Add> element) 做為 Access-Control-Allow-Origin,因為只允許單一值。 - 或者,您也可以只在一個地方設定 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 要求的追蹤記錄檔
- 目標/後端伺服器的完整回應輸出內容,以及酬載大小