您正在查看 Apigee Edge 文档。
前往 Apigee X 文档。 信息
问题
集成式开发者门户中的 API 调用失败,并在试用此 API 面板中显示 Unknown Error 或空响应。
错误消息
在集成门户中,您可能会看到 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响应时发生。 - 对于失败的请求,请验证代理流中是否存在政策。
-
跟踪请求,并检查是否具有
continueOnError="false"的政策失败并引发故障。 - 如果存在,请验证 AssignMessage CORS 政策是否在错误响应流程中执行。
- 如果不是,则这是导致此问题的原因。
这是因为,当任何包含continueOnError="false"元素的政策失败时,请求都会进入错误响应流程。如果错误响应流程中没有任何显式故障处理,则会返回与政策对应的默认错误响应。此错误响应不包含任何 CORS 标头。因此,集成式开发者门户的 API 调用失败并显示Unknown error。
以下屏幕截图显示了示例错误消息和示例成功消息。
集成门户中的试用此 API 面板和代理轨迹窗口中的示例错误消息:
集成式门户网站的试用此 API 面板和代理的轨迹窗口中的成功消息示例:
分辨率
- 必须实现 故障规则来处理错误响应,而不是依赖默认错误消息。 添加包含相应标头的 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 等于 * 的示例:
使用 <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 代理名称
- 用于重现错误的完整 curl 命令
- API 请求的轨迹文件
- 来自目标/后端服务器的响应的完整输出,以及载荷的大小