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

Wyświetlasz dokumentację Apigee Edge.
Przejdź do dokumentacji Apigee X.
info

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> zasady Service Callout nie jest typu message. Jeśli zmienna jest ciągiem znaków lub innym typem niż message, pojawi się ten błąd.

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

Diagnostyka

  1. Znajdź zasadę Service Callout, w której wystąpił błąd, oraz nazwę zmiennej o nieprawidłowym typie. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi na błąd. Na przykład w tym elemencie faultstring nazwa zasady to ExecuteGeocodingRequest, a zmienna to PostalCode:

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

  2. W kodzie XML zasady Service Callout, która spowodowała błąd, sprawdź, czy nazwa zmiennej ustawiona w elemencie <Request> jest zgodna z nazwą zmiennej podaną w elemencie `faultstring` (krok 1 powyżej). Na przykład ta zasada określa zmienną żądania o nazwie PostalCode, która jest zgodna z elementem 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. Sprawdź, czy ta zmienna jest typu message:

    1. Znajdź w pakiecie serwera proxy interfejsu API kod, w którym zmienna została zdefiniowana po raz pierwszy.
    2. W większości przypadków problematyczna zmienna jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą Service Callout. Na przykład zasada Assign Message jest często używana do tworzenia i wypełniania zmiennych w przepływie serwera proxy interfejsu API.
    3. Gdy ustalisz zasadę, w której zmienna jest definiowana i wypełniana po raz pierwszy, musisz określić typ tej zmiennej w ten sposób:
      • Sprawdź wartość atrybutu type (jeśli występuje).
      • Jeśli atrybut type nie występuje, zmienna jest traktowana jako ciąg znaków.
    4. Jeśli typ zmiennej nie jest typu message (np. jest ciągiem znaków), to jest to przyczyna błędu. Więcej informacji o typowych zmiennych i ich typach znajdziesz w dokumentacji zmiennych.

Załóżmy na przykład, że zmienna PostalCode używana w zasadzie Service Callout została utworzona w tej zasadzie Assign Message. Pamiętaj, że zmiennej PostalCode przypisana jest 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 Service Callout:

<?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ż zmienna PostalCode nie jest typu message (w tym przykładzie jest ciągiem znaków), otrzymujesz kod błędu steps.servicecallout.RequestVariableNotMessageType.

Rozdzielczość

Upewnij się, że zmienna ustawiona w elemencie <Request> w zasadzie Service Callout, która spowodowała błąd, jest zmienną przepływu typu message, która istnieje. Możesz też utworzyć nową zmienną typu message bezpośrednio w zasadzie Service Callout (jak wyjaśniono w dokumentacji zasady) i jej użyć.

Aby poprawić zasadę, musisz zmodyfikować element <Request>, aby określić istniejącą lub nową zmienną typu message. Na przykład zmienna GeocodingRequest ustawiona w zasadzie Assign Message jest typu message i będzie działać prawidłowo w zasadzie Service Callout. 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> zasady Service Callout nie jest typu request message. Jeśli zmienna jest typu response message, ciągiem znaków lub innego typu, pojawi się ten błąd.

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

Diagnostyka

  1. Znajdź zasadę Service Callout, w której wystąpił błąd, oraz nazwę zmiennej o nieprawidłowym typie. Oba te elementy znajdziesz w elemencie faultstring odpowiedzi na błąd. Na przykład w tym elemencie faultstring nazwa zasady to ExecuteGeocodingRequest, a zmienna to var_response:

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

  2. W kodzie XML zasady Service Callout, która spowodowała błąd, sprawdź, czy nazwa zmiennej ustawiona w elemencie <Request> jest zgodna z nazwą zmiennej podaną w elemencie `faultstring` (krok 1 powyżej). Na przykład ta zasada określa zmienną żądania o nazwie var_response, która jest zgodna z elementem 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. Sprawdź, czy zmienna jest typu request message:

    1. Znajdź w pakiecie serwera proxy interfejsu API kod, w którym zmienna została zdefiniowana po raz pierwszy.
    2. W większości przypadków problematyczna zmienna jest tworzona i wypełniana w innej zasadzie, która jest wykonywana przed zasadą Service Callout. Na przykład zasada Assign Message jest często używana do tworzenia i wypełniania zmiennych w przepływie serwera proxy interfejsu API.
    3. Gdy ustalisz zasadę, w której zmienna jest definiowana i wypełniana po raz pierwszy, musisz określić typ tej zmiennej w ten sposób:
      • Sprawdź wartość atrybutu type (jeśli występuje).
      • Jeśli atrybut type nie występuje, zmienna jest traktowana jako ciąg znaków.
    4. Jeśli typ zmiennej nie jest typu request message, to jest to przyczyna błędu. Więcej informacji o typowych zmiennych i ich typach znajdziesz w dokumentacji zmiennych.

