Criterio riseFault

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

Cosa

Genera un messaggio personalizzato in risposta a una condizione di errore. Utilizza AlzaFault per definire una risposta di errore che viene restituita all'app richiedente quando si verifica una condizione specifica.

Per informazioni generali sulla gestione degli errori, consulta la sezione Gestione degli errori.

Samples

Restituire la risposta all'errore

Nell'uso più comune, RaiseFault viene utilizzato per restituire una risposta di errore personalizzata all'app che ha inviato la richiesta. Ad esempio, questo criterio restituirà un codice di stato 404 senza payload:

<RaiseFault name="404">
 <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
 <FaultResponse>
   <Set>
     <StatusCode>404</StatusCode>
     <ReasonPhrase>The resource requested was not found</ReasonPhrase>
   </Set>
 </FaultResponse>
</RaiseFault>

Payload FaultResponse di ritorno

Un esempio più complesso prevede la restituzione di un payload di risposta di errore personalizzato, insieme a intestazioni HTTP e un codice di stato HTTP. Nell'esempio seguente, la risposta di errore viene compilata con un messaggio XML contenente il codice di stato HTTP ricevuto da Edge dal servizio di backend e un'intestazione contenente il tipo di errore che si è verificato:

<RaiseFault name="ExceptionHandler">
 <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
 <FaultResponse>
   <Set>
     <Payload contentType="text/xml">
       <root>Please contact support@company.com</root>
     </Payload>
     <StatusCode>{response.status.code}</StatusCode>
     <ReasonPhrase>Server error</ReasonPhrase>
   </Set>
   <Add>
     <Headers>
       <Header name="FaultHeader">{fault.name}</Header>
     </Headers>
   </Add>
 </FaultResponse>
</RaiseFault>

Per un elenco di tutte le variabili disponibili per il completamento dinamico dei messaggi FaultResponse, consulta la sezione Informazioni sulle variabili

Gestire gli errori dei callout di servizio


Informazioni sul criterio RaiseFault

Apigee Edge ti consente di eseguire una gestione personalizzata delle eccezioni utilizzando un criterio di tipo RaiseFault. Il criterio AlzaFault, simile al criterio AssignMessage, consente di generare una risposta di errore personalizzata in risposta a una condizione di errore.

Utilizza il criterio AlzaFault per definire una risposta di errore che viene restituita all'app richiedente quando si verifica una condizione di errore specifica. La risposta di errore può essere composta da intestazioni HTTP, parametri di query e un payload di messaggi. Una risposta di errore personalizzata può essere più utile per gli sviluppatori e gli utenti finali di app rispetto ai messaggi di errore generici o ai codici di risposta HTTP.

Quando viene eseguito, il criterio AlzaFault trasferisce il controllo dal flusso attuale al flusso di errori, che poi restituisce la risposta di errore designata all'app client che ha inviato la richiesta. Quando il flusso del messaggio passa al flusso di errori, non viene eseguita un'ulteriore elaborazione del criterio. Tutti i restanti passaggi di elaborazione vengono ignorati e la risposta di errore viene restituita direttamente all'app richiedente.

Puoi utilizzare RaiseFault in un ProxyEndpoint o TargetEndpoint. In genere, è necessario collegare una condizione al criterio AlzaFault. Dopo l'esecuzione di AlzaFault, Apigee esegue la normale elaborazione degli errori, valutando FaultRules oppure, se non sono state definite regole di errore, termina l'elaborazione della richiesta.

Riferimento elemento

Il riferimento all'elemento descrive gli elementi e gli attributi del criterio AlzaFault.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">
    <DisplayName>RaiseFault 1</DisplayName>
    <FaultResponse>
        <AssignVariable>
          <Name/>
          <Value/>
        </AssignVariable>
        <Add>
            <Headers/>
        </Add>
        <Copy source="request">
            <Headers/>
            <StatusCode/>
            <ReasonPhrase/>
        </Copy>
        <Remove>
            <Headers/>
        </Remove>
        <Set>
            <Headers/>
            <Payload/>
            <ReasonPhrase/>
            <StatusCode/>
        </Set>
    </FaultResponse>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>

Attributi <RaiseFault>

<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-1">

La tabella seguente descrive gli attributi comuni a tutti gli elementi principali dei criteri:

Attributo Descrizione Predefinito Presenza
name

Il nome interno della norma. Il valore dell'attributo name può contenere lettere, numeri, spazi, trattini, trattini bassi e punti. Questo valore non può superare i 255 caratteri.

Facoltativamente, utilizza l'elemento <DisplayName> per etichettare il criterio nell'editor proxy dell'interfaccia utente di gestione con un nome diverso in linguaggio naturale.

N/A Obbligatorie
continueOnError

