Risoluzione degli errori di runtime dei callout di servizio

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

RequestVariableNotMessageType

Codice di errore

steps.servicecallout.RequestVariableNotMessageType

Corpo della risposta all'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> delle norme sui callout di servizio non è di tipo message. Se la variabile è una stringa o qualsiasi altro tipo che non sia un messaggio, visualizzerai questo errore.

Le variabili del tipo di messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso Edge integrate request, response e message sono di tipo messaggio. Per scoprire di più sulle variabili messaggio, consulta la documentazione di riferimento sulle variabili.

Diagnostica

  1. Identifica le norme sui callout di servizio in cui si è verificato l'errore e il nome della variabile di tipo errato. Puoi trovare entrambi gli elementi nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome del criterio è ExecuteGeocodingRequest e la variabile è PostalCode:

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

  2. Nel file XML del criterio relativo ai callout di servizio che non è stato superato, verifica che il nome della variabile impostata nell'elemento <Request> corrisponda al nome della variabile identificato nella stringa di errore (passaggio 1 riportato sopra). Ad esempio, il seguente criterio specifica una variabile di richiesta denominata PostalCode, che corrisponde a quanto contenuto in 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. Determina se questa variabile è di tipo messaggio o meno:

    1. Individua il codice all'interno del bundle proxy API, in cui la variabile è stata definita per prima.
    2. Nella maggior parte dei casi, la variabile "Problema" viene creata e compilata in un altro criterio eseguito prima delle norme relative ai callout di servizio. Ad esempio, il criterio Assegna messaggio viene comunemente utilizzato per creare e compilare le variabili in un flusso proxy API.
    3. Una volta compreso il criterio in cui la variabile viene definita e compilata, devi determinarne il tipo nel seguente modo:
      • Controlla il valore dell'attributo type (se presente).
      • Se l'attributo type non è presente, la variabile viene considerata come una stringa.
    4. Se il tipo di variabile non è un messaggio (ad esempio una stringa), questo è il motivo dell'errore. Per saperne di più sulle variabili comuni e sui loro tipi, consulta Riferimento variabili.

Ad esempio, supponiamo che la variabile PostalCode a cui viene fatto riferimento nelle norme relative ai callout di servizio sia stata creata nel seguente criterio Assegna messaggio. 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" 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>

Ricorda che la variabile PostalCode viene utilizzata nell'elemento <Request> delle norme relative ai callout di servizio:

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

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

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> nel criterio Callout di servizio che non è stato superato sia una variabile di flusso di tipo messaggio esistente oppure, in alternativa, puoi creare una nuova variabile per il tipo di messaggio direttamente nel criterio Callout di servizio (come spiegato nella documentazione relativa alle norme) e utilizzarla.

Per correggere il criterio, devi modificare l'elemento <Request> per specificare una variabile esistente o nuova di tipo messaggio. Ad esempio, la variabile GeocodingRequest impostata nelle norme relative all'assegnazione dei messaggi è di tipo messaggio e funziona perfettamente nelle norme relative ai callout di servizio. Ad esempio:

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

Codice di errore

steps.servicecallout.RequestVariableNotRequestMessageType

Corpo della risposta all'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> delle norme sui callout di servizio non è di tipo messaggio di richiesta. Se la variabile è un tipo di messaggio di risposta, una stringa o qualsiasi altro tipo, visualizzerai 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 scoprire di più sulle variabili messaggio, consulta la documentazione di riferimento sulle variabili.

