您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
问题
来自集成开发者门户的 API 调用失败并显示 Unknown Error
或试用此 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.
开发者工具 >“控制台”标签页上显示的一般错误消息如下所示:
可能的原因
原因 | 说明 | 适用的问题排查说明 |
---|---|---|
未处理的政策错误 | 如果任何政策在 API 请求的运行时流程中失败,系统便会发送默认错误响应,但不发送 CORS 标头。 | Edge 公有云用户 |
Access-Control-Allow-Origin 的多个值 | 在“分配邮件政策”中使用“添加”而不是“设置”。 | Edge 公有云用户 |
原因:未处理的政策错误
诊断
- 验证是否仅在预期非
2XX
响应时才出现此问题。 - 对于失败的请求,请验证代理流程中是否有政策。
-
跟踪请求,并检查设置了
continueOnError="false"
的政策是否失败并引发故障。 - 如果是,请验证错误响应流中是否已执行 AssignmentMessage CORS 政策。
- 如果不能,这便是导致此问题的原因。
这是因为,当包含元素continueOnError="false"
的任何政策失败时,请求会进入错误响应流程。如果错误响应流程中没有任何显式故障处理,则系统将发回与政策对应的默认错误响应。此错误响应没有任何 CORS 标头。因此,从集成的开发者门户调用 API 会失败并显示Unknown error
。
以下屏幕截图显示了一条示例错误消息和一条成功消息示例。
集成式门户试用此 API 面板和代理 Trace 窗口中的错误消息示例:
集成门户试用此 API 面板和代理 Trace 窗口中的成功消息示例:
分辨率
- 必须实现 故障规则来处理错误响应,而不是依赖于默认的错误消息。添加带有适当标头的 AssignmentMessage CORS 政策,并在 FaultRule 中调用它。
- 有时,为每个故障定义故障规则可能不可行;因此,可以实现默认故障规则以执行 AssignmentMessage 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 标头的值如下所示:
*,*
表示目标服务器和 AssignmentMessage 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
),因为仅允许使用单个值。 - 或者,仅在一个位置( AssignmentMessage CORS 政策或目标服务器)设置 Access-Control-Allow-Origin 标头。
<?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 请求的跟踪文件
- 来自目标/后端服务器的响应的完整输出以及载荷的大小