Risoluzione degli errori di runtime di ServiceCallout

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

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 sui callout di servizio non è di tipo message. Se la variabile è una stringa o un altro tipo che non è un messaggio, verrà visualizzato questo errore.

Le variabili del tipo di messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso integrate request, response e message sono di tipo message.

Diagnosi

  1. Identifica il criterio ServiceCallout 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, nell'faultstring seguente, il nome del criterio è ExecuteGeocodingRequest e la variabile è PostalCode:

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

  2. Nel codice XML del criterio di callout di servizio non riuscito, verifica che il nome della variabile impostata 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 al contenuto della colonna 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 del criterio ServiceCallout. Ad esempio, il criterio Assegna messaggio viene comunemente utilizzato per creare e compilare le variabili in un flusso proxy API.
    3. Una volta individuato 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 una stringa.
    4. Se il tipo di variabile non è messaggio (ad esempio una stringa), è questa la causa dell'errore. Per conoscere le variabili comuni e i rispettivi tipi, consulta il Riferimento per le variabili di flusso.

Ad esempio, supponiamo che la variabile PostalCode a cui viene fatto riferimento nel criterio ServiceCallout sia stata creata nel seguente criterioAssignMessage. 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>

Ora ricorda che la variabile PostalCode 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="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 ServiceCallout non riuscito sia una variabile di flusso di tipo message esistente oppure, in alternativa, puoi creare una nuova variabile di tipo di messaggio direttamente nel criterio ServiceCallout (come spiegato nelle norme di Callout di servizio) 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 funziona perfettamente nel criterio ServiceCallout. 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 message. Se la variabile è un tipo di messaggio di risposta, una stringa o qualsiasi altro tipo, verrà visualizzato questo errore.

La variabile di tipo message rappresenta intere richieste e risposte HTTP. Le variabili di flusso integrate request, response e message sono di tipo message.

Diagnosi

  1. Identifica il criterio ServiceCallout 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, nell'faultstring seguente, 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 codice XML del criterio di callout di servizio non riuscito, verifica che il nome della variabile impostata 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 della colonna 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 del criterio ServiceCallout. Ad esempio, il criterio Assegna messaggio viene comunemente utilizzato per creare e compilare le variabili in un flusso proxy API.
    3. Una volta individuato 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 una stringa.
    4. Se il tipo della variabile non è di tipo messaggio di richiesta, l'errore è dovuto a questo. Per conoscere le variabili comuni e i rispettivi tipi, consulta il Riferimento per le variabili di flusso.

Ad esempio, supponiamo che la variabile var_response a cui viene fatto riferimento nel criterio Callout di servizio sia stata creata nel seguente criterio Assegna messaggio. Tieni presente che a var_response viene assegnato il tipo response. Di conseguenza, il tipo di variabile var_response è 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 di ServiceCallout.

<?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), riceverai il codice di errore: steps.servicecallout.RequestVariableNotRequestMessageType.

Risoluzione

Assicurati che la variabile impostata nell'elemento <Request> del criterio ServiceCallout non riuscito sia una variabile di tipo message esistente oppure, in alternativa, puoi creare una nuova variabile del tipo di messaggio di richiesta direttamente nel criterio ServiceCallout (come spiegato nelle norme di ServiceCallout) e utilizzarla.

Per correggere il criterio, devi modificare l'elemento <Request> in modo da specificare una variabile esistente o nuova di tipo "messaggio di richiesta" che funzionerà nelle norme ServiceCallout. 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"
        }
    }
}

Cause possibili

Le possibili cause di questo errore sono:

Causa Description
URL non valido o in un formato scorretto L'URL di destinazione nelle norme di ServiceCallout non è valido o ha un nome host non valido o irraggiungibile.
Errore del server di backend Il server di backend restituisce una risposta di errore di 4XX o 5XX.

Causa: URL non valido o in un formato non corretto

L'URL di destinazione nelle norme di ServiceCallout non è valido o ha un nome host non valido o irraggiungibile.

Diagnosi

  1. Identifica il criterio ServiceCallout che ha causato l'errore. Il nome del criterio viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nell'faultstring seguente, il nome del criterio di Callout di servizio non riuscito è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Nel criterio ServiceCallout non riuscito, esamina l'elemento <URL>. Se il formato non è corretto o presenta un nome host non valido o irraggiungibile, è questa la causa di questo errore. Ad esempio, le seguenti norme ServiceCallout 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. Di conseguenza, il criterio ServiceCallout non funziona e restituisce l'errore Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable.

Risoluzione

Assicurati che l'elemento <URL> nel criterio ServiceCallout non riuscito abbia un URL valido con un nome host raggiungibile.

Per correggere il criterio Callout di servizio mostrato 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.

Diagnosi

  1. Identifica il criterio ServiceCallout che ha causato l'errore. Il nome del criterio viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nell'faultstring seguente, il nome del criterio di Callout di servizio non riuscito è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

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

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

Risoluzione

Dopo aver determinato il codice di risposta di errore, puoi risolvere il problema come faresti per qualsiasi errore 4XX o 5XX.