Risoluzione degli errori di runtime dei callout di servizio

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

RequestVariableNotMessageType

Codice di errore

steps.servicecallout.RequestVariableNotMessageType

Corpo della risposta di errore

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

Causa

Questo errore si verifica se una variabile specificata nell'elemento <Request> della policy Service Callout non è di tipo messaggio. Se la variabile è una stringa o un altro tipo non di messaggio, viene visualizzato questo errore.

Le variabili di tipo messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso Edge integrate request, response e message sono di tipo messaggio. Per saperne di più sulle variabili di messaggio, consulta il riferimento alle variabili.

Diagnosi

  1. Identifica la policy Service Callout in cui si è verificato l'errore e il nome della variabile il cui tipo non è corretto. Puoi trovare entrambi questi elementi nell'elemento faultstring della risposta di errore. Ad esempio, nella seguente faultstring, il nome della policy è ExecuteGeocodingRequest e la variabile è PostalCode:

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

  2. Nel file XML della policy Service Callout non riuscita, verifica che il nome della variabile impostata nell'elemento <Request> corrisponda al nome della variabile identificata nella stringa di errore (passaggio 1 sopra). Ad esempio, la seguente policy specifica una variabile di richiesta denominata PostalCode, che corrisponde a quella presente in faultstring:

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
        Req>uest variable=&qu<ot;Postal>Code&<quot;/
        ResponseG>eocodingR<esp>onse/Response
        HTTPTargetConnection
            U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
        /HTTPTargetConnection
    /ServiceCallout
    
  3. Determina se questa variabile è di tipo messaggio o meno:

    1. Individua il codice all'interno del bundle del proxy API in cui è stata definita per la prima volta la variabile.
    2. Nella maggior parte dei casi, la variabile problematica viene creata e compilata in un'altra policy eseguita prima della policy Service Callout. Ad esempio, la policy Assign Message è di uso comune per creare e compilare variabili in un flusso di proxy API.
    3. Una volta individuata la policy in cui la variabile viene definita e compilata per la prima volta, devi determinare il tipo di variabile nel seguente modo:
      • Controlla il valore dell'attributo type (se presente).
      • Se l'attributo type non è presente, la variabile viene considerata una stringa.
    4. Se il tipo di variabile non è di tipo messaggio (ad esempio una stringa), questa è la causa dell'errore. Puoi scoprire di più sulle variabili comuni e sui relativi tipi nel riferimento alle variabili.

Ad esempio, supponiamo che la variabile PostalCode a cui si fa riferimento nella policy Service Callout sia stata creata nella seguente policy Assign Message. Tieni presente che a PostalCode viene assegnato il valore della variabile di flusso request.queryparam.postalcode. Questo valore è una stringa, perché non è presente alcun attributo type nell'assegnazione della variabile.

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
        >AssignTo createN<ew=">true&<quo>t; type=&<quot;reques>t"Geocod<ingRequest/AssignTo
    S>et
        QueryParams
        <    QueryPa>ram name=&quo<t;address"{request.>queryparam.postalcode}/Query<Param
     >       QueryP<aram name="region&q>uot;{<request.que>ryparam.c<ountry}/Quer>yParam
  <    >   <   Qu>eryPa<ram >name=<"sensor&q>uot;false</Que>ryParam
  <     > /QueryPa<ram>s
        VerbGET/Verb
    /S<et
 >   As<signVariable
  >     < NamePostalCod>e/Name
  <    >  Refre<quest>.querypar<am.>postalcode/Ref
    /Assign<Vari>able
<    AssignVaria>b<le
        Nam>eCountry/Name
        Refrequest.queryparam.country/Ref
    /AssignVariable
/AssignMessage

Ora, ricorda che la variabile PostalCode viene utilizzata nell'elemento <Request> della policy Service Callout:

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
    Req>uest variable=&qu<ot;Postal>Code&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

Poiché PostalCode non è di tipo messaggio (in questo esempio è una stringa), ricevi il codice di errore: steps.servicecallout.RequestVariableNotMessageType.

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> della policy Service Callout non riuscita sia una variabile di flusso di tipo messaggio esistente oppure puoi creare una nuova variabile di tipo messaggio direttamente nella policy Service Callout (come spiegato nella documentazione della policy) e utilizzarla.

Per correggere la policy, devi modificare l'elemento <Request> in modo da specificare una variabile esistente o nuova di tipo messaggio. Ad esempio, la variabile GeocodingRequest impostata nella policy Assign Message è di tipo messaggio e funzionerebbe perfettamente nella policy Service Callout. Ad esempio:

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

RequestVariableNotRequestMessageType

Codice di errore

steps.servicecallout.RequestVariableNotRequestMessageType

Corpo della risposta di errore

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

Causa

Questo errore si verifica se una variabile specificata nell'elemento <Request> della policy Service Callout non è di tipo messaggio di richiesta. Se la variabile è di tipo messaggio di risposta, una stringa o un altro tipo, viene visualizzato questo errore.

Le variabili di tipo messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso Edge integrate request, response e message sono di tipo messaggio. Per saperne di più sulle variabili di messaggio, consulta il riferimento alle variabili.