Impostalo su false per restituire un errore in caso di errore di un criterio. Questo è il comportamento previsto per la maggior parte dei criteri.

Imposta su true per fare in modo che l'esecuzione del flusso continui anche in caso di errore di un criterio.

false Facoltativo
enabled

Imposta il criterio su true per applicare il criterio.

Impostala su false per disattivare il criterio. Il criterio non verrà applicato anche se rimane associato a un flusso.

true Facoltativo
async

Questo attributo è obsoleto.

false Deprecata

Elemento <DisplayName>

Utilizzalo in aggiunta all'attributo name per etichettare il criterio nell'editor proxy dell'interfaccia utente di gestione con un nome diverso in linguaggio naturale.

<DisplayName>Policy Display Name</DisplayName>
Predefinito

N/A

Se ometti questo elemento, viene utilizzato il valore dell'attributo name del criterio.

Presenza Facoltativo
Tipo Stringa

Elemento <IgnoraUnresolvedVariables>

(Facoltativo) Ignora eventuali errori di variabili non risolti nel flusso. Valori validi: true/false. Valore predefinito: true.

Elemento <FaultResponse>

(Facoltativo) Definisce il messaggio di risposta restituito al client richiedente. FaultResponse utilizza le stesse impostazioni del criterio AttributionMessage (non disponibile in Apigee Edge per il cloud privato).

Elemento <FaultResponse><AssignVariable>

Assegna un valore a una variabile di flusso di destinazione. Se la variabile di flusso non esiste, viene creata da AssignVariable.

Ad esempio, utilizza il codice seguente per impostare la variabile denominata myFaultVar nel criterio AlzaFault:

<FaultResponse>
  <AssignVariable>
    <Name>myFaultVar</Name>
    <Value>42</Value>
  </AssignVariable>
  ...
</FaultResponse>

Potrai quindi fare riferimento a quella variabile nei modelli di messaggi in un secondo momento nel criterio AlzaFault. Inoltre, un criterio associato a una FaultRule può accedere alla variabile. Ad esempio, il seguente criterio di AssegnaMessage utilizza la variabile impostata in AlzaFault per impostare un'intestazione nella risposta di errore:

<AssignMessage enabled="true" name="Assign-Message-1">
  <Add>
    <Headers>
      <Header name="newvar">{myFaultVar}</Header>
    </Headers>
  </Add>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="response"/>
</AssignMessage>

<AssignVariable> nel criterio AlzaFault utilizza la stessa sintassi dell'elemento <AssignVariable> nel criterio AssignMessage. Tieni presente che questa funzionalità non è attualmente disponibile in Apigee Edge per il cloud privato.

Elemento <FaultResponse><Add>/<Headers>

Aggiunge intestazioni HTTP al messaggio di errore. Tieni presente che l'intestazione vuota <Add><Headers/></Add> non ne aggiunge altre. Questo esempio copia il valore della variabile di flusso request.user.agent nell'intestazione.

<Add>
    <Headers>
        <Header name="user-agent">{request.user.agent}</Header>
    </Headers>
</Add>

Predefinito:

N/A

Presenza:

Facoltativo

Tipo:

Stringa

Elemento <FaultResponse><Copy>

Copia le informazioni dal messaggio specificato dall'attributo source in il messaggio di errore.

    <Copy source="request">
        <Headers/>
        <StatusCode/>
        <ReasonPhrase/>
    </Copy>

Predefinito:

N/A

Presenza:

Facoltativo

Tipo:

Stringa

Attributi

 <Copy source="response">
Attributo Descrizione Presenza Tipo
origine

Specifica l'oggetto di origine della copia.

  • Se l'origine non è specificata, viene considerata come un semplice messaggio. Ad esempio, se il criterio si trova nel flusso di richiesta, l'origine utilizzerà per impostazione predefinita l'oggetto request. Se il criterio si trova nel flusso di risposta, per impostazione predefinita sarà l'oggetto response. Se ometti source, puoi utilizzare un riferimento assoluto a una variabile di flusso come origine della copia. Ad esempio, specifica il valore come {request.header.user-agent}.
  • Se la variabile di origine non può essere risolta o se si risolve in un tipo diverso da messaggio, <Copy> non risponde.
Facoltativo Stringa

Elemento <FaultResponse><Copy>/<Headers>

Copia l'intestazione HTTP specificata dall'origine al messaggio di errore. Per copiare tutte le intestazioni, specifica <Copy><Headers/></Copy>.

<Copy source='request'>
    <Headers>      
        <Header name="headerName"/>
    </Headers> 
</Copy>

Se sono presenti più intestazioni con lo stesso nome, utilizza la seguente sintassi:

<Copy source='request'>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
</Copy>

