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

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

RequestVariableNotMessageType

Kod błędu

steps.servicecallout.RequestVariableNotMessageType

Treść odpowiedzi o błędzie

{
    "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śnienia usługi nie jest typu komunikat. Ten błąd wystąpi, jeśli zmienna jest ciągiem znaków lub innym typem niebędącym wiadomością.

Zmienne typu wiadomości reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Edge (request, response i message) mają typ komunikatu. Więcej informacji o zmiennych dotyczących wiadomości znajdziesz w informacjach o zmiennych.

Diagnostyka

  1. Wskaż zasadę dotyczącą objaśnienia 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 o błędzie. Na przykład w 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 zbioru zmiennej w elemencie <Request> (w języku angielskim) jest zgodna z nazwą zmiennej określoną 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 tabeli 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 zmienna powodująca problem jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą dotyczącą objaśnień do usługi. Na przykład zasada przypisywania wiadomości jest zwykle używana do tworzenia i wypełniania zmiennych w procesie serwera proxy interfejsu API.
    3. Gdy już określisz zasadę, w której zdefiniujesz i uzupełnisz zmienną, musisz najpierw określić jej typ:
      • Sprawdź wartość atrybutu type (jeśli istnieje).
      • Jeśli atrybut type nie jest obecny, zmienna jest uznawana za ciąg znaków.
    4. Jeśli zmienna ma typ inny niż komunikat (np. ciąg znaków), to jest przyczyną błędu. Więcej informacji o typowych zmiennych i ich typach znajdziesz w dokumentacji zmiennych.

Załóżmy na przykład, że zmienna PostalCode, do której odwołuje się zasada dotycząca objaśnienia usługi, została utworzona w poniższych zasadach przypisywania wiadomości. Pamiętaj, że PostalCode ma przypisaną wartość zmiennej przepływu request.queryparam.postalcode. Jest to ciąg 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> w zasadach dotyczących objaśnień 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 o typie 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 nieudanej zasadzie dotyczącej objaśnienia usługi jest istniejącą zmienną przepływu typu wiadomość. Możesz też utworzyć nową zmienną typu wiadomości bezpośrednio w zasadach dotyczących objaśnień do usługi (zgodnie z opisem w dokumentacji zasad) i używać jej.

Aby poprawić zasadę, musisz zmodyfikować element <Request>, aby określić istniejącą lub nową zmienną typu komunikat. Na przykład zmienna GeocodingRequest ustawiona w zasadzie Przypisz wiadomość ma typ „Komunikat” i działa prawidłowo z zasadami dotyczącymi objaśnienia do 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 o błędzie

{
    "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> w zasadzie objaśnienia usługi nie jest typu komunikatu. Ten błąd wystąpi, jeśli zmienna jest typem komunikatu z odpowiedzią, ciągiem znaków lub innym typem.

Zmienne typu Wiadomość reprezentują całe żądania i odpowiedzi HTTP. Wbudowane zmienne przepływu Edge (request, response i message) mają typ komunikatu. Więcej informacji o zmiennych dotyczących wiadomości znajdziesz w informacjach o zmiennych.

Diagnostyka

  1. Wskaż zasadę dotyczącą objaśnienia 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 o błędzie. Na przykład w 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 zbioru zmiennej w elemencie <Request> (w języku angielskim) jest zgodna z nazwą zmiennej określoną 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 tabeli 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 żądania:

    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 zmienna powodująca problem jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą dotyczącą objaśnień do usługi. Na przykład zasada przypisywania wiadomości jest zwykle używana do tworzenia i wypełniania zmiennych w procesie serwera proxy interfejsu API.
    3. Gdy już określisz zasadę, w której zdefiniujesz i uzupełnisz zmienną, musisz najpierw określić jej typ:
      • Sprawdź wartość atrybutu type (jeśli istnieje).
      • Jeśli atrybut type nie jest obecny, zmienna jest uznawana za ciąg znaków.
    4. Jeśli typ zmiennej nie jest typu żądanie wiadomości, to jest przyczyną błędu. Więcej informacji o typowych zmiennych i ich typach znajdziesz w dokumentacji zmiennych.

Załóżmy na przykład, że zmienna var_response, do której odwołuje się zasada dotycząca objaśnienia usługi, została utworzona w poniższych zasadach przypisywania wiadomości. Zauważ, że var_response otrzymuje 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> zasad dotyczących objaśnienia 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>

Ponieważ komunikat var_response nie jest typu żądaniem (jego typem jest odpowiedź), otrzymujesz kod błędu: steps.servicecallout.RequestVariableNotRequestMessageType.

Rozdzielczość

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

Aby poprawić zasadę, musisz zmodyfikować element <Request>, aby określić istniejącą lub nową zmienną typu komunikat z żądaniem. Będzie on 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 o błędzie

{
    "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 błędnie sformatowany 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ź o błędzie 4XX lub 5XX.

Przyczyna: 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.

Diagnostyka

  1. Wskaż zasadę dotyczącą objaśnienia usługi, która spowodowała błąd. Nazwa zasady pojawia się w elemencie faultstring odpowiedzi o błędzie. Na przykład w tagu faultstring niepoprawna zasada objaśnienia usługi to ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. W niespełnionej zasady dotyczącej objaśnień usługi sprawdź element <URL>. Jeśli nazwa hosta ma nieprawidłowy format albo jest nieprawidłowa lub nieosiągalna, to właśnie jest przyczyną tego błędu. Na przykład poniższe zasady dotyczące objaśnień usługi wskazują 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 związku z tym 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 nieudanej zasadzie objaśnienia usługi ma prawidłowy adres URL i osiągalną nazwę hosta.

Aby poprawić powyższą zasadę dotyczącą objaśnień usługi, możesz zmodyfikować element <URL>, aby określić 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ź o błędzie 4XX lub 5XX.

Diagnostyka

  1. Wskaż zasadę dotyczącą objaśnienia usługi, która spowodowała błąd. Nazwa zasady pojawia się w elemencie faultstring odpowiedzi o błędzie. Na przykład w tagu faultstring niepoprawna zasada objaśnienia usługi to ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Sprawdź faultstring w treści odpowiedzi o błędzie i sprawdź, czy Reason zawiera kody 4XX lub 5XX. Na przykład ten ciąg błędów 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 i 5XX. Instrukcje rozwiązywania problemów z błędami 4XX i 5XX znajdziesz w poradnikach dotyczących błędów środowiska wykonawczego (4XX/5XX).