Diagnostica

  1. Identifica le norme sui callout di servizio in cui si è verificato l'errore e il nome della variabile di tipo errato. Puoi trovare entrambi gli elementi nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome del criterio è ExecuteGeocodingRequest e la variabile è var_response:

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

  2. Nel file XML del criterio relativo ai callout di servizio che non è stato superato, verifica che il nome della variabile impostata nell'elemento <Request> corrisponda al nome della variabile identificato nella stringa di errore (passaggio 1 riportato sopra). Ad esempio, il seguente criterio specifica una variabile di richiesta denominata var_response, che corrisponde a quanto contenuto in 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. Determina se la variabile è del tipo di messaggio di richiesta o meno:

    1. Individua il codice all'interno del bundle proxy API, in cui la variabile è stata definita per prima.
    2. Nella maggior parte dei casi, la variabile "Problema" viene creata e compilata in un altro criterio eseguito prima delle norme relative ai callout di servizio. Ad esempio, il criterio Assegna messaggio viene comunemente utilizzato per creare e compilare le variabili in un flusso proxy API.
    3. Una volta compreso il criterio in cui la variabile viene definita e compilata, devi determinarne il tipo nel seguente modo:
      • Controlla il valore dell'attributo type (se presente).
      • Se l'attributo type non è presente, la variabile viene considerata come una stringa.
    4. Se il tipo di variabile non è di tipo messaggio di richiesta, l'errore è causato da questo. Per saperne di più sulle variabili comuni e sui loro tipi, consulta Riferimento variabili.

Ad esempio, supponiamo che la variabile var_response a cui viene fatto riferimento nelle norme relative ai callout di servizio sia stata creata nel seguente criterio Assegna messaggio. Tieni presente che a var_response viene assegnato il tipo response. Pertanto, il tipo di variabile var_response è un messaggio di risposta.

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

Ricorda che la variabile var_response viene utilizzata nell'elemento <Request> delle norme sui callout di servizio.

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

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

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> nel criterio Callout di servizio non riuscito sia una variabile di tipo request message esistente oppure, in alternativa, puoi creare una nuova variabile per il tipo di messaggio di richiesta direttamente nelle norme relative al callout di servizio (come spiegato nella documentazione relativa alle norme) e utilizzarla.

Per correggere la norma, devi modificare l'elemento <Request> in modo da specificare una variabile esistente o nuova di tipo "messaggio di richiesta" e che questa funzione si applichi alle norme relative ai callout di servizio. Ad esempio:

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

Codice di errore

steps.servicecallout.ExecutionFailed

Corpo della risposta all'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 in formato non valido L'URL di destinazione nelle norme relative ai callout di servizio non è valido o ha un nome host non valido o non raggiungibile.
Errore del server di backend Il server di backend restituisce una risposta di errore di 4XX o 5XX.

Causa: URL non valido o in formato non valido

L'URL di destinazione nelle norme relative ai callout di servizio non è valido o ha un nome host non valido o non raggiungibile.

Diagnostica

  1. Identifica le norme sui callout di servizio che hanno causato l'errore. Il nome del criterio viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome del criterio relativo ai callout di servizio non riuscito è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Esamina l'elemento <URL> nelle norme relative ai callout di servizio che non hanno superato il test. Se il formato non è corretto o il nome host non è valido o non è raggiungibile, è questo l'errore. Ad esempio, le seguenti norme relative ai callout di servizio specificano un valore <URL> non valido:

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

    L'elemento <URL> ha solo il protocollo http://, ma non ha un nome host valido, pertanto il criterio Callout di servizio non funziona e genera l'errore: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Risoluzione

Assicurati che l'elemento <URL> nelle norme relative ai callout di servizio non superate abbia un URL valido con un nome host raggiungibile.

Per correggere le norme sui callout di servizio mostrate sopra, puoi modificare l'elemento <URL> in modo da specificare un URL valido:

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

Causa: errore del server di backend

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

Diagnostica

  1. Identifica le norme sui callout di servizio che hanno causato l'errore. Il nome del criterio viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome del criterio relativo ai callout di servizio non riuscito è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

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

    "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 seguendo la stessa procedura prevista per qualsiasi errore 4XX o 5XX. Consulta i playbook sugli errori di runtime (4XX/5XX) per istruzioni su come risolvere i problemi relativi agli errori 4XX o 5XX.