In questo esempio vengono copiati "h1", "h2" e il secondo valore di "h3". Se "h3" ha un solo valore, non viene copiato.

Predefinito:

N/A

Presenza:

Facoltativo

Tipo:

Stringa

Elemento <FaultResponse><Copy>/<StatusCode>

Il codice di stato HTTP da copiare dall'oggetto specificato dall'attributo source al messaggio di errore.

<Copy source='response'>
    <StatusCode>404</StatusCode>      
</Copy>

Predefinito:

false

Presenza:

Facoltativo

Tipo:

Stringa

Elemento <FaultResponse><Copy>/<ReasonPhrase>

La descrizione del motivo da copiare dall'oggetto specificato dall'attributo di origine al messaggio di errore.

<Copy source='response'>     
    <ReasonPhrase>The resource requested was not found.</ReasonPhrase>     
</Copy>

Predefinito:

false

Presenza:

Facoltativo

Tipo:

Stringa

Elemento <FaultResponse><Remove>/<Headers>

Rimuove le intestazioni HTTP specificate dal messaggio di errore. Per rimuovere tutte le intestazioni, specifica <Remove><Headers/></Remove>. Questo esempio rimuove l'intestazione user-agent dal messaggio.

<Remove>     
    <Headers>      
        <Header name="user-agent"/>     
    </Headers> 
</Remove>

Se sono presenti più intestazioni con lo stesso nome, utilizza la seguente sintassi:

<Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
</Remove>

Questo esempio rimuove "h1", "h2" e il secondo valore di "h3". Se "h3" ha un solo valore, non viene rimosso.

Predefinito:

N/A

Presenza:

Facoltativo

Tipo:

Stringa

Elemento <FaultResponse><Set>

Consente di impostare le informazioni nel messaggio di errore.

    <Set>
        <Headers/>
        <Payload> </Payload>
        <StatusCode/>
        <ReasonPhrase/>
    </Set>

Predefinito:

N/A

Presenza:

Facoltativo

Tipo:

N/A

Elemento <FaultResponse>/<Set>/<Headers>

Consente di impostare o sovrascrivere le intestazioni HTTP nel messaggio di errore. Tieni presente che l'intestazione vuota <Set><Headers/></Set> non imposta alcuna intestazione. Questo esempio imposta l'intestazione user-agent sulla variabile del messaggio specificata con l'elemento <AssignTo>.

<Set>
    <Headers>
        <Header name="user-agent">{request.header.user-agent}</Header>     
    </Headers>
</Set>

Predefinito:

N/A

Presenza:

Facoltativo

Tipo:

Stringa

Elemento <FaultResponse>/<Set>/<Payload>

Imposta il payload del messaggio di errore.

<Set>
    <Payload contentType="text/plain">test1234</Payload>
</Set>

Imposta un payload JSON:

<Set>
    <Payload contentType="application/json">
        {"name":"foo", "type":"bar"}
    </Payload>
</Set>

In un payload JSON puoi inserire variabili utilizzando gli attributi variablePrefix e variableSuffix con caratteri di delimitazione, come mostrato nell'esempio seguente.

<Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
        {"name":"foo", "type":"@variable_name#"}
    </Payload>
</Set>

oppure, a partire dalla release 16.08.17 del cloud, puoi anche utilizzare le parentesi graffe per inserire le variabili:

<Set>
    <Payload contentType="application/json">
        {"name":"foo", "type":"{variable_name}"}
    </Payload>
</Set>

Imposta un payload misto in XML:

<Set>
    <Payload contentType="text/xml">
        <root>
          <e1>sunday</e1>
          <e2>funday</e2>
          <e3>{var1}</e3>
    </Payload>
</Set>

Predefinito:

Presenza:

Facoltativo

Tipo:

Stringa

Attributi

 
<Payload contentType="content_type" variablePrefix="char" variableSuffix="char">
Attributo Descrizione Presenza Tipo
contentType

Se è specificato contentType, il suo valore viene assegnato all'intestazione Content-Type.

Facoltativo Stringa
variablePrefix Facoltativamente, specifica il delimitatore iniziale in una variabile di flusso perché i payload JSON non possono utilizzare il carattere "{" predefinito. Facoltativo Carbone
variableSuffix Facoltativamente, specifica il delimitatore finale su una variabile di flusso perché i payload JSON non possono utilizzare il carattere "}" predefinito. Facoltativo Carbone

Elemento <FaultResponse>/<Set>/<StatusCode>

Imposta il codice di stato della risposta.

<Set source='request'>
    <StatusCode>404</StatusCode>
</Set>

Predefinito:

false

Presenza:

Facoltativo

Tipo:

Booleano

Elemento <FaultResponse>/<Set>/<Reasonphrase>

