Risoluzione dei problemi relativi agli 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> del criterio ServiceCallout non è di tipo message. Se la variabile è una stringa o un altro tipo non di messaggio, viene visualizzato questo errore.

Le variabili di 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 la policy 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, nel 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 ServiceCallout non riuscita, 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, la seguente policy specifica una variabile di richiesta denominata PostalCode, che corrisponde a quella presente 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 del proxy API in cui è stata definita per la prima volta la variabile.
    2. Nella maggior parte dei casi, la variabile del problema viene creata e compilata in un'altra norma eseguita prima della norma ServiceCallout. Ad esempio, il criterio Assign Message viene comunemente utilizzato per creare e compilare variabili in un flusso proxy API.
    3. Una volta individuata la policy in cui la variabile viene definita e compilata per prima, 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 è un messaggio (ad esempio una stringa), questo è il motivo dell'errore. Puoi scoprire di più sulle variabili comuni e sui relativi tipi nella guida di riferimento alle variabili di flusso.

Ad esempio, supponiamo che la variabile PostalCode a cui viene fatto riferimento nel criterio ServiceCallout sia stata creata nel seguente criterio AssignMessage. Tieni presente che a PostalCode viene assegnato il valore della variabile di flusso request.queryparam.postalcode. Questo valore è una stringa perché nell'assegnazione della variabile non è presente alcun attributo 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>

Ora, ricorda che la variabile PostalCode viene utilizzata nell'elemento <Request> della norma 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> nella policy ServiceCallout non riuscita sia una variabile di flusso di tipo message esistente oppure puoi creare una nuova variabile di tipo messaggio direttamente nella policy ServiceCallout (come spiegato in Policy ServiceCallout) e utilizzarla.

Per correggere la policy, 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 funzionerebbe 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> del criterio ServiceCallout non è di tipo message. Se la variabile è un tipo di messaggio di risposta, una stringa o qualsiasi altro tipo, viene 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 la policy 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, nel 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 ServiceCallout non riuscita, 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, 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" 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 del proxy API in cui è stata definita per la prima volta la variabile.
    2. Nella maggior parte dei casi, la variabile del problema viene creata e compilata in un'altra norma eseguita prima della norma ServiceCallout. Ad esempio, il criterio Assign Message viene comunemente utilizzato per creare e compilare variabili in un flusso proxy API.
    3. Una volta individuata la policy in cui la variabile viene definita e compilata per prima, 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, questo è il motivo dell'errore. Puoi scoprire di più sulle variabili comuni e sui relativi tipi nella guida di riferimento alle variabili di flusso.

Ad esempio, supponi che la variabile var_response a cui viene fatto riferimento nel criterio ServiceCallout sia stata creata nel seguente criterio 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" 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 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 (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 ServiceCallout non riuscita sia una variabile di tipo message esistente oppure puoi creare una nuova variabile di tipo messaggio di richiesta direttamente nella policy ServiceCallout (come spiegato in Policy ServiceCallout) 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 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 Descrizione
URL non valido o malformato L'URL di destinazione nella policy ServiceCallout ha un formato non corretto o 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 malformato

L'URL di destinazione nella policy ServiceCallout ha un formato non corretto o un nome host non valido o non raggiungibile.

Diagnosi

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

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. Nella policy ServiceCallout non riuscita, esamina l'elemento <URL>. Se è malformato o ha un nome host non valido o irraggiungibile, questo è il motivo dell'errore. Ad esempio, la seguente policy ServiceCallout specifica un <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 ServiceCallout non riesce e viene visualizzato 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 la policy ServiceCallout mostrata sopra, puoi modificare l'elemento <URL> per 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 ServiceCallout che ha causato l'errore. Il nome della norma viene visualizzato nell'elemento faultstring della risposta di errore. Ad esempio, nel seguente faultstring, il nome della policy ServiceCallout non riuscita è ExecuteGeocodingRequest.

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. Esamina 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 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 come faresti con qualsiasi errore 4XX o 5XX.