Rozwiązywanie problemów z błędami w czasie działania objaśnienia usługi

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

RequestVariableNotMessageType

Kod błędu

steps.servicecallout.RequestVariableNotMessageType

Treść odpowiedzi błędu

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotMessageType"
        }
    }
}

Przyczyna

Ten błąd występuje, jeśli zmienna określona w elemencie <Request> w zasadach dotyczących objaśnień usługi nie jest typu komunikat. Ten błąd pojawi się, jeśli zmienna jest ciągiem znaków lub innym typem, który nie jest wiadomością.

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

Diagnostyka

  1. Wskaż zasadę objaśnienia usługi, w której wystąpił błąd, i podaj nazwę zmiennej, której typ jest nieprawidłowy. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi błędu. Na przykład w tym tagu faultstring nazwa zasady to ExecuteGeocodingRequest, a zmienna to PostalCode:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. Sprawdź, czy nazwa zmiennej ustawionej w elemencie <Request> odpowiada nazwie zmiennej w ciągu błędu (krok 1 powyżej). Na przykład ta zasada określa zmienną żądania o nazwie PostalCode, która odpowiada zawartości w parametrze faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="PostalCode"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. Określ, czy ta zmienna ma typ komunikatu:

    1. Znajdź kod w pakiecie serwera proxy interfejsu API, w którym zmienna została zdefiniowana jako pierwsza.
    2. W większości przypadków może się okazać, że zmienna powodująca problem jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą objaśnienia usługi. Na przykład zasada Przypisz wiadomość jest często używana do tworzenia i wypełniania zmiennych w procesie serwera proxy interfejsu API.
    3. Gdy już poznasz zasadę, w ramach której zmienna jest zdefiniowana i wypełniana w pierwszej kolejności, musisz określić jej typ w ten sposób:
      • Sprawdź wartość atrybutu type (jeśli istnieje).
      • Jeśli brak atrybutu type, zmienna jest uznawana za ciąg znaków.
    4. Jeśli zmienna ma typ inny niż komunikat (np. ciąg znaków), jest to przyczyna błędu. Więcej informacji o typowych zmiennych i ich rodzajach znajdziesz w artykule o zmiennych.

Załóżmy na przykład, że zmienna PostalCode, do której odwołuje się zasada objaśnienia usługi, została utworzona w poniższych zasadach dotyczących przypisania wiadomości. Zwróć uwagę, że do PostalCode przypisano wartość zmiennej przepływu request.queryparam.postalcode. Ta wartość jest ciągiem znaków, ponieważ w przypisaniu zmiennej nie ma atrybutu type.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

Pamiętaj, że zmienna PostalCode jest używana w elemencie <Request> zasady dotyczącej objaśnienia usługi:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="PostalCode"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

Komunikat PostalCode nie jest typu (w tym przykładzie jest to ciąg znaków), dlatego otrzymujesz kod błędu: steps.servicecallout.RequestVariableNotMessageType.

Rozdzielczość

Upewnij się, że zmienna ustawiona w elemencie <Request> w niezgodności zasady dotyczącej objaśnień usługi jest zmienną przepływu typu wiadomość. Możesz też utworzyć nową zmienną typu wiadomości bezpośrednio w zasadach dotyczących objaśnień usługi (zgodnie z opisem w dokumentacji zasad) i używać jej.

Aby poprawić zasadę, musisz zmodyfikować element <Request> tak, aby określić istniejącą lub nową zmienną typu komunikat. Na przykład zmienna GeocodingRequest ustawiona w zasadzie Przypisz wiadomość jest typu wiadomości i będzie działać prawidłowo z zasadą Objaśnienie usługi. Na przykład:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

RequestVariableNotRequestMessageType

Kod błędu

steps.servicecallout.RequestVariableNotRequestMessageType

Treść odpowiedzi błędu

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
        }
    }
}

Przyczyna

Ten błąd występuje, jeśli zmienna określona w elemencie <Request> zasady dotyczącej objaśnień usługi nie jest typem komunikatu z żądaniem. Ten błąd wystąpi, jeśli zmienna jest typem komunikatu odpowiedzi, ciągiem tekstowym lub innym typem.

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

Diagnostyka

  1. Wskaż zasadę objaśnienia usługi, w której wystąpił błąd, i podaj nazwę zmiennej, której typ jest nieprawidłowy. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi błędu. Na przykład w tym tagu faultstring nazwa zasady to ExecuteGeocodingRequest, a zmienna to var_response:

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. Sprawdź, czy nazwa zmiennej ustawionej w elemencie <Request> odpowiada nazwie zmiennej w ciągu błędu (krok 1 powyżej). Na przykład ta zasada określa zmienną żądania o nazwie var_response, która odpowiada zawartości w parametrze faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="var_response"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. Określ, czy zmienna ma typ wiadomości z żądaniem, czy nie:

    1. Znajdź kod w pakiecie serwera proxy interfejsu API, w którym zmienna została zdefiniowana jako pierwsza.
    2. W większości przypadków może się okazać, że zmienna powodująca problem jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą objaśnienia usługi. Na przykład zasada Przypisz wiadomość jest często używana do tworzenia i wypełniania zmiennych w procesie serwera proxy interfejsu API.
    3. Gdy już poznasz zasadę, w ramach której zmienna jest zdefiniowana i wypełniana w pierwszej kolejności, musisz określić jej typ w ten sposób:
      • Sprawdź wartość atrybutu type (jeśli istnieje).
      • Jeśli brak atrybutu type, zmienna jest uznawana za ciąg znaków.
    4. Jeśli typ zmiennej jest inny niż wiadomość żądania, to jest przyczyną błędu. Więcej informacji o typowych zmiennych i ich rodzajach znajdziesz w artykule o zmiennych.

