Rozwiązywanie problemów z błędami w przypadku przypisywania wiadomości

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

UnresolvedVariable

Kod błędu

steps.assignmessage.UnresolvedVariable

Treść odpowiedzi na błąd

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: unable to resolve variable [variable_name]",
        "detail": {
            "errorcode": "steps.assignmessage.UnresolvedVariable"
        }
    }
}

Przyczyna

Ten błąd występuje, jeśli zmienna określona w zasadach przypisywania wiadomości jest:

  • poza zakresem (niedostępne w określonym procesie, w którym są wykonywane zasady) lub
  • nie można rozstrzygnąć (nie jest zdefiniowana)

Ten błąd występuje np. wtedy, gdy w przepływie żądania jest wykonywana zasada przypisywania wiadomości, ale atrybut source w elemencie <Copy> jest ustawiony na zmienną response lub error albo na inną zmienną niestandardową, która nie występuje w przepływie żądania.

Diagnostyka

  1. Określ zasadę przypisywania wiadomości, w której wystąpił błąd, oraz nazwę niedostępnej zmiennej. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi na błąd.

    Na przykład w tym faultstring nazwa zasad to googleBook, a zmienna to var:

    "faultstring": "AssignMessage[googleBook]: unable to resolve variable var"
    
  2. W pliku XML nieudanej zasady Assign Message sprawdź, czy nazwa użytej zmiennej jest zgodna z nazwą zmiennej podaną w ciągu błędu (krok 1 powyżej). Na przykład ta zasada ustawia atrybut źródła w elemencie <Copy> na zmienną o nazwie var, która pasuje do wartości w elemencie faultstring:

    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
       <DisplayName>googleBook</DisplayName>
       <Properties />
       <Copy source="var">
          <Headers>
             <Header name="user-agent" />
          </Headers>
       </Copy>
       <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
       <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
    </AssignMessage>
    
  3. Sprawdź, czy zmienna jest zdefiniowana i dostępna w przepływie, w którym wykonywana jest zasada Assign Message.

  4. Jeśli zmienna ma wartość:

    1. poza zakresem (niedostępne w określonym procesie, w którym są wykonywane zasady) lub
    2. nie można rozstrzygnąć (nie jest zdefiniowana)

    wtedy to jest przyczyną błędu.

    Załóżmy na przykład, że w przepływie żądania jest wykonywana zasada przypisywania wiadomości pokazana powyżej. Sprawdź, czy zmienna var jest zdefiniowana w którychkolwiek zasadach wykonywanych przed zasadami Assign Message w przepływie żądania. Jeśli zmienna nie została zdefiniowana, otrzymasz kod błędu:

    steps.assignmessage.UnresolvedVariable
    

Rozdzielczość

Sprawdź, czy zmienna, do której odwołują się zasady, istnieje i jest dostępna w danym przepływie, w którym wykonywane są zasady Assign Message.

Aby poprawić przykładowe zasady pokazane powyżej, możesz zmodyfikować atrybut źródła w elemencie <Copy>, tak aby był zmienną żądania lub inną zmienną niestandardową typu message, która występuje w procesie żądania.

<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
   <DisplayName>googleBook</DisplayName>
   <Properties />
   <Copy source="request">
      <Headers>
         <Header name="user-agent" />
      </Headers>
   </Copy>
   <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
   <AssignTo createNew="true" transport="http" type="request">googleBookReq</AssignTo>
</AssignMessage>

VariableOfNonMsgType

Kod błędu

steps.assignmessage.VariableOfNonMsgType

Treść odpowiedzi na błąd

{
    "fault": {
        "faultstring": "AssignMessage[policy_name]: value of variable [variable] is not of type Message",
        "detail": {
            "errorcode": "steps.assignmessage.VariableOfNonMsgType"
        }
    }
}

Przyczyna

Ten błąd występuje, jeśli atrybut source w elemencie <Copy> jest ustawiony na zmienną, która nie jest typu message.

