Risoluzione degli errori di runtime dei callout di servizio

Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione Documentazione di Apigee X.
Informazioni

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> delle norme relative ai callout di servizio non è di tipo messaggio. Se la variabile è una stringa o qualsiasi altro tipo diverso dai messaggi, viene visualizzato questo errore.

Le variabili di tipo di messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso perimetrale integrate request, response e message sono di tipo "messaggio". Per scoprire di più sulle variabili dei messaggi, consulta la sezione Riferimento alle variabili.

Diagnosi

  1. Identifica le norme sui callout di servizio 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 all'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 del callout di servizio che non ha superato i controlli, verifica che il nome dell'insieme di variabili nell'elemento <Request> corrisponda al nome della variabile identificato nella stringa di errore (passaggio 1 sopra). Ad esempio, il seguente criterio specifica una variabile di richiesta denominata PostalCode, che corrisponde a quella 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, dove è stata definita prima la variabile.
    2. Nella maggior parte dei casi, scoprirai che la variabile del problema viene creata e compilata in un altro criterio che viene eseguito prima del criterio callout di servizio. Ad esempio, il criterio Assegna messaggio viene utilizzato comunemente per creare e compilare le variabili in un flusso di proxy API.
    3. Una volta stabilito il criterio in cui la variabile viene definita e compilata per primo, devi stabilire il tipo di variabile come segue:
      • 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 è un messaggio (ad esempio una stringa), ciò è la causa dell'errore. Per saperne di più sulle variabili comuni e sui relativi tipi, consulta la documentazione di riferimento sulle variabili.

Ad esempio, supponiamo che la variabile PostalCode a cui si fa riferimento nel criterio di callout del 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>

A questo punto, ricorda che la variabile PostalCode viene utilizzata nell'elemento <Request> del criterio relativo 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), ricevi il codice di errore steps.servicecallout.RequestVariableNotMessageType.

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> nel criterio relativo al callout di servizio non riuscito sia una variabile di flusso di tipo messaggio esistente oppure, in alternativa, puoi creare una nuova variabile di tipo messaggio direttamente nel criterio callout di servizio (come spiegato nella documentazione relativa ai criteri) 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 nel criterio Assegna messaggio è di tipo "messaggio" e andrebbe bene anche nel criterio 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 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> delle norme sui callout di servizio non è di tipo messaggio di richiesta. Se la variabile è un tipo di messaggio di risposta, una stringa o di qualsiasi altro tipo, viene visualizzato questo errore.

Le variabili di tipo Message rappresentano intere richieste e risposte HTTP. Le variabili di flusso perimetrale integrate request, response e message sono di tipo "messaggio". Per saperne di più sulle variabili dei messaggi, consulta Riferimento sulle variabili.

Diagnosi

  1. Identifica le norme sui callout di servizio in cui si è verificato l'errore e il nome della variabile il cui tipo non è corretto. 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 del callout di servizio che non ha superato i controlli, verifica che il nome dell'insieme di variabili nell'elemento <Request> corrisponda al nome della variabile identificato nella stringa di errore (passaggio 1 sopra). Ad esempio, il seguente criterio specifica una variabile di richiesta denominata var_response, che corrisponde al 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 è di tipo messaggio di richiesta o meno:

    1. Individua il codice all'interno del bundle proxy API, dove è stata definita prima la variabile.
    2. Nella maggior parte dei casi, scoprirai che la variabile del problema viene creata e compilata in un altro criterio che viene eseguito prima del criterio callout di servizio. Ad esempio, il criterio Assegna messaggio viene utilizzato comunemente per creare e compilare le variabili in un flusso di proxy API.
    3. Una volta stabilito il criterio in cui la variabile viene definita e compilata per primo, devi stabilire il tipo di variabile come segue:
      • Controlla il valore dell'attributo type (se presente).
      • Se l'attributo type non è presente, la variabile viene considerata una stringa.
    4. Se il tipo della variabile non è di tipo messaggio di richiesta, è questa la causa dell'errore. Per saperne di più sulle variabili comuni e sui relativi tipi, consulta il Riferimento sulle variabili.

Ad esempio, supponiamo che la variabile var_response a cui viene fatto riferimento nel criterio del callout del servizio sia stata creata nel criterio Assegna messaggio riportato di seguito. Tieni presente che a var_response viene assegnato il tipo response. Di conseguenza, 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> del criterio relativo al callout del 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 (il tipo è un messaggio di risposta), viene visualizzato il codice di errore: steps.servicecallout.RequestVariableNotRequestMessageType.

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> nel criterio relativo al callout di servizio non riuscito sia una variabile di tipo request message esistente oppure, in alternativa, puoi creare una nuova variabile di tipo di messaggio di richiesta direttamente nel criterio relativo al 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 che sia di tipo messaggio di richiesta, che funzionerà nel criterio 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 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 non corretto L'URL di destinazione nel criterio relativo al callout di servizio non è nel formato corretto o ha un nome host non valido o irraggiungibile.
Errore del server di backend Il server di backend restituisce una risposta di errore 4XX o 5XX.

Causa: URL non valido o non corretto

L'URL di destinazione nel criterio relativo al callout di servizio non è nel formato corretto o ha un nome host non valido o irraggiungibile.

Diagnosi

  1. Identifica le norme relative al callout del 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 per il callout di servizio non riuscito è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Nel criterio relativo al callout di servizio che non ha superato il test, esamina l'elemento <URL>. Se il formato non è valido o ha un nome host non valido o irraggiungibile, la causa dell'errore è questa. Ad esempio, le seguenti norme sui 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 va a buon fine e restituisce l'errore: Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Risoluzione

Assicurati che l'elemento <URL> nei criteri relativi al callout di servizio non riuscito abbia un URL valido con un nome host raggiungibile.

Per correggere le norme relative ai 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 4XX o 5XX.

Diagnosi

  1. Identifica il criterio di callout del servizio che ha 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 per il callout di servizio non riuscito è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Esamina il faultstring nel corpo della risposta all'errore e controlla se sono presenti codici di risposta 4XX o 5XX elencati nel Reason. Ad esempio, la seguente stringa di errore indica chiaramente che dal server di backend è stato 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 seguendo la stessa procedura utilizzata per l'errore 4XX o 5XX. Per istruzioni sulla risoluzione degli errori 4XX o 5XX, consulta i playbook relativi agli errori di runtime (4XX/5XX).