“试用此 API”面板出现未知错误

您正在查看的是 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 公有云用户

原因:未处理的政策错误

诊断

  1. 验证是否仅在预期非 2XX 响应时才出现此问题。
  2. 对于失败的请求,请验证代理流程中是否有政策。
  3. 跟踪请求,并检查设置了 continueOnError="false" 的政策是否失败并引发故障。
    1. 如果是,请验证错误响应流中是否已执行 AssignmentMessage CORS 政策
    2. 如果不能,这便是导致此问题的原因。
      这是因为,当包含元素 continueOnError="false" 的任何政策失败时,请求会进入错误响应流程。如果错误响应流程中没有任何显式故障处理,则系统将发回与政策对应的默认错误响应。此错误响应没有任何 CORS 标头。因此,从集成的开发者门户调用 API 会失败并显示 Unknown error

以下屏幕截图显示了一条示例错误消息和一条成功消息示例。

集成式门户试用此 API 面板和代理 Trace 窗口中的错误消息示例:

示例错误消息,点击可查看大图 错误消息示例

集成门户试用此 API 面板和代理 Trace 窗口中的成功消息示例:

成功消息示例,点击可查看大图 成功消息示例

分辨率

  1. 必须实现 故障规则来处理错误响应,而不是依赖于默认的错误消息。添加带有适当标头的 AssignmentMessage CORS 政策,并在 FaultRule 中调用它。
  2. 有时,为每个故障定义故障规则可能不可行;因此,可以实现默认故障规则以执行 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 有多个值

诊断

  1. 检查 跟踪会话中的 Access-Control-Allow-Origin 标头的值。
  2. Access-Control-Allow-Origin 标头仅允许设置单个值。设置多个值可能会导致 CORS 问题,并且开发者门户无法呈现任何响应。
  3. 如果跟踪记录中 Access-Control-Allow-Origin 标头的值如下所示:
    *,*
    表示目标服务器和 AssignmentMessage CORS 政策都设置了该参数的值。
  4. 如果用户在政策中针对 Access-Control-Allow-Origin 使用了 <Add> element,或者后端本身设置了多个值,则可能会发生这种情况。

等于 *,*Access-Control-Allow-Origin 示例:

使用了多个值的示例,点击可查看大图 使用了多个值的示例

等于 *Access-Control-Allow-Origin 示例:

使用单个值的示例,点击可查看大图 使用的单个值示例

使用 <Add> 的示例:

使用“添加”的示例,点击可查看大图 使用 Add 的示例

使用 <Set> 的示例:

使用“设置”的示例,点击可查看大图 使用 Set 的示例

分辨率

  1. 建议的方法是对 Access-Control-Allow-Origin 使用 <Set> element(而不是 <Add> element),因为仅允许使用单个值。
  2. 或者,仅在一个位置( 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 请求的跟踪文件
  • 来自目标/后端服务器的响应的完整输出以及载荷的大小