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

Wyświetlasz dokumentację Apigee Edge.
Zapoznaj się z dokumentacją Apigee X.
Informacje

RequestVariableNotMessageType

Kod błędu

steps.servicecallout.RequestVariableNotMessageType

Treść odpowiedzi na błąd

{
    "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>zasadach dotyczących informacji o usłudze nie jest typu message. Jeśli zmienna jest ciągiem znaków lub innym typem, który nie jest wiadomością, pojawi się ten błąd.

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

Diagnostyka

  1. Zidentyfikuj zasadę wywołania usługi, 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 tagu faultstring nazwa zasady to ExecuteGeocodingRequest, a zmiennej to PostalCode:

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

  2. W pliku XML z błędami dotyczącymi wywołań usługi sprawdź, czy nazwa zmiennej ustawiona w elemencie <Request> jest zgodna z nazwą zmiennej podaną w ciągu błędu (krok 1 powyżej). Na przykład w tej regule określono zmienną żądania o nazwie PostalCode, która odpowiada zmiennej w elementach 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 komunikat:

    1. Znajdź kod w pakiecie proxy interfejsu API, w którym zmienna została zdefiniowana jako pierwsza.
    2. W większości przypadków okazuje się, że zmienna problemu jest tworzona i wypełniana w innej regule, która jest wykonywana przed regułą Service Callout. Na przykład zasada Przypisz wiadomość jest często używana do tworzenia i wypełniania zmiennych w przepływie danych przez serwer proxy.
    3. Gdy już ustalisz, w której z zasad zmienna jest zdefiniowana i wypełniana jako pierwsza, musisz określić jej typ w ten sposób:
      • Sprawdź wartość atrybutu type (jeśli występuje).
      • Jeśli atrybut type jest nieobecny, zmienna jest traktowana jako ciąg znaków.
    4. Jeśli typ zmiennej to wartość inna niż wiadomość (np. ciąg znaków), to jest przyczyną błędu. Więcej informacji o popularnych zmiennych i ich typach znajdziesz w artykule Przewodnik po zmiennych.

Na przykład załóżmy, że zmienna PostalCode, do której odwołuje się zasada objaśnień dotyczących usługi, została utworzona w poniższej zasadzie przypisywania wiadomości. Zwróć uwagę, że zmiennej 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>

Przypominamy, że w elemencie <Request> zasad dotyczących objaśnień usługi używana jest zmienna PostalCode:

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

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

Rozdzielczość

Upewnij się, że zmienna ustawiona w elemencie <Request> w niewłaściwych zasadach dotyczących wywołań usługi jest istniejącą zmienną procesu typu message. Możesz też utworzyć nową zmienną typu wiadomości bezpośrednio w zasadach dotyczących wywołań usługi (jak wyjaśniono w dokumentacji zasad) i z niej skorzystać.

Aby poprawić tę zasadę, musisz zmodyfikować element <Request>, tak aby zawierał istniejącą lub nową zmienną typu „komunikat”. Na przykład zmienna GeocodingRequest, która została określona w zasadach przypisywania wiadomości, jest typu message i będzie działać prawidłowo w zasadach wywołania 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 na błąd

{
    "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> zasad dotyczących wywołań usługi nie jest typu żądanie. Jeśli zmienna jest typu „wiadomość odpowiedzi”, „ciąg znaków” lub innego typu, pojawi się ten błąd.

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

Diagnostyka

  1. Zidentyfikuj zasadę wywołania usługi, 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 ExecuteGeocodingRequest, a zmienna to var_response:

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

  2. W pliku XML zasad wywołania usługi, które nie powiodło się, sprawdź, czy nazwa zmiennej ustawiona w elemencie <Request> jest zgodna z nazwą zmiennej wskazaną w ciągu błędu (krok 1 opisany powyżej). Na przykład w tej regule określono zmienną żądania o nazwie var_response, która odpowiada zmiennej w elementach 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 jest typu wiadomość z prośbą:

    1. Znajdź kod w pakiecie proxy interfejsu API, w którym najpierw zdefiniowano zmienną.
    2. W większości przypadków okazuje się, że zmienna problemu jest tworzona i wypełniana w innej regule, która jest wykonywana przed regułą Service Callout. Na przykład zasada Przypisz wiadomość jest często używana do tworzenia i wypełniania zmiennych w przepływie danych przez serwer proxy.
    3. Gdy już ustalisz, w której z zasad zmienna jest zdefiniowana i wypełniana jako pierwsza, musisz określić jej typ w ten sposób:
      • Sprawdź wartość atrybutu type (jeśli występuje).
      • Jeśli atrybut type jest nieobecny, zmienna jest traktowana jako ciąg znaków.
    4. Jeśli typ zmiennej nie jest wiadomością żądania, jest to przyczyna błędu. Więcej informacji o popularnych zmiennych i ich typach znajdziesz w artykule Przewodnik po zmiennych.

Na przykład załóżmy, że zmienna var_response, do której odwołuje się zasada objaśnień dotyczących usługi, została utworzona w poniższej zasadzie przypisywania wiadomości. Zwróć uwagę, że zmienna var_response ma typ response. Dlatego typ zmiennej var_response jest komunikatem o 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>

Zwróć uwagę, że w elemencie <Request> zasad dotyczących objaśnień usługi używana jest zmienna var_response.

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

Ponieważ var_response nie jest typem komunikatu z żądaniem (jego typ jest komunikatem z odpowiedzią), otrzymujesz kod błędu: steps.servicecallout.RequestVariableNotRequestMessageType.

Rozdzielczość

Upewnij się, że zmienna ustawiona w elemencie <Request> w niewłaściwych zasadach dotyczących wywołań usługi jest istniejącą zmienną typu żądanie wiadomości. Możesz też utworzyć zmienną typu nowej wiadomości żądania bezpośrednio w zasadach dotyczących objaśnień usługi (jak wyjaśniono w dokumentacji zasad) i z niej skorzystać.

Aby poprawić zasadę, musisz zmodyfikować element <Request>, aby określić istniejącą lub nową zmienną typu wiadomość z zapytaniem, która będzie działać w zasadzie dotyczącej powiadomienia o usłudze. 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 na błąd

{
    "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 źle sformatowany adres URL Adres URL docelowy w zasadach dotyczących wezwania do usługi jest nieprawidłowo sformatowany lub zawiera nieprawidłową lub niedostępną nazwę hosta.
Błąd serwera backendu Serwer zaplecza zwraca odpowiedź z błędem 4XX lub 5XX.

Przyczyna: nieprawidłowy lub źle sformułowany adres URL

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

Diagnostyka

  1. Odszukaj zasadę Service Callout, która spowodowała błąd. Nazwa zasady znajduje się w elemencie faultstring odpowiedzi na błąd. Na przykład w tym faultstring nazwa zasady dotyczącej wywołania usługi, która nie została wykonana, to ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. W nieudanej zasadie „Usługa z objaśnieniami” sprawdź element <URL>. Jeśli jest ona nieprawidłowa lub zawiera nieprawidłową lub niedostępną nazwę hosta, jest to przyczyną błędu. Na przykład w tych zasadach dotyczących komunikatu o usłudze podano 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. W rezultacie zasady dotyczące powiadomienia o usługach nie działają i wyświetla się błąd: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Rozdzielczość

Upewnij się, że element <URL> w zasadach dotyczących wywołania usługi, które nie zostało wykonane, zawiera prawidłowy adres URL z dostepną nazwą hosta.

Aby poprawić zasadę ostrzeżenia o usługach, możesz zmodyfikować element <URL>, aby podać 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 zaplecza zwraca odpowiedź z błędem 4XX lub 5XX.

Diagnostyka

  1. Odszukaj zasadę Service Callout, która spowodowała błąd. Nazwa zasady znajduje się w elemencie faultstring odpowiedzi na błąd. Na przykład w tym faultstring nazwa zasady dotyczącej wywołania usługi, która nie została wykonana, to ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Sprawdź pole faultstring w treści odpowiedzi na błąd i sprawdź, czy w tabeli Reason podane są kody odpowiedzi 4XX lub 5XX. Na przykład następujący ciąg znaków jednoznacznie wskazuje, że serwer zaplecza zwrócił kod odpowiedzi 502:

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

Rozdzielczość

Gdy już poznasz kod odpowiedzi, możesz rozwiązać ten problem tak samo jak każdy inny błąd 4XX lub 5XX. Instrukcje dotyczące rozwiązywania problemów z błędami 4XX i 5XX znajdziesz w książkach dostępnych w Google Play na temat błędów w czasie wykonywania kodu (4XX/5XX).