Załóżmy na przykład, że zmienna var_response używana w zasadzie Service Callout została utworzona w tej zasadzie Assign Message. Pamiętaj, że var_response ma typ response. Dlatego typ zmiennej var_response to response message.

<?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 Service Callout.

<?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ż zmienna var_response nie jest typu request message (jest typu response message), otrzymujesz kod błędu steps.servicecallout.RequestVariableNotRequestMessageType.

Rozdzielczość

Upewnij się, że zmienna ustawiona w elemencie <Request> w zasadzie Service Callout, która spowodowała błąd, jest zmienną typu request message, która istnieje. Możesz też utworzyć nową zmienną typu request message bezpośrednio w zasadzie Service Callout (jak wyjaśniono w dokumentacji zasady) i jej użyć.

Aby poprawić zasadę, musisz zmodyfikować element <Request>, aby określić istniejącą lub nową zmienną typu request message. Będzie ona działać w zasadzie Service Callout. 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 Docelowy adres URL w zasadzie Service Callout jest nieprawidłowy lub ma nieprawidłową albo niedostępną nazwę hosta.
Błąd serwera backendu Serwer backendu zwraca odpowiedź o błędzie 4XX lub 5XX.

Przyczyna: nieprawidłowy lub źle sformatowany adres URL

Docelowy adres URL w zasadzie Service Callout jest nieprawidłowy lub ma nieprawidłową albo niedostępną nazwę hosta.

Diagnostyka

  1. Znajdź zasadę Service Callout, która spowodowała błąd. Nazwa zasady pojawia się w elemencie faultstring odpowiedzi na błąd. Na przykład w tym elemencie faultstring nazwa zasady Service Callout, która spowodowała błąd, to ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. W zasadzie Service Callout, która spowodowała błąd, sprawdź element <URL>. Jeśli jest nieprawidłowy lub ma nieprawidłową albo niedostępną nazwę hosta, to jest to przyczyna tego błędu. Na przykład ta zasada Service Callout określa nieprawidłowy element <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> zawiera tylko protokół http://, ale nie ma prawidłowej nazwy hosta. Dlatego zasada Service Callout kończy się niepowodzeniem z powodu błędu: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Rozdzielczość

Upewnij się, że element <URL> w zasadzie Service Callout, która spowodowała błąd, zawiera prawidłowy adres URL z dostępną nazwą hosta.

Aby poprawić zasadę Service Callout pokazaną powyżej, 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. Znajdź zasadę Service Callout, która spowodowała błąd. Nazwa zasady pojawia się w elemencie faultstring odpowiedzi na błąd. Na przykład w tym elemencie faultstring nazwa zasady Service Callout, która spowodowała błąd, to ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Sprawdź element faultstring w treści odpowiedzi na błąd i zobacz, czy w elemencie Reason nie ma kodów odpowiedzi 4XX lub 5XX. Na przykład ten element `faultstring` 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ść

Gdy ustalisz kod odpowiedzi na błąd, możesz rozwiązać ten problem tak samo jak każdy błąd 4XX lub 5XX. Instrukcje rozwiązywania błędów 4XX lub 5XX znajdziesz w przewodnikach dotyczących błędów środowiska wykonawczego (4XX/5XX).