Zmienne typu wiadomości reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Edge request, response i message są typu message. Więcej informacji o zmiennych w wiadomościach znajdziesz w dokumentacji zmiennych.

Diagnostyka

  1. Określ zasadę przypisywania wiadomości, w której wystąpił błąd, oraz nazwę zmiennej, której typ jest nieprawidłowy. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi na błąd. Na przykład w tym faultstring nazwa zasad to GenerateGeocodingRequest, a zmienna to PostalCode:

    "faultstring": "AssignMessage[GenerateGeocodingRequest]: value of variable PostalCode is not of type Message"
    
  2. W nieudanym pliku XML zasady przypisywania wiadomości sprawdź, czy nazwa zmiennej ustawionej w elemencie <Copy> jest zgodna z nazwą zmiennej podaną w ciągu znaków błędu (krok 1 powyżej). Na przykład te zasady ustawiają atrybut źródła na zmienną o nazwie PostalCode, która pasuje do wartości w faultstring:

    <AssignMessage name="GenerateGeocodingRequest">
       <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
       <AssignVariable>
          <Name>PostalCode</Name>
          <Ref>request.queryparam.postalcode</Ref>
       </AssignVariable>
       <AssignVariable>
          <Name>Country</Name>
          <Ref>request.queryparam.country</Ref>
       </AssignVariable>
       <Copy source="PostalCode">
          <QueryParams>
             <QueryParam name="q" />
          </QueryParams>
       </Copy>
    </AssignMessage>
    
  3. Sprawdź, czy zmienna jest typu message:

    1. Znajdź w pakiecie serwera proxy interfejsu API kod, w którym zmienna została zdefiniowana po raz pierwszy.
    2. Gdy ustalisz, w których zasadach zmienna jest zdefiniowana i wypełniana jako pierwsza, musisz określić jej typ w ten sposób:
      1. Sprawdź wartość atrybutu type (jeśli jest obecny).
      2. Jeśli atrybut type nie występuje, zmienna jest traktowana jako ciąg znaków.
    3. Jeśli typ zmiennej nie jest typem wiadomości (np. ciągiem znaków), to jest to przyczyną błędu. Więcej informacji o najczęstszych zmiennych i ich typach znajdziesz w tym artykule.

    Na przykład przyjrzyj się zmiennej PostalCode w powyższym pliku XML. W elemencie <AssignVariable> przypisywana jest jej wartość zmiennej przepływu request.queryparam.postalcode. Ta wartość jest ciągiem znaków, ponieważ w przypisaniu zmiennej nie ma atrybutu typu.

    Przypomnijmy, że zmienna PostalCode jest używana w elemencie <Copy> zasady Assign Message:

    <Copy source="PostalCode">
       <QueryParams>
          <QueryParam name="PostalCode" />
       </QueryParams>
    </Copy>
    

    Ponieważ PostalCode nie jest typu message (w tym przykładzie jest to ciąg znaków), otrzymasz kod błędu:

    steps.assignmessage.VariableOfNonMsgType
    

Rozdzielczość

Sprawdź, czy atrybut source w elemencie <Copy> w zasadzie Assign Message, która nie została zastosowana, jest ustawiony na istniejącą zmienną przepływu typu message.

Aby poprawić zgodność z zasadami, możesz zmodyfikować atrybut source w elemencie <Copy>, aby określić zmienną typu message. Jeśli np. zasady przypisywania wiadomości mają być wykonywane w przepływie żądania, możesz użyć zmiennej typu wiadomości request lub dowolnej innej zmiennej niestandardowej typu wiadomość.

<AssignMessage name="GenerateGeocodingRequest">
   <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
   <AssignVariable>
      <Name>PostalCode</Name>
      <Ref>request.queryparam.postalcode</Ref>
   </AssignVariable>
   <AssignVariable>
      <Name>Country</Name>
      <Ref>request.queryparam.country</Ref>
   </AssignVariable>
   <Copy source="request">
      <QueryParams>
         <QueryParam name="PostalCode" />
      </QueryParams>
   </Copy>
</AssignMessage>