Diagnosi

  1. Identifica la policy Service Callout in cui si è verificato l'errore e il nome della variabile il cui tipo non è corretto. Puoi trovare entrambi questi elementi nell'elemento faultstring della risposta di errore. Ad esempio, nella seguente faultstring, il nome della policy è ExecuteGeocodingRequest e la variabile è var_response:

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

  2. Nel file XML della policy Service Callout non riuscita, verifica che il nome della variabile impostata nell'elemento <Request> corrisponda al nome della variabile identificata nella stringa di errore (passaggio 1 sopra). Ad esempio, la seguente policy specifica una variabile di richiesta denominata var_response, che corrisponde a quella presente in faultstring:

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
     <   Reque>st variable="<;var_resp>onse&<quot;/
        ResponseG>eocodingR<esp>onse/Response
        HTTPTargetConnection
            U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
        /HTTPTargetConnection
    /ServiceCallout
    
  3. Determina se la variabile è di tipo messaggio di richiesta o meno:

    1. Individua il codice all'interno del bundle del proxy API in cui è stata definita per la prima volta la variabile.
    2. Nella maggior parte dei casi, la variabile problematica viene creata e compilata in un'altra policy eseguita prima della policy Service Callout. Ad esempio, la policy Assign Message è di uso comune per creare e compilare variabili in un flusso di proxy API.
    3. Una volta individuata la policy in cui la variabile viene definita e compilata per la prima volta, devi determinare il tipo di variabile nel seguente modo:
      • Controlla il valore dell'attributo type (se presente).
      • Se l'attributo type non è presente, la variabile viene considerata una stringa.
    4. Se il tipo di variabile non è di tipo messaggio di richiesta, questa è la causa dell'errore. Puoi scoprire di più sulle variabili comuni e sui relativi tipi nel riferimento alle variabili.

Ad esempio, supponiamo che la variabile var_response a cui si fa riferimento nella policy Service Callout sia stata creata nella seguente policy Assign Message. Tieni presente che a var_response viene assegnato il tipo response. Pertanto, il tipo della variabile var_response è messaggio di risposta.

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
        >AssignTo createN<ew=">true&<quot; type="request"GeocodingRe>quest/Assign<To
    As>signT<o c>reateNew=<"true&>quot; type=&q<uot;response"var_res>ponse/AssignTo
    Set
        <QueryParams>
            <QueryParam name="ad>dress"{request.querypar<am.postalco>de}/QueryPara<m
            QueryParam> name<="regi>on"{<request.quer>yparam.co<untr>y}/<Query>Param<
   >     <    QueryParam> name=&qu<ot;s>ensor"<;fals>e/QueryPa<ram>
        /QueryParams
       < Ver>bGET/<Verb
    /Set
 >   As<signVariable
 >       Na<mePo>stalCod<e/Nam>e
       < Re>frequest.queryparam.postal<code>/Ref
<    /AssignVari>a<ble
    Assign>Variable
        NameCountry/Name
        Refrequest.queryparam.country/Ref
    /AssignVariable
/AssignMessage

Ricorda che la variabile var_response viene utilizzata nell'elemento <Request> della policy Service Callout.

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
 <   Reque>st variable="<;var_resp>onse&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

Poiché var_response non è di tipo messaggio di richiesta (il suo tipo è messaggio di risposta), ricevi il codice di errore: steps.servicecallout.RequestVariableNotRequestMessageType.

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> della policy Service Callout non riuscita sia una variabile di tipo messaggio di richiesta esistente oppure puoi creare una nuova variabile di tipo messaggio di richiesta direttamente nella policy Service Callout (come spiegato nella documentazione della policy) e utilizzarla.

Per correggere la policy, devi modificare l'elemento <Request> in modo da specificare una variabile esistente o nuova di tipo messaggio di richiesta, che funzionerà nella policy Service Callout. Ad esempio:

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

ExecutionFailed

Codice di errore

steps.servicecallout.ExecutionFailed

Corpo della risposta di errore

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

o

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

Possibili cause

Le possibili cause di questo errore sono:

Causa Descrizione
URL non valido o con formato errato L'URL di destinazione nella policy Service Callout ha un formato errato o ha un nome host non valido o non raggiungibile.
Errore del server di backend Il server di backend restituisce una risposta di errore 4XX o 5XX.

Causa: URL non valido o con formato errato

L'URL di destinazione nella policy Service Callout ha un formato errato o ha un nome host non valido o non raggiungibile.

Diagnosi

  1. Identifica la policy Service Callout che ha causato l'errore. Il nome della policy viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome della policy Service Callout non riuscita è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Nella policy Service Callout non riuscita, esamina l'elemento <URL>. Se il formato è errato o ha un nome host non valido o non raggiungibile, questa è la causa dell'errore. Ad esempio, la seguente policy Service Callout specifica un <URL> non valido:

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest"
    >    R<equest v>ariable="Geo<codingReq>uest&<quot;/
        ResponseG>eocodingR<esp>onse/Re<spon>se
      <  HTTPTargetConnectio>n<
            URLhtt>p:///URL
        /HTTPTargetConnection
    /ServiceCallout
    

    L'elemento <URL> ha solo il protocollo http://, ma non ha un nome host valido; pertanto, la policy Service Callout non riesce a causa dell'errore: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Risoluzione

Assicurati che l'elemento <URL> nella policy Service Callout non riuscita abbia un URL valido con un nome host raggiungibile.

Per correggere la policy Service Callout mostrata sopra, puoi modificare l'elemento <URL> in modo da specificare un URL valido:

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

Causa: errore del server di backend

Il server di backend restituisce una risposta di errore 4XX o 5XX.

Diagnosi

  1. Identifica la policy Service Callout che ha causato l'errore. Il nome della policy viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome della policy Service Callout non riuscita è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Esamina la faultstring nel corpo della risposta di errore e controlla se sono presenti codici di risposta 4XX o 5XX elencati in Reason. Ad esempio, la seguente stringa di errore indica chiaramente che il server di backend ha restituito un codice di risposta 502:

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

Risoluzione

Una volta determinato il codice di risposta di errore, puoi risolvere il problema come faresti con qualsiasi errore 4XX o 5XX. Consulta i playbook per gli errori di runtime (4XX/5XX) per istruzioni sulla risoluzione dei problemi e sulla risoluzione degli errori 4XX o 5XX.