Resolução de problemas de erros de implementação da política de mensagens

Está a ver a documentação do Apigee e do Apigee Hybrid.
Ver documentação do Apigee Edge.

InvalidIndex

Mensagem de erro

A implementação do proxy de API através da IU ou da API Apigee falha com esta mensagem de erro:

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]

Mensagem de erro de exemplo

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

Captura de ecrã de exemplo

Erro na implementação para o teste do ambiente.

Causa

Se o índice especificado nos elementos <Copy> e/ou <Remove> da política Assign Message for 0 ou um número negativo, a implementação do proxy de API falha.

Por exemplo, se transmitir vários parâmetros de consulta com o mesmo nome, pode aceder aos mesmos como variáveis de fluxo indexadas. Suponhamos que quer transmitir os IDs de 3 alunos como parâmetros de consulta. Pode fazê-lo da seguinte forma:

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

Em seguida, suponhamos que tenta aceder a estes parâmetros de consulta com os números de índice 0, 1 e 2 na política Assign Message da seguinte forma:

id.0
id.1 and
id.2

Neste caso, a implementação do proxy falha porque o índice tem de começar por 1. Isto significa que pode aceder ao primeiro parâmetro de consulta "id=1" como "id.1". Para aceder ao segundo parâmetro de consulta "id=2", tem de usar o índice 2, ou seja, "id.2". Da mesma forma, para aceder ao terceiro parâmetro de consulta "id=3", pode usar "id.3".

Para mais informações, consulte a documentação do elemento de cópia da política AssignMessage.

Diagnóstico

  1. Identifique a política Assign Message onde ocorreu o erro, o nome do atributo e o índice inválido. Pode encontrar todos estes itens na mensagem de erro. Por exemplo, no erro seguinte, o nome da política é GeneratingGeocodingRequest, o nome do atributo é id e o índice é 0:

    AssignMessage[GenerateStudentsRequest]: index must be greater than zero in id.0
    
  2. Verifique se o nome do atributo e o índice usados no XML da política de atribuição de mensagens com falha correspondem ao nome do atributo e ao índice identificados na mensagem de erro (passo n.º 1 acima). Por exemplo, a política seguinte especifica o atributo id e o índice como 0, o que corresponde ao que está na mensagem de erro:

    <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. Se o índice especificado for 0 ou um número negativo, essa é a causa do erro.

    No exemplo da política Assign Message apresentado acima, está a tentar aceder ao primeiro valor do parâmetro de consulta "id" através do índice 0. Por isso, a implementação do proxy de API falha com o erro:

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

Resolução

Em Assign Message, quando acede a vários cabeçalhos, parâmetros de consulta ou outros parâmetros que partilham o mesmo nome, certifique-se de que o índice é sempre superior a zero. Por exemplo:

<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>

InvalidVariableName

Mensagem de erro

A implementação do proxy de API através da IU ou da API Apigee falha com esta mensagem de erro:

Error Saving Revision [revision_number]
The revision is deployed, but traffic cannot flow. AssignMessage schema validation failed: invalid variable name - null - in assign variable.

Mensagem de erro de exemplo

Error Saving Revision 3
AssignMessage schema validation failed: invalid variable name - null - in assign variable.

Captura de ecrã de exemplo

Ocorreu um erro ao guardar a revisão 3.

Causa

Se o elemento secundário <Name> estiver vazio ou não for especificado no elemento <AssignVariable>, a implementação do proxy de API falha porque não existe um nome de variável válido ao qual atribuir um valor. É necessário um nome de variável válido.

Diagnóstico

Examine todas as políticas Assign Message no proxy de API específico onde ocorreu a falha. Se existir alguma política de atribuição de mensagens em que o elemento secundário <Name> esteja vazio ou não especificado no elemento <AssignVariable>, essa é a causa do erro.

Exemplo 1: a seguinte política Assign Message não tem nenhum elemento <Name> definido.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

Exemplo 2: a seguinte política Assign Message tem um elemento <Name> vazio .

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name></Name>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

Resolução

Certifique-se de que o elemento subordinado <Name> é sempre especificado e não está vazio no elemento <AssignVariable> da política de atribuição de mensagens. Por exemplo:

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
        <AssignVariable>
        <Name>appSecret</Name>
        <Value>abcd1234</Value>
    </AssignVariable>
    <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>