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

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

问题

来自集成开发者门户的 API 调用失败,并显示 Unknown Error试用此 API 面板。

错误消息

您可能会看到空响应或 API 的以下错误消息 请求:

Unknown Error
<ph type="x-smartling-placeholder">

开发者工具 >控制台标签页中,您会看到以下内容: 错误:

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.

在 <ph type="x-smartling-placeholder"></ph> 开发者工具 >控制台标签页如下所示:

一般错误消息,点击可放大图片 一般错误消息

可能的原因

原因 说明 适用的问题排查说明
未处理的政策错误 如果 API 请求的运行时流程中的任何政策失败,则发送不带 CORS 标头的默认错误响应。 Edge 公有云用户
Access-Control-Allow-Origin 的多个值 使用“添加”,而不是“指定邮件策略”中的“设置”。 Edge 公有云用户

原因:未处理的政策错误

<ph type="x-smartling-placeholder">

诊断

<ph type="x-smartling-placeholder">
  1. 验证并确保仅在预期返回非 2XX 响应时才会出现此问题。
  2. 对于失败的请求,请验证代理流中是否存在政策。
  3. <ph type="x-smartling-placeholder"></ph> 跟踪请求并检查 continueOnError="false" 失败并引发错误。
    1. 如果是,请验证 <ph type="x-smartling-placeholder"></ph> AssignMessage CORS 政策执行或不在错误中 响应流程。
    2. 如果不是,那么这就是导致此问题的原因。
      这是因为当 包含该元素的任何政策 continueOnError="false" 失败,则请求会进入 错误响应流程。如果 错误响应流程,则默认错误响应与 将发回给政策此错误响应不含任何 CORS 标头。因此,来自集成开发者的 API 调用 出现 Unknown error 错误。

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

集成式门户试用此 API 面板中的错误消息示例 在代理 Trace 窗口中执行以下操作:

错误消息示例,点击可放大图片 错误消息示例

集成式门户试用此 API 面板中的成功消息示例 在代理 Trace 窗口中执行以下操作:

成功消息示例,点击可放大图片 成功消息示例

分辨率

  1. 与使用默认的错误消息不同, <ph type="x-smartling-placeholder"></ph> 必须实施故障规则来处理错误响应。 加入 分配具有适当标头的 AssignMessage CORS 政策并调用它 在 FaultRule 中。
  2. 有时,可能没法为每个实例定义一个故障规则 错误;因此可以实施默认故障规则 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 有多个值

诊断

  1. 检查 Access-Control-Allow-Origin 标头的值, <ph type="x-smartling-placeholder"></ph> 跟踪会话
  2. Access-Control-Allow-Origin 标头仅允许单个值 设置。设置多个值可能会导致 CORS 问题,并且 开发者门户将无法显示任何响应。
  3. 如果跟踪记录中 Access-Control-Allow-Origin 标头的值 如下所示:
    *,*
    这表示目标服务器和 AssignMessage CORS 政策设置其值。
  4. 如果用户使用了 <Add> element(针对 Access-Control-Allow-Origin) 政策,或者后端本身设置了多个值。

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

使用多个值的示例,点击可放大图片 使用多个值的示例

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

使用的单个值示例,点击可放大图片 使用的单个值示例

使用 <Add> 的示例:

使用 Add 的示例,点击即可放大图片 使用 Add 的示例

使用 <Set> 的示例:

使用 Set 的示例,点击即可放大图片 使用 Set 的示例

分辨率

  1. 建议使用 <Set> element(而非 <Add> element) 作为 Access-Control-Allow-Origin 只允许使用一个值。
  2. 或者,仅在以下位置设置 Access-Control-Allow-Origin 标头 一个位置;不是 <ph type="x-smartling-placeholder"></ph> 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 请求的跟踪文件
  • 目标/后端服务器响应的完整输出以及 负载的大小