Imposta la frase di motivazione della risposta.

<Set source='request'>     
    <ReasonPhrase>The resource requested was not found.</ReasonPhrase>
</Set>

Predefinito:

false

Presenza:

Facoltativo

Tipo:

Booleano

Elemento <ShortFaultReason>

Specifica di visualizzare un breve motivo dell'errore nella risposta:

<ShortFaultReason>true|false</ShortFaultReason>

Per impostazione predefinita, il motivo dell'errore nella risposta del criterio è:

"fault":{"faultstring":"Raising fault. Fault name : Raise-Fault-1","detail":{"errorcode":"errorCode"}}}

Per rendere il messaggio più leggibile, puoi impostare l'elemento <ShortFaultReason> su true per accorciare faultstring al solo nome del criterio:

"fault":{"faultstring":"Raise-Fault-1","detail":{"errorcode":"errorCode"}}}

Valori validi: true/false(valore predefinito).

Predefinito:

false

Presenza:

Facoltativo

Tipo:

Booleano

Variabili di flusso

Le variabili di flusso consentono il comportamento dinamico dei criteri e dei flussi in fase di runtime, in base alle intestazioni HTTP, ai contenuti dei messaggi o al contesto del flusso. Le seguenti variabili di flusso predefinite sono disponibili dopo l'esecuzione di un criterio AlzaFault. Per ulteriori informazioni sulle variabili di flusso, consulta le informazioni di riferimento sulle variabili.

Variabile Tipo Autorizzazione Descrizione
fault.name Stringa Sola lettura Quando viene eseguito il criterio AlzaFault, questa variabile viene sempre impostata sulla stringa RaiseFault.
fault.type Stringa Sola lettura Restituisce il tipo di errore nell'errore e, se non disponibile, una stringa vuota.
fault.category Stringa Sola lettura Restituisce la categoria di errore nell'errore e, se non disponibile, una stringa vuota.

Esempio di utilizzo di RaiseFault

L'esempio seguente utilizza una condizione per forzare la presenza di un elemento queryparam con il nome zipcode nella richiesta in entrata. Se queryparam non è presente, il flusso genererà un guasto tramite AlzaFault:

<Flow name="flow-1">
  <Request>
    <Step>
        <Name>RF-Error-MissingQueryParam</Name>
        <Condition>request.queryparam.zipcode = null</Condition>
    </Step>
   ...
   </Request>
   ...
   <Condition>(proxy.pathsuffix MatchesPath "/locations") and (request.verb = "GET")</Condition>
</Flow>
Di seguito viene illustrato che cosa sarebbe presente in RaiseFault:
<RaiseFault name='RF-Error-MissingQueryParam'>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <FaultResponse>
    <Set>
      <Payload contentType='application/json'>{
  "error" : {
    "code" : 400.02,
    "message" : "invalid request. Pass a zipcode queryparam."
  }
}
</Payload>
      <StatusCode>400</StatusCode>
      <ReasonPhrase>Bad Request</ReasonPhrase>
    </Set>
  </FaultResponse>
</RaiseFault>

Messaggi di errore

Questa sezione descrive i codici e i messaggi di errore restituiti e le variabili di errore impostate da Edge quando questo criterio attiva un errore. Queste informazioni sono importanti per sapere se si stanno sviluppando regole di errore per gestire gli errori. Per scoprire di più, consulta gli articoli Cosa devi sapere sugli errori relativi alle norme e Gestione degli errori.

Errori di runtime

Questi errori possono verificarsi quando il criterio viene eseguito.

Codice di errore Stato HTTP Causa
steps.raisefault.RaiseFault 500 Vedi stringa di errore.

Errori di deployment

Nessuna.

Variabili di errore

Queste variabili vengono impostate quando si verifica un errore di runtime. Per maggiori informazioni, consulta la sezione Cosa devi sapere sugli errori relativi ai criteri.

Variabili Dove Esempio
fault.name="fault_name" fault_name è il nome dell'errore, come indicato nella tabella Errori di runtime riportata sopra. Il nome dell'errore è l'ultima parte del codice di errore. fault.name = "RaiseFault"
raisefault.policy_name.failed policy_name è il nome specificato dall'utente del criterio che ha generato l'errore. raisefault.RF-ThrowError.failed = true

Esempio di risposta di errore

{
   "fault":{
      "detail":{
         "errorcode":"steps.raisefault.RaiseFault"
      },
      "faultstring":"Raising fault. Fault name: [name]"
   }
}

Schema

Ogni tipo di criterio è definito da uno schema XML (.xsd). Come riferimento, gli schemi dei criteri sono disponibili su GitHub.

Argomenti correlati

Consulta la sezione Gestione degli errori