Załóżmy na przykład, że zmienna var_response, do której odwołuje się zasada objaśnienia usługi, została utworzona w poniższych zasadach dotyczących przypisania wiadomości. Zwróć uwagę, że var_response ma typ response. Dlatego typem zmiennej var_response jest komunikat z odpowiedzią.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <AssignTo createNew="true" type="response">var_response</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

Pamiętaj, że zmienna var_response jest używana w elemencie <Request> zasady Objaśnienie usługi.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="var_response"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

Komunikat var_response z żądaniem nie jest typem komunikatu (jego typem jest odpowiedź i komunikat), dlatego otrzymujesz kod błędu: steps.servicecallout.RequestVariableNotRequestMessageType.

Rozdzielczość

Upewnij się, że zmienna ustawiona w elemencie <Request> w niezgodności zasady dotyczącej objaśnienia usługi jest zmienną typu wiadomości z prośbą. Możesz też utworzyć nową zmienną typu wiadomości z żądaniem bezpośrednio w zasadach dotyczących objaśnień usługi (zgodnie z opisem w dokumentacji zasad) i używać jej.

Aby poprawić tę zasadę, musisz zmodyfikować element <Request> tak, aby określić istniejącą lub nową zmienną typu komunikat z żądaniem. Będzie ona działać z zasadami dotyczącymi objaśnień usługi. Na przykład:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

ExecutionFailed

Kod błędu

steps.servicecallout.ExecutionFailed

Treść odpowiedzi błędu

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

lub

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

Możliwe przyczyny

Możliwe przyczyny tego błędu:

Przyczyna Opis
Nieprawidłowy lub uszkodzony adres URL Docelowy URL w zasadzie objaśnienia usługi ma nieprawidłowy format albo zawiera nieprawidłową lub nieosiągalną nazwę hosta.
Błąd serwera backendu Serwer backendu zwraca odpowiedź błędu 4XX lub 5XX.

Przyczyna: nieprawidłowy lub nieprawidłowy adres URL

Docelowy URL w zasadzie objaśnienia usługi ma nieprawidłowy format albo zawiera nieprawidłową lub nieosiągalną nazwę hosta.

Diagnostyka

  1. Wskaż zasadę objaśnienia usługi, która spowodowała błąd. Nazwa zasady pojawi się w elemencie faultstring odpowiedzi o błędzie. Na przykład w tagu faultstring niedziałająca zasada objaśnienia usługi nazywa się ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Przyjrzyj się elementowi <URL> w nieudanej zasadzie objaśnienia usługi. Jeśli host ma nieprawidłowy format albo ma nieprawidłową lub nieosiągalną nazwę hosta, to jest przyczyną tego błędu. Na przykład te zasady dotyczące objaśnienia usługi określają nieprawidłową wartość <URL>:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="GeocodingRequest"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    

    Element <URL> ma tylko protokół http://, ale nie ma prawidłowej nazwy hosta. Dlatego zasada Objaśnienia usługi kończy się błędem: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Rozdzielczość

Upewnij się, że element <URL> w nieprawidłowej zasadzie objaśnienia usługi ma prawidłowy adres URL i osiągalną nazwę hosta.

Aby poprawić powyższe zasady dotyczące objaśnień usługi, możesz zmodyfikować element <URL> i określić w nim prawidłowy adres URL:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

Przyczyna: błąd serwera backendu

Serwer backendu zwraca odpowiedź błędu 4XX lub 5XX.

Diagnostyka

  1. Wskaż zasadę objaśnienia usługi, która spowodowała błąd. Nazwa zasady pojawi się w elemencie faultstring odpowiedzi o błędzie. Na przykład w tagu faultstring niedziałająca zasada objaśnienia usługi nazywa się ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Sprawdź faultstring w treści odpowiedzi o błędzie i sprawdź, czy Reason zawiera kody odpowiedzi 4XX lub 5XX. Na przykład poniższy ciąg błędu wyraźnie wskazuje, że serwer backendu zwrócił kod odpowiedzi 502:

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

Rozdzielczość

Po określeniu kodu odpowiedzi błędu możesz rozwiązać ten problem tak samo jak w przypadku każdego błędu 4XX lub 5XX. Instrukcje rozwiązywania problemów z błędami 4XX i 5XX znajdziesz w poradnikach dotyczących błędów środowiska wykonawczego (4XX/5XX).