HTTPModifier 政策部署错误问题排查

您正在查看 Apigee X 文档。
查看 Apigee Edge 文档。

InvalidIndex

错误消息

通过 Apigee 界面或 API 部署 API 代理失败并显示以下错误消息:

Error in deployment for environment [environment]
The revision is deployed, but traffic cannot flow.
AssignMessage[policy_name]: index must be greater than zero in [attribute].[index]

错误消息示例

Error in deployment for environment test.
The revision is deployed, but traffic cannot flow.
HTTPModifier[GenerateStudentsRequest]: index must be greater than zero in id.0

原因

如果 HTTPModifier 政策的 <Copy> 和/或 <Remove> 元素中指定的索引为 0 或负数,则 API 代理的部署将失败。

例如,如果您传递多个同名的查询参数,则可以将它们作为索引流变量进行访问。假设您想将 3 名学生的 ID 作为查询参数进行传递,则可以按如下方式执行此操作:

https://$EXTERNAL_IP/$PROXY_BASEPATH?school_name=NPS&id=1&id=2&id=3

然后,假设您尝试按如下方式通过 HTTPModifier 政策中的索引编号 0、1 和 2 访问这些查询参数:

id.0
id.1 and
id.2

在这种情况下,代理的部署将失败,因为索引必须以 1 开头。这意味着,您可以将第一个查询参数“id=1”作为“id.1”进行访问。如需访问第二个查询参数“id=2”,您需要使用索引 2,即“id.2”。同样,如需访问第三个查询参数“id=3”,您可以使用“id.3”。

如需了解详情,请参阅 AssignMessage 政策副本元素文档

诊断

  1. 标识发生错误的 HTTPModifier 政策、属性名称和无效的索引。您可以在错误消息中找到这些项。例如,在以下错误中,政策名称为 GeneratingGeocodingRequest,属性名称为 id,索引为 0

    HTTPModifier[GenerateStudentsRequest]: index must be greater than zero in id.0
    
  2. 验证失败的 HTTPModifier 政策 XML 中使用的属性名称和索引是否与错误消息中标识的属性名称和索引匹配(上述第 1 步)。例如,以下政策将属性 id 和索引指定为 0,它与错误消息中的内容匹配:

    <AssignMessage name="GenerateStudentsRequest">
      <AssignTo createNew="true" type="request">StudentsInfoRequest</AssignTo>
      <Copy source="request">
          <QueryParams>
              <QueryParam name="school_name"/>
              <QueryParam name="id.0"/>
              <QueryParam name="id.1"/>
              <QueryParam name="id.2"/>
          </QueryParams>
      </Copy>
    </AssignMessage>
  3. 如果指定的索引为 0 或负数,则会导致错误。

    在上面显示的“分配消息”政策示例中,您正在尝试使用索引 0 访问查询参数“id”的第一个值。因此,API 代理的部署失败并显示以下错误:

    AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0
    

解决方法

在 HTTPModifier 中,如果您访问多个标题、查询参数或其他同名的参数,请确保索引始终大于零。例如:

<AssignMessage name="GenerateStudentsRequest">
    <AssignTo createNew="true" type="request">StudentsInfoRequest</AssignTo>
    <Copy source="request">
        <QueryParams>
            <QueryParam name="school_name"/>
            <QueryParam name="id.1"/>
            <QueryParam name="id.2"/>
            <QueryParam name="id.3"/>
        </QueryParams>
    </Copy>
</AssignMessage>