Assegna criterio Assegna messaggio

Questa pagina si applica a Apigee e Apigee ibrido.

Visualizza la documentazione di Apigee Edge.

icona norme

Cosa

Il criterioAssignMessage può modificare un messaggio di richiesta o risposta esistente oppure creare un nuovo messaggio di richiesta o risposta durante il flusso del proxy API. Il criterio consente di eseguire le azioni seguenti sui messaggi:

  • Aggiungere nuovi parametri di modulo, intestazioni o parametri di ricerca a un messaggio.
  • Copiare proprietà esistenti da un messaggio all'altro
  • Rimuovi da un messaggio intestazioni, parametri di ricerca, parametri del modulo e payload dei messaggi
  • Imposta il valore delle proprietà in un messaggio

AssegnaMessage anche consente di impostare variabili di contesto arbitrarie, indipendentemente da una qualsiasi delle operazioni descritte in precedenza che potrebbero essere applicate a un messaggio.

Con AssegnaMessage puoi aggiungere, modificare o rimuovere le proprietà della richiesta o della risposta. In alternativa, puoi utilizzareAssignMessage per creare un messaggio di richiesta o risposta personalizzato e passarlo a una destinazione alternativa, come descritto in Creare messaggi di richiesta personalizzati.

Questo criterio è un criterio estendibile e il suo utilizzo potrebbe avere implicazioni in termini di costi o utilizzo, a seconda della licenza Apigee. Per informazioni sui tipi di criteri e sulle implicazioni per l'utilizzo, consulta la pagina Tipi di criteri.

Il criterio AssegnaMessage può creare o modificare variabili di flusso con i seguenti elementi secondari:

L'ordine in cui organizzi gli elementi <Add>, <Copy>, <Set> e <Remove> è importante. Il criterio esegue queste azioni nell'ordine in cui vengono visualizzate nella configurazione del criterio. Se devi rimuovere tutte le intestazioni e impostare un'intestazione specifica, devi includere l'elemento <Remove> prima dell'elemento <Set>.

<AssignMessage> elemento

Definisce un criterioAssignMessage.

Valore predefinito Consulta la scheda Criterio predefinito di seguito
Obbligatorio? Obbligatorio
Tipo Oggetto complesso
Elemento principale N/A
Elementi secondari <Add>
<AssignTo>
<AssignVariable>
<Copy>
<DisplayName>
<IgnoreUnresolvedVariables>
<Remove>
<Set>

L'elemento <AssignMessage> utilizza la seguente sintassi:

Sintassi

L'elemento <AssignMessage> utilizza la seguente sintassi:

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- All AssignMessage child elements are optional -->
  <Add>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Add>

  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>

  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <PropertySetRef>SOURCE_VARIABLE</PropertySetRef>
    <Ref>SOURCE_VARIABLE</Ref>
    <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL>
    <Template>MESSAGE_TEMPLATE</Template>
    or
    <Template ref='TEMPLATE_VARIABLE'></Template>
    <Value>VARIABLE_VALUE</Value>
  </AssignVariable>

  <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <!-- Copy all headers -->
    <Headers/>
    <!-- or, copy specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>

  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>

  <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>

  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all form parameters -->
    <FormParams/>
    <!-- or, remove specific form parameters by name -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME"/>
      <!-- or -->
      <FormParam name="FORMPARAM_NAME">[false|true]</FormParam>
      ...
    </FormParams>
    <!-- Remove all headers -->
    <Headers/>
    <!-- or, remove specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Remove all query parameters -->
    <QueryParams/>
    <!-- or, remove specific query parameters by name -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME"/>
      <!-- or -->
      <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam>
      ...
    </QueryParams>
  </Remove>

  <Set>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <Path>PATH</Path>
    <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX"
        variableSuffix="SUFFIX">NEW_PAYLOAD</Payload>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>

</AssignMessage>

Criterio predefinito

L'esempio seguente mostra le impostazioni predefinite quando aggiungi un criterioAssignMessage al tuo flusso nella UI di Apigee:

<AssignMessage continueOnError="false" enabled="true" name="assign-message-default">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <Copy source="request">
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <Payload/>
    <Verb/>
    <StatusCode/>
    <Path/>
  </Copy>
  <Remove>
    <Headers>
      <Header name="h1"/>
    </Headers>
    <QueryParams>
      <QueryParam name="q1"/>
    </QueryParams>
    <FormParams>
      <FormParam name="f1"/>
    </FormParams>
    <Payload/>
  </Remove>
  <Add>
    <Headers/>
    <QueryParams/>
    <FormParams/>
  </Add>
  <Set>
    <Headers/>
    <QueryParams/>
    <FormParams/>
    <!-- <Verb>GET</Verb> -->
    <Path/>
  </Set>
  <AssignVariable>
    <Name>name</Name>
    <Value/>
    <Ref/>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Quando si inserisce un nuovo criterioAssignMessage nella UI di Apigee, il modello contiene stub per tutte le operazioni possibili. In genere, devi selezionare le operazioni che vuoi eseguire con questo criterio e rimuovere gli altri elementi secondari. Ad esempio, se vuoi eseguire un'operazione di copia, utilizza l'elemento <Copy> e rimuovi <Add>, <Remove> e altri elementi secondari dal criterio per renderlo più leggibile.

Questo elemento ha i seguenti attributi comuni a tutti i criteri:

Attributo Predefinito Obbligatorio? Descrizione
name N/A Obbligatorio

Il nome interno del criterio. 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.

continueOnError falso Facoltativo Imposta su false per restituire un errore in caso di errore del criterio. Questo è un comportamento previsto per la maggior parte dei criteri. Imposta su true per continuare l'esecuzione del flusso anche dopo un errore nel criterio. Vedi anche:
enabled true Facoltativo Imposta su true per applicare il criterio. Imposta su false per disattivare il criterio. Il criterio non verrà applicato anche se rimane collegato a un flusso.
async   falso Deprecato Questo attributo è stato ritirato.

La seguente tabella fornisce una descrizione generale degli elementi secondari di <AssignMessage>:

Elemento secondario Obbligatorio? Descrizione
Operazioni comuni
<Add> Facoltativo Aggiunge informazioni all'oggetto del messaggio specificato dall'elemento <AssignTo>.

<Add> aggiunge al messaggio intestazioni o parametri che non esistono nel messaggio originale. Tieni presente che anche <Set> offre questa funzionalità.

Per sovrascrivere le intestazioni o i parametri esistenti, utilizza l'elemento <Set>.

<Copy> Facoltativo Copia le informazioni dal messaggio specificato dall'attributo source nell'oggetto specificato dall'elemento <AssignTo>.
<Remove> Facoltativo Elimina gli elementi specificati dalla variabile di messaggio specificata nell'elemento <AssignTo>.
<Set> Facoltativo Sostituisce i valori delle proprietà esistenti nella richiesta o nella risposta, specificati dall'elemento <AssignTo>.

<Set> sovrascrive le intestazioni o i parametri già esistenti nel messaggio originale o ne aggiunge di nuovi, se non sono presenti.

Altri elementi secondari
<AssignTo> Facoltativo Specifica su quale messaggio funziona il criterioAssignMessage. Può essere la richiesta o la risposta standard oppure un nuovo messaggio personalizzato.
<AssignVariable> Facoltativo Assegna un valore a una variabile di flusso. Se la variabile non esiste, <AssignVariable> la crea.
<IgnoreUnresolvedVariables> Facoltativo Determina se l'elaborazione si interrompe quando viene rilevata una variabile non risolta.

Nelle sezioni che seguono viene descritto ognuno di questi elementi secondari.

Esempi

I seguenti esempi mostrano alcuni dei modi in cui puoi utilizzare il criterioAssignMessage:

1: Aggiungi intestazione

Nell'esempio seguente viene aggiunta un'intestazione alla richiesta con l'elemento <Add>:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

2: Rimuovi payload

Nell'esempio seguente viene eliminato il payload dalla risposta con l'elemento <Remove>:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

3: Modifica la risposta

Nell'esempio seguente, modifica un oggetto risposta esistente aggiungendo un'intestazione:

<AssignMessage name="AM-modify-response">
  <Set>
    <Headers>
      <Header name="Cache-Hit">{lookupcache.LookupCache-1.cachehit}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

Questo esempio non crea un nuovo messaggio. ma modifica un messaggio di risposta esistente aggiungendo un'intestazione HTTP.

Poiché in questo esempio viene specificato response come nome della variabile nell'elemento <AssignTo>, questo criterio modifica l'oggetto di risposta impostato inizialmente con i dati restituiti dal server di destinazione.

L'intestazione HTTP aggiunta al messaggio di risposta da questo criterio deriva da una variabile compilata dal criterio LookupCache. Pertanto, il messaggio di risposta modificato da questo criterio Assegna messaggio contiene un'intestazione HTTP che indica se i risultati sono stati estratti dalla cache o meno. L'impostazione delle intestazioni nella risposta può essere utile per il debug e la risoluzione dei problemi.

4. Impostazione dei contenuti dinamici

Puoi utilizzare AttributionMessage per incorporare contenuti dinamici nel payload dei messaggi di risposta e richiesta.

Per incorporare le variabili di flusso in un payload XML, racchiudi la variabile designata tra parentesi graffe, in questo modo: {prefix.name}.

L'esempio seguente incorpora il valore della variabile del flusso dell'intestazione HTTP user-agent in un elemento XML denominato User-agent:

<AssignMessage name="AM-set-dynamic-content">
  <AssignTo>response</AssignTo>
  <Set>
    <Payload contentType="text/xml">
      <User-agent>{request.header.user-agent}</User-agent>
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

Per i payload JSON, puoi inserire le variabili utilizzando gli attributi variablePrefix e variableSuffix con caratteri di delimitazione, come mostrato nell'esempio seguente:

<AssignMessage name="set-payload">
  <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
  {
     "user-agent": "@request.header.user-agent#"
  }
  </Payload>
</AssignMessage>

Per un elenco completo delle variabili di flusso, consulta Riferimento per le variabili di flusso.

Puoi anche utilizzare le parentesi graffe per inserire le variabili.

5. Rimozione del parametro di query

L'esempio seguente rimuove il parametro di query apikey dalla richiesta:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Ti consigliamo di rimuovere il parametro di query apikey dal messaggio della richiesta quando utilizzi il criterio VerifyAPIKey per l'autenticazione utente. In questo modo eviterai che le informazioni chiave sensibili vengano passate alla destinazione del backend.

6. Imposta/Ottieni le variabili

L'esempio seguente utilizza tre criteri AssegnaMessage:

  1. Crea tre variabili di flusso nella richiesta, con valori statici
  2. Ottiene le variabili di flusso in modo dinamico in un secondo criterio nel flusso di richiesta
  3. Le imposta nel payload della risposta
<!-- Policy #1: Set variables in the request -->
<AssignMessage name="AM-set-variables">
    <!-- Create a variable named myAppSecret -->
    <AssignVariable>
        <Name>myAppSecret</Name>
        <Value>42</Value>
    </AssignVariable>
    <!-- Create a variable named config.environment -->
    <AssignVariable>
        <Name>config.environment</Name>
        <Value>test</Value>
    </AssignVariable>
    <!-- Create a variable named config.protocol -->
    <AssignVariable>
        <Name>config.protocol</Name>
        <Value>gopher</Value>
    </AssignVariable>
</AssignMessage>

Nel primo criterio, l'elemento <AssignVariable> crea e imposta tre variabili nella richiesta. Ogni elemento <Name> specifica un nome variabile, mentre <Value> specifica il valore.

Il secondo criterio utilizza l'elemento <AssignVariable> per leggere i valori e crea tre nuove variabili:

<!-- Policy #2: Get variables from the request -->
<AssignMessage continueOnError="false" enabled="true" name="get-variables">
  <AssignTo createNew="false" transport="http" type="request"/>
  <!-- Get the value of myAppSecret and create a new variable, secret -->
  <AssignVariable>
    <Name>secret</Name>
    <Ref>myAppSecret</Ref>
    <Value>0</Value>
  </AssignVariable>
  <!-- Get the value of config.environment and create a new variable, environment -->
  <AssignVariable>
    <Name>environment</Name>
    <Ref>config.environment</Ref>
    <Value>default</Value>
  </AssignVariable>
  <!-- Get the value of config.protocol and create a new variable, protocol -->
  <AssignVariable>
    <Name>protocol</Name>
    <Ref>config.protocol</Ref>
    <Value>default</Value>
  </AssignVariable>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

Nel secondo criterio, l'elemento <Ref> fa riferimento alla variabile di origine e gli elementi <Name> specificano i nomi delle nuove variabili. Se la variabile a cui fa riferimento l'elemento <Ref> non è accessibile, puoi utilizzare il valore specificato dall'elemento <Value>.

Per provare questo insieme di criteri:

  1. Aggiungi i criteri 1 e 2 al flusso di richiesta. Assicurati di inserire il criterio 1 prima del criterio 2.
  2. Aggiungi il terzo criterio nel flusso di risposta.
  3. Il terzo criterio utilizza l'elemento <Set> per aggiungere le variabili alla risposta. Nell'esempio seguente viene creato un payload XML nella risposta che Edge restituisce al client:
    <!-- Policy #3: Add variables to the response -->
    <AssignMessage continueOnError="false" enabled="true" name="put-em-in-the-payload">
      <DisplayName>put-em-in-the-payload</DisplayName>
      <Set>
        <Payload contentType="application/xml">
          <wrapper>
            <secret>{secret}</secret>
            <config>
              <environment>{environment}</environment>
              <protocol>{protocol}</protocol>
            </config>
          </wrapper>
        </Payload>
      </Set>
      <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
      <AssignTo createNew="false" transport="http" type="response"/>
    </AssignMessage>
    

    Tieni presente che la sintassi per accedere alle variabili di flusso in <Set> è racchiuderle tra parentesi graffe.

    Assicurati di impostare l'attributo contentType dell'elemento <Payload> su application/xml.

  4. Invia una richiesta al proxy API, ad esempio:
    curl -vL https://ahamilton-eval-test.apigee.net/myproxy

    Facoltativamente, puoi indirizzare i risultati tramite un'utilità come xmllint, in modo che il file XML venga visualizzato in una struttura formattata:

    curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -

    Il corpo della risposta dovrebbe avere il seguente aspetto:

    <wrapper>
      <secret>42</secret>
      <config>
        <environment>test</environment>
        <protocol>gopher</protocol>
      </config>
    </wrapper>

7: Recuperare le intestazioni delle risposte ServiceCallout

Nell'esempio riportato di seguito, supponiamo che nella richiesta proxy API sia presente un criterio ServiceCallout e che la risposta al callout contenga più intestazioni con lo stesso nome (Set-Cookie). Supponendo che la variabile di risposta del callout di servizio sia il valore predefinito calloutResponse, il seguente criterio ottiene il secondo valore dell'intestazione Set-Cookie.

<AssignMessage name="AM-Payload-from-SC-header">
  <Set>
    <Payload contentType="application/json">
      {"Cookies from Service Callout":" {calloutResponse.header.Set-Cookie.2}"}
    </Payload>
  </Set>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignTo>response</AssignTo>
</AssignMessage>

Per elencare tutti i valori dell'intestazione, utilizza la seguente variabile:

{calloutResponse.header.Set-Cookie.values}

8: Archiviare e rimuovere parametri del modulo, intestazioni e parametri di query

Se vuoi utilizzare <Remove> per eliminare intestazioni, parametri di ricerca o parametri del modulo, ma mantenere l'accesso ai relativi valori in un secondo momento nel flusso dei criteri, puoi archiviare i relativi valori utilizzando <AssignVariable>.

<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-StoreAndRemove">
  <DisplayName>AM-StoreAndRemove</DisplayName>
  <AssignVariable>
    <Name>var_grant_type</Name>
    <Ref>request.formparam.grant_type</Ref>
  </AssignVariable>
  <Remove>
    <Headers/>
    <FormParams/>
    <Payload/>
  </Remove>
  <Set>
    <Headers>
      <Header name="Content-Type">application/x-www-form-urlencoded</Header>
      <Header name="Accept">application/json</Header>
      <Header name="Grant-Type">{var_grant_type}</Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Ogni elemento secondario di questo riferimento ha esempi aggiuntivi. Per anche altri esempi, vedi l'esempio diAssignMessage su GitHub.

Riferimento elemento secondario

In questa sezione vengono descritti gli elementi secondari di <AssignMessage>.

<Add>

Aggiunge informazioni alla richiesta o alla risposta, specificate dall'elemento <AssignTo>.

L'elemento <Add> aggiunge nuove proprietà al messaggio che non esistono nel messaggio originale. Tieni presente che anche <Set> offre questa funzionalità. Per modificare i valori delle proprietà esistenti, utilizza l'elemento <Set>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Tipo complesso
Elemento principale <AssignMessage>
Elementi secondari <FormParams>
<Headers>
<QueryParams>

L'elemento <Add> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Esempio 1

L'esempio seguente utilizza l'elemento <FormParams> per ottenere i valori di tre parametri della stringa di query dalla richiesta iniziale e impostarli come parametri del modulo nella richiesta dell'endpoint di destinazione:

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente utilizza l'elemento <Headers> per aggiungere un'intestazione partner-id alla richiesta che verrà inviata all'endpoint di destinazione:

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 3

L'esempio seguente utilizza l'elemento <QueryParams> per aggiungere alla richiesta un singolo parametro di query con un valore statico:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Questo esempio utilizza <Add> nel pre-flusso della richiesta. Se esamini i risultati in uno strumento come Panoramica di debug, la richiesta a https://example-target.com/get diventa https://example-target.com/get?myParam=42.

Gli elementi secondari di <Add> supportano la sostituzione dinamica delle stringhe, nota come modelli di messaggi.

<FormParams> (secondario di <Add>)

Aggiunge nuovi parametri di modulo al messaggio di richiesta. Questo elemento non ha alcun effetto su un messaggio di risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di <FormParam> elementi
Elemento principale <Add>
Elementi secondari <FormParam>

L'elemento <FormParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
  </Add>
</AssignMessage>

Esempio 1

Nell'esempio seguente, alla richiesta viene aggiunto un singolo parametro di modulo (answer) e un valore statico (42):

<AssignMessage name="AM-add-formparams-1">
  <Add>
    <FormParams>
      <FormParam name="answer">42</FormParam>
    </FormParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente recupera il valore del parametro di query name e lo aggiunge alla richiesta come parametro del modulo, dopodiché rimuove il parametro di query:

<AssignMessage name="AM-Swap-QueryParam-to-FormParams">
  <Add>
    <FormParam name="name">{request.queryparam.name}</FormParam>
  </Add>
  <Remove>
    <QueryParam name="name"/>
  </Remove>
</AssignMessage>

Tieni presente che questo esempio non specifica un target con <AssignTo>. Questo criterio aggiunge il parametro solo alla richiesta.

Esempio 3

Nell'esempio seguente vengono aggiunti più parametri di modulo alla richiesta:

<AssignMessage name="AM-add-formparams-3">
  <Add>
    <FormParams>
      <FormParam name="username">{request.queryparam.name}</FormParam>
      <FormParam name="zip_code">{request.queryparam.zipCode}</FormParam>
      <FormParam name="default_language">{request.queryparam.lang}</FormParam>
    </FormParams>
  </Add>
  <Remove>
    <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Questo esempio ottiene i parametri della stringa di query dalla richiesta di origine e li aggiunge come parametri del modulo con nomi diversi. Successivamente, rimuove i parametri di ricerca originali. Apigee invierà la richiesta modificata all'endpoint di destinazione.

Puoi utilizzare Panoramica del debug per esaminare il flusso. Puoi notare che il corpo della richiesta contiene i dati del modulo codificati nell'URL, che erano stati originariamente trasmessi come parametri della stringa di query:

username=nick&zip_code=90210&default_language=en

Puoi utilizzare <FormParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbo HTTP: POST
  • Tipo di messaggio: richiesta
  • Uno (o entrambi) dei seguenti elementi:
    • Dati del modulo. Imposta un valore o "" (la stringa vuota). Ad esempio, con curl, aggiungi -d "" alla tua richiesta.
    • Intestazione Content-Length: impostata su 0 (se la richiesta originale non contiene dati, altrimenti la lunghezza attuale in byte). Ad esempio, con curl aggiungi -H "Content-Length: 0" alla tua richiesta.

Ad esempio:

curl -vL -X POST -d "" -H "Content-Type: application/x-www-form-urlencoded"
  https://ahamilton-eval-test.apigee.net/am-test

Quando aggiungi <FormParams>, Apigee imposta l'intestazione Content-Type della richiesta su application/x-www-form-urlencoded prima di inviare il messaggio al servizio di destinazione.

<Headers> (secondario di <Add>)

Aggiunge nuove intestazioni alla richiesta o alla risposta specificate, specificate dall'elemento <AssignTo>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di <Header> elementi
Elemento principale <Add>
Elementi secondari <Header>

L'elemento <Headers> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
  </Add>
</AssignMessage>

Esempio 1

L'esempio seguente aggiunge un'intestazione partner-id al messaggio di richiesta e assegna il valore della variabile di flusso verifyapikey.VAK-1.developer.app.partner-id a questa intestazione.

<AssignMessage name="AM-add-headers-1">
  <Add>
    <Headers>
      <Header name="partner-id">{verifyapikey.VAK-1.developer.app.partner-id}</Header>
    </Headers>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

<QueryParams> (secondario di <Add>)

Aggiunge nuovi parametri di ricerca alla richiesta. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di <QueryParam> elementi
Elemento principale <Add>
Elementi secondari <QueryParam>

L'elemento <QueryParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Add>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Add>
</AssignMessage>

Esempio 1

Nell'esempio seguente, il parametro di query myParam viene aggiunto alla richiesta e gli viene assegnato il valore 42:

<AssignMessage name="AM-add-queryparams-1">
  <Add>
    <QueryParams>
      <QueryParam name="myParam">42</QueryParam>
    </QueryParams>
  </Add>
  <AssignTo>request</AssignTo>
</AssignMessage>

Puoi utilizzare <QueryParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbi HTTP: GET, POST, PATCH, DELETE
  • Tipo di messaggio: richiesta

Inoltre, puoi impostare parametri di ricerca solo quando l'attributo type dell'elemento <AssignTo> è un messaggio di richiesta. L'impostazione nella risposta non ha alcun effetto.

Se definisci un array vuoto di parametri di ricerca nel criterio (<Add><QueryParams/></Add>), quest'ultimo non aggiunge alcun parametro di query. Equivale all'omissione di <QueryParams>.

<AssignTo>

Determina su quale oggetto opera il criterioAssignMessage. Le opzioni sono:

  • Messaggio di richiesta: il request ricevuto dal proxy API.
  • Messaggio di risposta: il response restituito dal server di destinazione.
  • Messaggio personalizzato: un oggetto richiesta o risposta personalizzato.

Tieni presente che, in alcuni casi, non è possibile modificare l'oggetto su cui agisce il criterioAssignMessage. Ad esempio, non puoi utilizzare <Add> o <Set> per aggiungere o modificare parametri di ricerca (<QueryParams>) o i parametri del modulo (<FormParams>) nella risposta. Puoi manipolare solo i parametri di ricerca e i parametri del modulo nella richiesta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignMessage>
Elementi secondari Nessuna

Se non specifichi <AssignTo> o se specifichi l'elemento <AssignTo>, ma non specifichi un valore di testo per l'elemento, il criterio agisce sulla richiesta o sulla risposta predefinita, che si basa su dove viene eseguito. Se il criterio viene eseguito nel flusso di richiesta, influisce sul messaggio di richiesta. Se viene eseguito nel flusso di risposta, il criterio influisce sulla risposta per impostazione predefinita.

L'elemento <AssignTo> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
</AssignMessage>

Esempio 1

L'esempio seguente non specifica nessun messaggio nel testo dell'istruzione <AssignTo>. Ciò implica che il criterio agirà sul messaggio request o response, a seconda di dove viene eseguito.

<AssignMessage name="assignto-1">
  <AssignTo createNew="false" transport="http" type="request"/> <!-- no-op -->
  ...
</AssignMessage>

Se specifichi createNew="false" e non fornisci esplicitamente un nome per il messaggio, gli altri attributi di <AssignTo> non sono pertinenti. In questo caso, potresti voler omettere completamente l'elemento <AssignTo>.

Esempio 2

Nell'esempio seguente viene creato un nuovo oggetto di richiesta, sovrascrivendo l'oggetto esistente:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request"/>
  ...
</AssignMessage>

Quando crei un nuovo oggetto di richiesta o risposta, gli altri elementi del criterioAssignMessage (come <Add>, <Set> e <Copy>) agiscono su quel nuovo oggetto di richiesta.

Puoi accedere al nuovo oggetto di richiesta in altri criteri in un secondo momento nel flusso oppure inviare il nuovo oggetto di richiesta a un servizio esterno con un criterio ServiceCallout.

Esempio 3

Nell'esempio seguente viene creato un nuovo oggetto di richiesta denominato MyRequestObject:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo>
  ...
</AssignMessage>

Quando crei un nuovo oggetto di richiesta o risposta, gli altri elementi del criterioAssignMessage (come <Add>, <Set> e <Copy>) agiscono su quel nuovo oggetto di richiesta.

Puoi accedere al nuovo oggetto della richiesta per nome in altri criteri in un secondo momento nel flusso oppure puoi inviare il nuovo oggetto della richiesta a un servizio esterno con un criterio ServiceCallout.

Nella tabella seguente vengono descritti gli attributi di <AssignTo>:

Attributo Descrizione Obbligatorio? Tipo
createNew

Consente di stabilire se questo criterio crea un nuovo messaggio durante l'assegnazione di valori.

Se true, il criterio crea una nuova variabile del tipo specificato da type (request o response). Se non specifichi il nome della nuova variabile, il criterio crea un nuovo oggetto di richiesta o risposta in base al valore di type.

Se false, il criterio risponde in uno dei due modi seguenti:

  • Se <AssignTo> riesce a risolvere il nome della variabile in una richiesta o risposta, prosegue l'elaborazione. Ad esempio, se il criterio si trova in un flusso di richiesta, la variabile è l'oggetto della richiesta. Se il criterio si trova in una risposta, la variabile è l'oggetto risposta.
  • Se <AssignTo> non può essere risolto o viene risolto in un tipo diverso dai messaggi, il criterio genera un errore.

Se createNew non viene specificato, il criterio risponde in uno dei due modi seguenti:

  • Se <AssignTo> si risolve in un messaggio, l'elaborazione avanza al passaggio successivo.
  • Se non è possibile risolvere <AssignTo> o se viene risolto in un tipo non messaggio, viene creata una nuova variabile di tipo specificata in type.
Facoltativo Booleano
transport

Specifica il tipo di trasporto per il tipo di messaggio di richiesta o risposta.

Il valore predefinito è http (l'unico valore supportato).

Facoltativo String
type Specifica il tipo del nuovo messaggio, quando createNew è true. I valori validi sono request o response.

Il valore predefinito è request. Se ometti questo attributo, Apigee crea una richiesta o una risposta, a seconda del punto del flusso in cui viene eseguito questo criterio.

Facoltativo String

<AssignVariable>

Assegna un valore a una variabile del flusso di destinazione (ad esempio una variabile il cui valore è impostato dal criterioAssignMessage). Se la variabile di flusso non esiste, <AssignVariable> la crea. Puoi utilizzare più elementi AssegnaVariabile all'interno del criterioAssignMessage. Questi vengono eseguiti in ordine di visualizzazione nella configurazione dei criteri.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Tipo complesso
Elemento principale <AssignMessage>
Elementi secondari <Name> (obbligatorio)
<PropertySetRef>
<Ref>
<ResourceURL>
<Template>
<Value>

Il valore assegnato alla variabile del flusso di destinazione può essere uno dei seguenti:

  • Stringa letterale: utilizza l'elemento secondario <Value> per specificare un valore letterale della stringa per la variabile del flusso di destinazione.
  • Variabile di flusso: utilizza l'elemento secondario <Ref> per specificare il valore di una variabile di flusso esistente per la variabile del flusso di destinazione. Per un elenco completo delle variabili di flusso che possono essere utilizzate come origine, consulta Riferimento per le variabili di flusso.
  • Insieme di proprietà: utilizza l'elemento secondario <PropertySetRef> per recuperare il valore da un nome/coppia di chiavi del set di proprietà e archiviarlo in una variabile di flusso. Consente di accedere ai set di proprietà in modo dinamico.
  • URL della risorsa: utilizza l'elemento secondario <ResourceURL> per specificare un URL per una risorsa di testo di tipo XSL, XSD, WSDL, JavaScript o OpenAPI Spec. I contenuti della risorsa vengono assegnati nella variabile di flusso denominata.
  • Modello di messaggio: utilizza l'elemento secondario <Template> per specificare un modello di messaggio per la variabile del flusso di destinazione.

L'ordine di precedenza di questi elementi secondari è: ResourceURL, Template, Ref, Value, PropertySetRef.

L'elemento <AssignVariable> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <PropertySetRef>SOURCE_VARIABLE</PropertySetRef>
    <Ref>SOURCE_VARIABLE</Ref>
    <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL>
    <Template>MESSAGE_TEMPLATE</Template>
    or
    <Template ref='TEMPLATE_VARIABLE'></Template>
    <Value>VARIABLE_VALUE</Value>
  </AssignVariable>
</AssignMessage>

Utilizza l'elemento <Ref> per specificare la variabile di origine. Se la variabile a cui fa riferimento <Ref> non è accessibile, Apigee utilizza il valore specificato dall'elemento <Value>. Se definisci <Template>, ha la precedenza sugli elementi di pari livello <Ref> e <Value>.

Esempio 1

L'esempio seguente imposta il valore di una nuova variabile, myvar, sul valore letterale 42:

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Esempio 2

L'esempio seguente assegna il valore della variabile di flusso request.header.user-agent alla variabile del flusso di destinazione myvar e il valore del parametro di query country alla variabile del flusso di destinazione Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Se una delle due assegnazioni non va a buon fine, Apigee assegna il valore ErrorOnCopy alla variabile del flusso di destinazione.

Se le variabili di flusso myvar o Country non esistono, <AssignVariable> le crea.

Esempio 3

L'esempio seguente utilizza l'elemento secondario <Template> per concatenare due variabili di contesto con una stringa letterale (un trattino) tra loro:

<AssignMessage name='AV-via-template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

Esempio 4

L'esempio seguente utilizza <AssignVariable> per disabilitare il comportamento predefinito della propagazione del suffisso del percorso dalla richiesta proxy alla richiesta di destinazione:

<AssignMessage name='AM-PathSuffixFalse'>
  <AssignVariable>
    <Name>target.copy.pathsuffix</Name>
    <Value>false</Value>
  </AssignVariable>
</AssignMessage>

Un uso comune di <AssignVariable> è l'impostazione di un valore predefinito per un parametro di query, un'intestazione o un altro valore che può essere trasmesso con la richiesta. Per farlo, devi utilizzare una combinazione di entrambi gli elementi secondari <Ref> e <Value>. Per ulteriori informazioni, vedi gli esempi per <Ref>.

<Name> (secondario di <AssignVariable>)

Specifica il nome della variabile del flusso di destinazione, la variabile il cui valore è impostato dal criterioAssignMessage. Se la variabile denominata in <Name> non esiste, il criterio ne crea una con quel nome.

Valore predefinito N/A
Obbligatorio? Obbligatorio
Tipo String
Elemento principale <AssignVariable>
Elementi secondari Nessuna

L'elemento <Name> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
  </AssignVariable>
</AssignMessage>

Esempio 1

L'esempio seguente specifica la variabile di destinazione come myvar e la imposta sul valore letterale 42:

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Se myvar non esiste, <AssignVariable> lo crea.

<PropertySetRef> (secondario di <AssignVariable>)

Questo elemento consente di recuperare in modo dinamico il valore di un set di proprietà/coppia di chiavi. Per scoprire di più sugli insiemi di proprietà, consulta Utilizzare gli insiemi di proprietà.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignVariable>
Elementi secondari Nessuna

Un insieme di proprietà è costituito da una coppia nome/chiave. Ad esempio: propset1.id=12345, dove propset1 è il nome dell'insieme di proprietà, id è una chiave e 12345 è il valore della chiave.

L'elemento secondario PropertySetRef ti consente di selezionare dinamicamente i nomi degli insiemi di proprietà e/o le chiavi. Supponi di avere 200 regole di routing in un file di un set di proprietà. Puoi accedere alle regole dell'insieme di proprietà come segue, dove routingrules è il nome dell'insieme di proprietà e rule1, rule2 e rulen sono chiavi:

propertyset.routingrules.rule1
propertyset.routingrules.rule2
propertyset.routingrules.rulen

Per accedere a queste proprietà in un flusso di proxy API, devi sapere quale regola selezionare in fase di progettazione. Tuttavia, supponiamo che il nome della regola arrivi nell'intestazione della richiesta o nel payload. Un modo per selezionare la regola consiste nell'utilizzare un criterio JavaScript con codice come il seguente:

context.getVariables("propertyset.routingrules." + ruleName); //assuming ruleName was populated earlier.

D'altra parte, la funzionalitàAssignMessage PropertySetRef consente di selezionare una chiave di proprietà in modo dinamico senza introdurre JavaScript.

Puoi utilizzare una combinazione di variabili di flusso e valori di stringa letterali nell'elemento <PropertySetRef>. Per ulteriori dettagli, consulta gli esempi.

L'elemento <PropertySetRef> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <PropertySetRef>SOURCE_VARIABLE</PropertySetRef>
  </AssignVariable>
</AssignMessage>

Esempio 1

In questo esempio viene assegnato il valore di una chiave di un set di proprietà a una variabile di flusso. In questo caso, il nome dell'insieme di proprietà viene ottenuto dall'intestazione propset_name, la chiave viene fornita nell'intestazione propset_key e il valore assegnato alla chiave viene archiviato nella variabile flow_variable.

<AssignMessage async="false" continueOnError="false" enabled="true" name="assignMessage">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <AssignVariable>
    <Name>flow_variable</Name>
    <PropertySetRef>{request.header.propset_name}.{request.header.propset_key}</PropertySetRef>
  </AssignVariable>
</AssignMessage>

Puoi utilizzare qualsiasi combinazione di variabili di flusso e stringhe letterali nell'elemento <PropertySetRef>.

Esempio 2

In questo esempio viene assegnato il valore di una chiave di un set di proprietà a una variabile di flusso utilizzando un nome di chiave fisso (stringa letterale). In questo caso, il nome dell'insieme di proprietà viene ottenuto dall'intestazione propset_name, la chiave è la stringa letterale key1 e il valore assegnato alla chiave viene archiviato nella variabile flow_variable.

<AssignMessage async="false" continueOnError="false" enabled="true" name="assignMessage">
  <DisplayName>Assign Message-1</DisplayName>
  <Properties/>
  <AssignVariable>
    <Name>flow_variable</Name>
    <PropertySetRef>{request.header.propset_name}.key1</PropertySetRef>
  </AssignVariable>
</AssignMessage>

Puoi utilizzare qualsiasi combinazione di variabili di flusso e stringhe letterali nell'elemento <PropertySetRef>.

<Ref> (secondario di <AssignVariable>)

Specifica l'origine dell'assegnazione come variabile di flusso. La variabile di flusso può essere una delle variabili di flusso predefinite (come elencate nel Riferimento alle variabili di flusso) o una variabile di flusso personalizzata che hai creato.

Il valore di <Ref> è sempre interpretato come una variabile di flusso; non puoi specificare una stringa letterale come valore. Per assegnare un valore letterale di stringa, utilizza invece l'elemento <Value>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignVariable>
Elementi secondari Nessuna

Quando specifichi una variabile di flusso con <Ref>, ometti le parentesi quadre {} che useresti normalmente per fare riferimento a una variabile di flusso. Ad esempio, per impostare il valore della nuova variabile sul valore della variabile di flusso client.host:

  DO specify the variable name without brackets:
  <Ref>client.host</Ref>

  DO NOT use brackets:
  <Ref>{client.host}</Ref>

Per definire un valore predefinito per la variabile del flusso di destinazione, utilizza <Value> in combinazione con <Ref>. Se la variabile di flusso specificata da <Ref> non esiste, non può essere letta o nulla, Apigee assegna il valore di <Value> alla variabile del flusso di destinazione.

L'elemento <Ref> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <Ref>SOURCE_VARIABLE</Ref>
  </AssignVariable>
</AssignMessage>

Esempio 1

L'esempio seguente assegna il valore della variabile di flusso request.header.user-agent alla variabile del flusso di destinazione myvar e il valore del parametro di query country alla variabile Country:

<AssignMessage name="assignvariable-4">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
  </AssignVariable>
</AssignMessage>

In questo esempio, Apigee non ha un valore predefinito (o di riserva) specificato per nessuna delle due assegnazioni.

Esempio 2

L'esempio seguente assegna il valore della variabile di flusso request.header.user-agent alla variabile del flusso di destinazione myvar e il valore del parametro di query country alla variabile Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

In questo esempio, se i valori della variabile di flusso request.header.user-agent o del parametro di query Country sono nulli, illeggibili o non corretti, Apigee assegna il valore ErrorOnCopy alle nuove variabili.

Esempio 3

Un caso d'uso comune di <AssignVariable> è impostare il valore predefinito di un parametro di query, di un'intestazione o di un altro valore che può essere trasmesso con la richiesta. Ad esempio, crei un proxy API per il meteo in cui la richiesta accetta un singolo parametro di query denominato w. Questo parametro contiene l'ID della città per la quale vuoi il meteo. L'URL della richiesta ha il seguente formato:

http://myCO.com/v1/weather/forecastrss?w=CITY_ID

Per definire un valore predefinito per w, crea un criterioAssignMessage come il seguente:

<AssignMessage continueOnError="false" enabled="true" name="assignvariable-3">
  <AssignTo createNew="false" transport="http" type="request"/>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>request.queryparam.w</Name>
    <Ref>request.queryparam.w</Ref>
    <Value>12797282</Value>
  </AssignVariable>
</AssignMessage>

In questo esempio, <AssignVariable> riceve il valore di request.queryparam.w e lo assegna a se stesso. Se la variabile di flusso è nullo, ovvero il parametro di query w è stato omesso dalla richiesta, in questo esempio viene utilizzato il valore predefinito dell'elemento <Value>. Di conseguenza, puoi effettuare una richiesta a questo proxy API che omette il parametro di query w:

http://myCO.com/v1/weather/forecastrss

...e fare in modo che il proxy API restituisca un risultato valido.

Il valore di <Ref> deve essere una variabile di flusso, ad esempio una proprietà di un oggetto request, response o target, oppure il nome di una variabile di flusso personalizzata.

Se specifichi una variabile di flusso che non esiste per il valore <Ref> e il valore di <IgnoreUnresolvedVariables> è false, Apigee genera un errore.

<ResourceURL> (secondario di <AssignVariable>)

Specifica l'URL di una risorsa di testo come origine dell'assegnazione della variabile. Apigee carica la variabile di flusso specificata in <Name> con i contenuti della risorsa di riferimento. La risorsa può essere di tipo XSD, XSL, WSDL, JavaScript, Property Set o OpenAPI Spec.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignVariable>
Elementi secondari Nessuna

Se la risorsa specificata da <ResourceURL> non esiste, se il valore di <IgnoreUnresolvedVariables> è true, Apigee assegna il valore null alla variabile del flusso di destinazione, mentre se il valore di <IgnoreUnresolvedVariables> è false, Apigee genera un errore.

L'elemento <ResourceURL> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <ResourceURL>RESOURCE_URL_OR_TEMPLATE</ResourceURL>
  </AssignVariable>
</AssignMessage>
      

Il valore di testo accetta un valore stringa ed è interpretato come un modello di messaggio. Sono validi tutti i seguenti valori:

<ResourceURL>jsc://my-js-file.js</ResourceURL>
<ResourceURL>wsdl://{variable-goes-here}</ResourceURL>
<ResourceURL>{variable-goes-here}</ResourceURL>

Esempio 1

L'esempio seguente assegna il valore di una risorsa JSON, caricata nel proxy nella cartella jsc, nella variabile di flusso assigned-variable:

<AssignMessage name='AM-From-ResourceURL-Proxy-JSC'>
  <AssignVariable>
    <Name>assigned-variable</Name>
    <ResourceURL>jsc://settings.json</ResourceURL>
  </AssignVariable>
</AssignMessage>

Esempio 2

L'esempio seguente assegna il valore di una risorsa OpenAPI Spec, caricata nel proxy nella cartella oas, nella variabile di flusso assigned-variable, quindi imposta quel valore come Payload nel corpo della risposta:

<AssignMessage name='AM-Response'>
  <AssignVariable>
    <Name>assigned-variable</Name>
    <ResourceURL>oas://Fulfillment.yaml</ResourceURL>
  </AssignVariable>
  <Set>
    <Payload contentType='application/yaml'>{assigned-variable}</Payload>
  </Set>
</AssignMessage>

<Template> (secondario di <AssignVariable>)

Specifica un modello di messaggio. Un modello di messaggio consente di eseguire la sostituzione delle stringhe di variabili quando viene eseguito il criterio e può combinare stringhe letterali con nomi delle variabili racchiusi tra parentesi graffe. Inoltre, i modelli di messaggi supportano funzioni quali l'utilizzo di caratteri di escape e la conversione di maiuscole e minuscole.

Utilizza l'attributo ref per specificare una variabile di flusso in cui il valore della variabile è un modello di messaggio. Ad esempio, puoi archiviare un modello di messaggio come attributo personalizzato in un'app sviluppatore. Quando Apigee identifica l'app sviluppatore dopo aver verificato la chiave API o il token di sicurezza (tramite un criterio aggiuntivo), l'elemento <AssignVariable> potrebbe utilizzare il modello di messaggio dall'attributo personalizzato dell'app, disponibile come variabile di flusso dal criterio di sicurezza. L'esempio seguente presuppone che il modello di messaggio sia disponibile in un attributo personalizzato denominato message_template nell'app sviluppatore che effettua la chiamata API, in cui è stato utilizzato il criterio VerifyAPIKey per verificare la chiave API dell'app:

<Template ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignVariable>
Elementi secondari Nessuna

L'elemento <Template> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Template>MESSAGE_TEMPLATE</Template>
    or
    <Template ref='TEMPLATE_VARIABLE'></Template>
  </AssignVariable>
</AssignMessage>

Esempio 1

L'esempio seguente utilizza la sintassi dei modelli dei messaggi per concatenare due variabili di contesto con una stringa letterale (un trattino) tra loro:

<AssignMessage name='AV-via-template-1'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

Esempio 2

L'esempio seguente specifica una variabile di flusso, in cui il valore della variabile è un modello di messaggio predefinito. Utilizza questa opzione se vuoi inserire un modello predefinito in fase di runtime senza dover modificare il criterio:

<AssignMessage name='AV-via-template-indirectly'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Value>BADDBEEF</Value>
    <Template ref='my_template_variable'/>
  </AssignVariable>
</AssignMessage>

Esempio 3

L'esempio seguente specifica una variabile di flusso e un valore di testo. In questo caso, se la variabile di riferimento non è null, quel valore viene utilizzato come modello. Se il valore di riferimento è nullo, il valore di testo (in questo caso, {system.uuid}-{messageid}) viene utilizzato come modello. Questo pattern è utile per fornire un valore override se in alcuni casi vuoi sostituire il modello predefinito (la parte di testo) con valori impostati in modo dinamico. Ad esempio, un'istruzione condizionale potrebbe recuperare un valore da una mappa chiave-valore e impostare la variabile di riferimento su quel valore:

<AssignMessage name='AV-template-with-fallback'>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
  <AssignVariable>
    <Name>my_destination_variable</Name>
    <Template ref='my_variable'>{system.uuid}-{messageid}</Template>
  </AssignVariable>
</AssignMessage>

<Value> (secondario di <AssignVariable>)

Definisce il valore della variabile del flusso di destinazione impostata con <AssignVariable>. Il valore è sempre interpretato come una stringa letterale; non puoi utilizzare una variabile di flusso come valore, anche se lo racchiudi tra parentesi ({}). Per utilizzare una variabile di flusso, utilizza invece <Ref>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignVariable>
Elementi secondari Nessuna

Se utilizzato in combinazione con l'elemento <Ref>, <Value> funge da valore predefinito (o di riserva). Se <Ref> non viene specificato, non è risolvibile o è nullo, viene utilizzato il valore di <Value>.

L'elemento <Value> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <AssignVariable>
    <Name>VARIABLE_NAME</Name>
    <Value>VARIABLE_VALUE</Value>
  </AssignVariable>
</AssignMessage>

Esempio 1

L'esempio seguente imposta il valore della variabile del flusso di destinazione, myvar, sul valore letterale 42:

<AssignMessage name="assignvariable-1">
  <AssignVariable>
    <Name>myvar</Name>
    <Value>42</Value>
  </AssignVariable>
</AssignMessage>

Esempio 2

L'esempio seguente assegna il valore della variabile di flusso request.header.user-agent alla variabile di flusso myvar e il valore del parametro di query country alla variabile Country:

<AssignMessage name="assignvariable-2">
  <AssignVariable>
    <Name>myvar</Name>
    <Ref>request.header.user-agent</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
  <AssignVariable>
    <Name>Country</Name>
    <Ref>request.queryparam.country</Ref>
    <Value>ErrorOnCopy</Value>
  </AssignVariable>
</AssignMessage>

Se una delle assegnazioni non riesce, <AssignVariable> assegna invece il valore ErrorOnCopy alla variabile del flusso di destinazione.

<Copy>

Copia i valori dal messaggio specificato dall'attributo source nel messaggio specificato dall'elemento <AssignTo>. Se non specifichi una destinazione con <AssignTo>, questo criterio copia i valori nella richiesta o nella risposta, a seconda del punto del flusso in cui viene eseguito questo criterio.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo String
Elemento principale <AssignMessage>
Elementi secondari <FormParams>
<Headers>
<Path>
<Payload>
<QueryParams>
<StatusCode>
<Verb>
<Version>

Se non specifichi nessun elemento secondario sotto l'elemento <Copy>, verranno copiate tutte le parti del messaggio di origine designato.

L'elemento <Copy> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
    <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <!-- Copy all headers -->
    <Headers/>
    <!-- or, copy specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Path>[false|true]</Path>
    <Payload>[false|true]</Payload>
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>[false|true]</StatusCode>
    <Verb>[false|true]</Verb>
    <Version>[false|true]</Version>
  </Copy>
  <!-- Used as the destination for the <Copy> values -->
  <AssignTo createNew="[true|false]" transport="http"
    type="[request|response]">DESTINATION_VARIABLE_NAME</AssignTo>
</AssignMessage>
  

Esempio 1

L'esempio seguente copia un'intestazione, tre parametri del modulo, il percorso e tutti i parametri di query dal messaggio request a una nuova richiesta personalizzata denominata newRequest:

<AssignMessage name="AM-copy-1">
  <AssignTo createNew="true" transport="http" type="request">newRequest</AssignTo>
  <Copy source="request">
    <Headers>
      <Header name="Header_Name_1"/>
    </Headers>
    <FormParams>
      <FormParam name="Form_Param_Name_1"/>
      <FormParam name="Form_Param_Name_2"/>
      <FormParam name="Form_Param_Name_3"/>
    </FormParams>
    <Path>true</Path>
    <QueryParams/>
  </Copy>
</AssignMessage>

Poiché elementi come <Payload> e <Verb> non sono presenti, il criterio non copia queste parti del messaggio.

Esempio 2

L'esempio seguente rimuove prima tutti i contenuti nel messaggio response esistente, quindi copia tutti i valori di un messaggio diverso denominato secondResponse nel messaggio response:

<AssignMessage name='AM-Copy-Response'>
  <AssignTo createNew="false" transport="http" type="response">response</AssignTo>
  <!-- first remove any existing values -->
  <Remove/>
  <!-- then copy everything from the designated message -->
  <Copy source="secondResponse"/>
</AssignMessage>

L'elemento <Copy> ha un singolo attributo:

Attributo Descrizione Obbligatorio? Tipo
source

Specifica l'oggetto di origine della copia.

  • Se source non viene specificato, il valore predefinito è message, che assume un valore diverso a seconda del flusso in cui viene eseguito il criterio. Se il criterio viene eseguito all'interno del flusso di richiesta, la variabile message fa riferimento all'oggetto request. Se il criterio viene eseguito all'interno del flusso di risposta, la variabile message fa riferimento all'oggetto response.
  • Se la variabile specificata nell'attributo source non può essere risolta o se viene risolta in un tipo non messaggio, <Copy> non avrà alcun effetto.
  • Assicurati che il valore specificato per source sia diverso dal messaggio di destinazione, che si tratti del messaggio di destinazione predefinito o di una destinazione specificata esplicitamente con <AssignTo>. Se source corrisponde al messaggio di destinazione, <Copy> non avrà alcun effetto.
Facoltativo String

<FormParams> (secondario di <Copy>)

Copia i parametri del modulo della richiesta specificata dall'attributo source dell'elemento <Copy> alla richiesta specificata dall'elemento <AssignTo>. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di elementi <FormParam> o un array vuoto
Elemento principale <Copy>
Elementi secondari <FormParam>

L'elemento <FormParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<FormParams/>) -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente copia un singolo parametro del modulo dalla richiesta alla richiesta personalizzata MyCustomRequest:

<AssignMessage name="copy-formparams-1">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName">Form param value 1</FormParam>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente copia tutti i parametri del modulo nella richiesta personalizzata MyCustomRequest:

<AssignMessage name="copy-formparams-2">
  <Copy source="request">
    <FormParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 3

L'esempio seguente copia tre parametri del modulo nella richiesta personalizzata MyCustomRequest:

<AssignMessage name="copy-formparams-3">
  <Copy source="request">
    <FormParams>
      <FormParam name="paramName1"/>
      <FormParam name="paramName2"/>
      <FormParam name="paramName3"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 4

Se esistono più parametri del modulo con lo stesso nome, utilizza la seguente sintassi:

<AssignMessage name="copy-formparams-4">
  <Copy source="request">
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

In questo esempio vengono copiati f1, f2 e il secondo valore di f3. Se f3 ha un solo valore, non viene copiato.

Puoi utilizzare <FormParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbo HTTP: POST
  • Tipo di messaggio: risposta
  • Uno (o entrambi) dei seguenti elementi:
    • Dati del modulo. Imposta un valore o "" (la stringa vuota). Ad esempio, con curl, aggiungi -d "" alla tua richiesta.
    • Intestazione Content-Length: imposta su 0 (se non sono presenti dati nella richiesta originale, altrimenti la lunghezza attuale. Ad esempio, con curl aggiungi -H "Content-Length: 0" alla tua richiesta.

Quando copi <FormParams>, <Copy> imposta il valore Content-Type del messaggio su application/x-www-form-urlencoded prima di inviarlo al servizio di destinazione.

<Headers> (secondario di <Copy>)

Copia le intestazioni HTTP dal messaggio di richiesta o risposta specificato dall'attributo source dell'elemento <Copy> al messaggio di richiesta o risposta specificato dall'elemento <AssignTo>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Un array di elementi <Header> o un array vuoto
Elemento principale <Copy>
Elementi secondari <Header>

L'elemento <Headers> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <!-- Copy all headers -->
    <Headers/>
    <!-- or, copy specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente copia l'intestazione user-agent dalla richiesta al nuovo oggetto di richiesta personalizzato:

<AssignMessage name="AM-copy-headers-1">
  <Copy source="request">
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 2

Per copiare tutte le intestazioni, utilizza un elemento <Headers> vuoto, come mostrato nell'esempio seguente:

<AssignMessage name="copy-headers-2">
  <Copy source="request">
    <Headers/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 3

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

<AssignMessage name="copy-headers-3">
  <Copy source="request">
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

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

<Path> (secondario di <Copy>)

Determina se il percorso deve essere copiato dalla richiesta di origine alla richiesta di destinazione. Questo elemento non ha alcun effetto su una risposta.

Se true, questo criterio copia il percorso dal messaggio di richiesta specificato dall'attributo source dell'elemento <Copy> al messaggio di richiesta specificato dall'elemento <AssignTo>.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <Copy>
Elementi secondari Nessuna

L'elemento <Path> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Path>[false|true]</Path>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente indica cheAssignMessage deve copiare il percorso dalla richiesta di origine al nuovo oggetto di richiesta personalizzato:

<AssignMessage name="copy-path-1">
  <Copy source="request">
    <Path>true</Path>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Puoi utilizzare <Path> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: richiesta

<Payload> (secondario di <Copy>)

Determina se il payload deve essere copiato dall'origine alla destinazione. L'origine e la destinazione possono essere richieste o risposte.

Se true, questo criterio copia il payload dal messaggio specificato dall'attributo source dell'elemento <Copy> al messaggio specificato dall'elemento <AssignTo>.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <Copy>
Elementi secondari Nessuna

L'elemento <Payload> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Payload>[false|true]</Payload>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente imposta <Payload> su true in modo che il payload della richiesta venga copiato dalla richiesta alla risposta:

<AssignMessage name="AM-copy-payload-1">
  <Copy source="request">
    <Payload>true</Payload>
  </Copy>
  <AssignTo>response</AssignTo>
</AssignMessage>

<QueryParams> (secondario di <Copy>)

Copia i parametri della stringa di query dalla richiesta specificata dall'attributo source dell'elemento <Copy> alla richiesta specificata dall'elemento <AssignTo>. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Un array di elementi <QueryParam> o un array vuoto
Elemento principale <QueryParam>
Elementi secondari Nessuna

L'elemento <QueryParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <!-- Can also be an empty array (<QueryParams/>) -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente copia il parametro di query my_param dalla richiesta in un nuovo oggetto di richiesta personalizzato:

<AssignMessage name="copy-queryparams-1">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="my_param"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente copia tutti parametri di ricerca dalla richiesta a un nuovo oggetto di richiesta personalizzato:

<AssignMessage name="copy-queryparams-2">
  <Copy source="request">
    <QueryParams/>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Esempio 3

Se esistono più parametri di query con lo stesso nome, utilizza la seguente sintassi:

<AssignMessage name="copy-queryparams-3">
  <Copy source="request">
    <QueryParams>
      <QueryParam name="qp1"/>
      <QueryParam name="qp2"/>
      <QueryParam name="qp3.2"/>
    </QueryParams>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

In questo esempio vengono copiati qp1, qp2 e il secondo valore di qp3. Se qp3 ha un solo valore, non viene copiato.

Puoi utilizzare <QueryParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbi HTTP: GET, POST, PATCH, DELETE
  • Tipo di messaggio: richiesta

<StatusCode> (secondario di <Copy>)

Determina se il codice di stato viene copiato dalla risposta di origine alla risposta di destinazione. Questo elemento non ha alcun effetto su una richiesta.

Se true, questo criterio copia il codice di stato dal messaggio di risposta specificato dall'attributo source dell'elemento <Copy> al messaggio di risposta specificato dall'elemento <AssignTo>.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <Copy>
Elementi secondari Nessuna

L'elemento <StatusCode> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <StatusCode>[false|true]</StatusCode>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente imposta <StatusCode> su true, che copia il codice di stato dall'oggetto risposta predefinito a un nuovo oggetto risposta personalizzata:

<AssignMessage name="copy-statuscode-1">
  <Copy source="response">
    <StatusCode>true</StatusCode>
  </Copy>
  <AssignTo createNew="true" transport="http" type="response">MyCustomResponse</AssignTo>
</AssignMessage>

Puoi utilizzare <StatusCode> solo se i messaggi di origine e di destinazione sono di tipo Risposta.

Un uso comune di <StatusCode> consiste nell'impostare il codice di stato della risposta del proxy su un valore diverso da quello ricevuto dalla destinazione.

<Verb> (secondario di <Copy>)

Determina se il verbo HTTP viene copiato dalla richiesta di origine alla richiesta di destinazione. Questo elemento non ha alcun effetto su una risposta.

Se true, copia il verbo trovato nell'attributo source dell'elemento <Copy> nella richiesta specificata nell'elemento <AssignTo>.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <Copy>
Elementi secondari Nessuna

L'elemento <Verb> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Verb>[false|true]</Verb>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente imposta <Verb> su true, che copia il verbo dalla richiesta predefinita in una nuova richiesta personalizzata:

<AssignMessage name="copy-verb-1">
  <Copy source="request">
    <Verb>true</Verb>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Puoi utilizzare <Verb> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: richiesta

<Version> (secondario di <Copy>)

Determina se la versione HTTP viene copiata dalla richiesta di origine alla richiesta di destinazione. Questo elemento non ha alcun effetto su una risposta.

Se true, copia la versione HTTP trovata nell'attributo source dell'elemento <Copy> nell'oggetto specificato dall'elemento <AssignTo>.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <Copy>
Elementi secondari Nessuna

L'elemento <Version> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Copy source="VARIABLE_NAME">
    <Version>[false|true]</Version>
  </Copy>
</AssignMessage>

Esempio 1

L'esempio seguente imposta <Version> su true nella richiesta, che copia la versione dall'oggetto di richiesta predefinito a un nuovo oggetto di richiesta personalizzato:

<AssignMessage name="copy-version-1">
  <Copy source="request">
    <Version>true</Version>
  </Copy>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Puoi utilizzare <Version> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: richiesta

<DisplayName>

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

L'elemento <DisplayName> è comune a tutti i criteri.

Valore predefinito N/A
Obbligatorio? Facoltativo. Se ometti <DisplayName>, viene utilizzato il valore dell'attributo name del criterio.
Tipo Stringa
Elemento principale <PolicyElement>
Elementi secondari Nessuna esperienza

La sintassi dell'elemento <DisplayName> è la seguente:

Sintassi

<PolicyElement>
  <DisplayName>POLICY_DISPLAY_NAME</DisplayName>
  ...
</PolicyElement>

Esempio

<PolicyElement>
  <DisplayName>My Validation Policy</DisplayName>
</PolicyElement>

L'elemento <DisplayName> non ha attributi o elementi secondari.

<IgnoreUnresolvedVariables>

Determina se l'elaborazione si interrompe quando viene rilevata una variabile non risolta.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <AssignMessage>
Elementi secondari Nessuna

Imposta true per ignorare le variabili non risolte e continuare l'elaborazione, altrimenti false. Il valore predefinito è false.

L'impostazione di <IgnoreUnresolvedVariables> su true è diversa dall'impostazione di continueOnError di <AssignMessage> su true in quanto è specifica per l'impostazione e il recupero dei valori delle variabili. Se imposti continueOnError su true, Apigee ignora tutti gli errori, non solo quelli riscontrati durante l'utilizzo delle variabili.

L'elemento <IgnoreUnresolvedVariables> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <IgnoreUnresolvedVariables>[true|false]</IgnoreUnresolvedVariables>
</AssignMessage>

Esempio 1

L'esempio seguente imposta <IgnoreUnresolvedVariables> su true:

<AssignMessage name="AM-Set-Headers">
  <Set>
    <Headers>
      <Header name='new-header'>{possibly-defined-variable}<Header>
    </Headers>
  </Set>
  <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</AssignMessage>

Poiché <IgnoreUnresolvedVariables> è impostato su true, se la variabile possibly-defined-variable non viene definita, questo criterio non genera un errore.

<Remove>

Rimuove intestazioni, parametri di ricerca, parametri del modulo e/o il payload dei messaggi da un messaggio. Un tag <Remove> vuoto rimuove tutti i dati dal messaggio.

Il messaggio interessato può essere una richiesta o una risposta. Puoi specificare su quale messaggio agisce <Remove> utilizzando l'elemento <AssignTo>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Tipo complesso
Elemento principale <AssignMessage>
Elementi secondari <FormParams>
<Headers>
<Payload>
<QueryParams>

Un caso d'uso comune di <Remove> è l'eliminazione di un parametro di query o di un'intestazione che contiene informazioni sensibili dall'oggetto della richiesta in entrata, per evitare di trasmetterlo al server di backend.

L'elemento <Remove> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all form parameters -->
    <FormParams/>
    <!-- or, remove specific form parameters by name -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME"/>
      <!-- or -->
      <FormParam name="FORMPARAM_NAME">[false|true]</FormParam>
      ...
    </FormParams>
    <!-- Remove all headers -->
    <Headers/>
    <!-- or, remove specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
    <Payload>[false|true]</Payload>
    <!-- Remove all query parameters -->
    <QueryParams/>
    <!-- or, remove specific query parameters by name -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME"/>
      <!-- or -->
      <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

Esempio 1

L'esempio seguente rimuove il corpo del messaggio dalla risposta:

<AssignMessage name="AM-remove-1">
  <DisplayName>remove-1</DisplayName>
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>response</AssignTo>
</AssignMessage>

Nel flusso di risposta, questo criterio rimuove il corpo della risposta, restituendo solo le intestazioni HTTP al client.

Esempio 2

L'esempio seguente rimuove tutti i parametri del modulo e un parametro di query dall'oggetto request:

<AssignMessage name="AM-remove-2">
  <Remove>
    <!-- Empty (<FormParams/>) removes all form parameters -->
    <FormParams/>
    <QueryParams>
      <QueryParam name="qp1"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 3

Nell'esempio seguente viene rimosso tutto da un oggetto di messaggio:

<AssignMessage name="AM-remove-3">
  <Remove/>
  <AssignTo>request</AssignTo>
</AssignMessage>

In genere, devi eseguire questa operazione solo se vuoi utilizzare l'elemento <Set> o l'elemento <Copy> per impostare alcuni valori sostitutivi nel messaggio.

<FormParams> (secondario di <Remove>)

Rimuove i parametri del modulo specificati dalla richiesta. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di elementi <FormParam> o un array vuoto
Elemento principale <Remove>
Elementi secondari <FormParam>

L'elemento <FormParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all form parameters -->
    <FormParams/>
    <!-- or, remove specific form parameters by name -->
    <FormParams>
      <FormParam name="FORMPARAM_NAME"/>
      <!-- or -->
      <FormParam name="FORMPARAM_NAME">[false|true]</FormParam>
      ...
    </FormParams>
  </Remove>
</AssignMessage>

Esempio 1

L'esempio seguente rimuove tre parametri del modulo dalla richiesta:

<AssignMessage name="AM-remove-formparams-1">
  <Remove>
    <FormParams>
      <FormParam name="form_param_1"/>
      <FormParam name="form_param_2"/>
      <FormParam name="form_param_3"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente rimuove tutti i parametri del modulo dalla richiesta:

<AssignMessage name="AM-remove-formparams-2">
  <Remove>
    <FormParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 3

Se esistono più parametri del modulo con lo stesso nome, utilizza la seguente sintassi:

<AssignMessage name="AM-remove-formparams-3">
  <Remove>
    <FormParams>
      <FormParam name="f1"/>
      <FormParam name="f2"/>
      <FormParam name="f3.2"/>
    </FormParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Questo esempio rimuove f1, f2 e il secondo valore di f3. Se f3 ha un solo valore, non viene rimosso.

Puoi utilizzare <FormParams> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: richiesta
  • Content-Type: application/x-www-form-urlencoded

<Headers> (secondario di <Remove>)

Rimuove le intestazioni HTTP specificate dalla richiesta o dalla risposta, che sono specificate dall'elemento <AssignTo>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di elementi <Header> o un array vuoto
Elemento principale <Remove>
Elementi secondari <Header>

L'elemento <Headers> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all headers -->
    <Headers/>
    <!-- or, remove specific headers by name -->
    <Headers>
      <Header name="HEADER_NAME"/>
      <!-- or -->
      <Header name="HEADER_NAME">[false|true]</Header>
      ...
    </Headers>
  </Remove>
</AssignMessage>

Esempio 1

L'esempio seguente rimuove l'intestazione user-agent dalla richiesta:

<AssignMessage name="AM-remove-one-header">
  <Remove>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente rimuove tutte le intestazioni dalla richiesta:

<AssignMessage name="AM-remove-all-headers">
  <Remove>
    <Headers/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 3

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

<AssignMessage name="AM-remove-headers-3">
  <Remove>
    <Headers>
      <Header name="h1"/>
      <Header name="h2"/>
      <Header name="h3.2"/>
    </Headers>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

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

<Payload> (secondario di <Remove>)

Determina se <Remove> elimina il payload nella richiesta o nella risposta, specificato dall'elemento <AssignTo>. Imposta true per cancellare il payload; altrimenti false. Il valore predefinito è false.

Valore predefinito False
Obbligatorio? Facoltativo
Tipo Booleano
Elemento principale <Remove>
Elementi secondari Nessuna

L'elemento <Payload> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <Payload>[false|true]</Payload>
  </Remove>
</AssignMessage>

Esempio 1

L'esempio seguente imposta <Payload> su true in modo che il payload della richiesta venga cancellato:

<AssignMessage name="AM-remove-payload-1">
  <Remove>
    <Payload>true</Payload>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

<QueryParams> (secondario di <Remove>)

Rimuove dalla richiesta i parametri di ricerca specificati. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di elementi <QueryParam> o un array vuoto
Elemento principale <Remove>
Elementi secondari <QueryParam>

L'elemento <QueryParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <!-- Can also be empty to remove everything from the message (<Remove/>) -->
  <Remove>
    <!-- Remove all query parameters -->
    <QueryParams/>
    <!-- or, remove specific query parameters by name -->
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME"/>
      <!-- or -->
      <QueryParam name="QUERYPARAM_NAME">[false|true]</QueryParam>
      ...
    </QueryParams>
  </Remove>
</AssignMessage>

Esempio 1

L'esempio seguente rimuove un singolo parametro di query dalla richiesta:

<AssignMessage name="AM-remove-queryparams-1">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente rimuove tutti parametri di ricerca dalla richiesta:

<AssignMessage name="AM-remove-queryparams-2">
  <Remove>
      <QueryParams/>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 3

Se esistono più parametri di query con lo stesso nome, utilizza la seguente sintassi:

<AssignMessage name="AM-remove-queryparams-3">
  <Remove>
      <QueryParams>
        <QueryParam name="qp1"/>
        <QueryParam name="qp2"/>
        <QueryParam name="qp3.2"/>
      </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Questo esempio rimuove dalla richiesta qp1, qp2 e il secondo valore di qp3. Se qp3 ha un solo valore, questo non viene rimosso.

Esempio 4

L'esempio seguente rimuove il parametro di query apikey dalla richiesta:

<AssignMessage name="AM-remove-query-param">
  <Remove>
    <QueryParams>
      <QueryParam name="apikey"/>
    </QueryParams>
  </Remove>
  <AssignTo>request</AssignTo>
</AssignMessage>

Puoi utilizzare <QueryParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbi HTTP: GET, POST, PATCH, DELETE
  • Tipo di messaggio: richiesta

<Set>

Consente di impostare le informazioni nel messaggio di richiesta o di risposta, specificate dall'elemento <AssignTo>. <Set> sovrascrive le intestazioni o i parametri di query o modulo già esistenti nel messaggio originale oppure ne aggiunge di nuovi, se non sono presenti.

Le intestazioni e i parametri di query e modulo in un messaggio HTTP possono contenere più valori. Per aggiungere ulteriori valori per un'intestazione o un parametro, utilizza invece l'elemento <Add>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Tipo complesso
Elemento principale <AssignMessage>
Elementi secondari <FormParams>
<Headers>
<Payload>
<Path>
<QueryParams>
<StatusCode>
<Verb>
<Version>

L'elemento <Set> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
    <Path>PATH</Path>
    <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX"
        variableSuffix="SUFFIX">NEW_PAYLOAD</Payload>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
    <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Esempio 1

L'esempio seguente imposta un'intestazione specifica. Quando questo criterio viene collegato nel flusso di richiesta, consentirà al sistema upstream di ricevere un'intestazione aggiuntiva che non era inclusa nella richiesta in entrata originale.

<AssignMessage name="AM-Set-Header">
  <Set>
    <Headers>
        <Header name="authenticated-developer">{verifyapikey.VAK-1.developer.id}</Header>
    </Headers>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

L'esempio seguente sovrascrive il payload per una risposta, nonché l'intestazione Content-Type.

<AssignMessage name="AM-Overwrite-Payload">
  <Set>
    <Payload contentType="application/json">{ "status" : 42 }</Payload>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

<FormParams> (secondario di <Set>)

Sovrascrive i parametri del modulo esistenti in una richiesta e li sostituisce con i nuovi valori specificati con questo elemento. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di <FormParam> elementi
Elemento principale <Set>
Elementi secondari <FormParam>

L'elemento <FormParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <FormParams>
      <FormParam name="FORMPARAM_NAME">FORMPARAM_VALUE</FormParam>
      ...
    </FormParams>
  </Set>
</AssignMessage>

Esempio 1

Nell'esempio seguente, un parametro del modulo denominato myparam viene impostato sul valore della variabile request.header.myparam in una nuova richiesta personalizzata:

<AssignMessage name="AM-set-formparams-1">
  <Set>
    <FormParams>
      <FormParam name="myparam">{request.header.myparam}</FormParam>
    </FormParams>
  </Set>
  <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo>
</AssignMessage>

Puoi utilizzare <FormParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbo HTTP: POST
  • Tipo di messaggio: richiesta

Se definisci parametri di modulo vuoti nel criterio (<Add><FormParams/></Add>), quest'ultimo non aggiunge parametri del modulo. È come omettere <FormParams>.

<Set> modifica il Content-Type del messaggio in application/x-www-form-urlencoded prima di inviarlo all'endpoint di destinazione.

<Headers> (secondario di <Set>)

Sovrascrive le intestazioni HTTP esistenti nella richiesta o nella risposta, specificata dall'elemento <AssignTo>.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di <Header> elementi
Elemento principale <Set>
Elementi secondari <Header>

L'elemento <Headers> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Headers>
      <Header name="HEADER_NAME">HEADER_VALUE</Header>
      ...
    </Headers>
  </Set>
</AssignMessage>

Esempio 1

L'esempio seguente imposta l'intestazione x-ratelimit-remaining sul valore della variabile ratelimit.Quota-1.available.count:

<AssignMessage name="AM-Set-RateLimit-Header">
  <Set>
    <Headers>
      <Header name="X-RateLimit-Remaining">{ratelimit.Quota-1.available.count}</Header>
    </Headers>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Se definisci intestazioni vuote nel criterio (<Set><Headers/></Set>), quest'ultimo non imposta alcuna intestazione. Questa azione avrà lo stesso effetto dell'omissione di <Headers>.

<Path> (secondario di <Set>)

<Payload> (secondario di <Set>)

Definisce il corpo del messaggio per una richiesta o una risposta, specificato dall'elemento <AssignTo>. Il payload può essere qualsiasi tipo di contenuto valido, come testo normale, JSON o XML.

Valore predefinito stringa vuota
Obbligatorio? Facoltativo
Tipo String
Elemento principale <Set>
Elementi secondari Nessuna

L'elemento <Payload> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Payload contentType="CONTENT_TYPE" variablePrefix="PREFIX"
        variableSuffix="SUFFIX">NEW_PAYLOAD</Payload>
  </Set>
</AssignMessage>

Esempio 1

L'esempio seguente imposta un payload in testo normale:

<AssignMessage name="set-payload-1">
  <Set>
    <Payload contentType="text/plain">42</Payload>
  </Set>
</AssignMessage>

Esempio 2

L'esempio seguente imposta un payload JSON:

<AssignMessage name="set-payload-2">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"bar"}
    </Payload>
  </Set>
</AssignMessage>

Esempio 3

L'esempio seguente inserisce i valori delle variabili nel payload aggregando i nomi delle variabili tra parentesi graffe:

<AssignMessage name="set-payload-3">
  <Set>
    <Payload contentType="application/json">
      {"name":"foo", "type":"{variable_name}"}
    </Payload>
  </Set>
</AssignMessage>

Nelle versioni precedenti di Apigee, ad esempio prima della release 16.08.17 del cloud, non era possibile utilizzare parentesi graffe per indicare i riferimenti alle variabili all'interno dei payload JSON. In queste release, era necessario utilizzare gli attributi variablePrefix e variableSuffix per specificare i caratteri di delimitatore e utilizzarli per aggregare i nomi delle variabili, in questo modo:

<AssignMessage name="set-payload-3b">
  <Set>
    <Payload contentType="application/json" variablePrefix="@" variableSuffix="#">
      {"name":"foo", "type":"@variable_name#"}
    </Payload>
  </Set>
</AssignMessage>

La sintassi precedente continua a funzionare.

Esempio 4

I contenuti di <Payload> vengono trattati come un modello di messaggio. Ciò significa che il criterioAssignMessage sostituisce le variabili racchiuse tra parentesi graffe con il valore delle variabili di riferimento in fase di runtime.

L'esempio seguente utilizza la sintassi delle parentesi graffe per impostare parte del payload su un valore variabile:

<AssignMessage name="set-payload-4">
  <Set>
    <Payload contentType="text/xml">
      <root>
        <e1>sunday</e1>
        <e2>funday</e2>
        <e3>{var1}</e3>
      </root>
    </Payload>
  </Set>
</AssignMessage>

Nella tabella seguente vengono descritti gli attributi di <Payload>:

Attributo Descrizione Presenza Tipo
contentType

Se specificato, il valore di contentType viene assegnato all'intestazione HTTP Content-Type.

Facoltativo String
variablePrefix Facoltativamente, specifica il delimitatore iniziale su una variabile di flusso. Il valore predefinito è "{". Per ulteriori informazioni, consulta Riferimento sulle variabili di flusso. Facoltativo Carattere
variableSuffix Facoltativamente, specifica il delimitatore finale su una variabile di flusso. Il valore predefinito è "}". Per ulteriori informazioni, consulta Riferimento alle variabili di flusso. Facoltativo Carattere

<QueryParams> (secondario di <Set>)

Sovrascrive parametri di ricerca esistenti nella richiesta con nuovi valori. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Array di <QueryParam> elementi
Elemento principale <Set>
Elementi secondari <QueryParam>

L'elemento <QueryParams> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <QueryParams>
      <QueryParam name="QUERYPARAM_NAME">QUERYPARAM_VALUE</QueryParam>
      ...
    </QueryParams>
  </Set>
</AssignMessage>

Esempio 1

L'esempio seguente imposta il parametro di query address sul valore della variabile request.header.address:

<AssignMessage name="AM-set-queryparams-1">
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.header.address}</QueryParam>
    </QueryParams>
  </Set>
</AssignMessage>

Puoi utilizzare <QueryParams> solo se vengono soddisfatti i seguenti criteri:

  • Verbi HTTP: GET, POST, PATCH, DELETE
  • Tipo di messaggio: richiesta

Se definisci parametri di ricerca vuoti nel criterio (<Set><QueryParams/></Set>), quest'ultimo non imposta parametri di query. Equivale all'omissione di <QueryParams>.

<StatusCode> (secondario di <Set>)

Imposta il codice di stato sulla risposta. Questo elemento non ha alcun effetto su una richiesta.

Valore predefinito "200" (quando l'attributo createNew di <AssignTo> è impostato su "true")
Obbligatorio? Facoltativo
Tipo Stringa o VARIABLE
Elemento principale <Set>
Elementi secondari Nessuna

L'elemento <StatusCode> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <StatusCode>HTTP_STATUS_CODE or {variable}</StatusCode>
  </Set>
</AssignMessage>

Esempio 1

L'esempio seguente imposta un codice di stato semplice:

<AssignMessage name="AM-set-statuscode-404">
  <Set>
    <StatusCode>404</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Esempio 2

I contenuti di <StatusCode> vengono trattati come un modello di messaggio. Ciò significa che un nome di variabile racchiuso tra parentesi graffe verrà sostituito in fase di runtime con il valore della variabile di riferimento, come illustrato nell'esempio seguente:

<AssignMessage name="set-statuscode-2">
  <Set>
    <StatusCode>{calloutresponse.status.code}</StatusCode>
  </Set>
  <AssignTo>response</AssignTo>
</AssignMessage>

Puoi utilizzare <StatusCode> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: risposta

<Verb> (secondario di <Set>)

Imposta il verbo HTTP sulla richiesta. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Stringa o VARIABLE
Elemento principale <Set>
Elementi secondari Nessuna

L'elemento <Verb> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Verb>[GET|POST|PUT|PATCH|DELETE|{variable}]</Verb>
  </Set>
</AssignMessage>

Esempio 1

L'esempio seguente imposta un verbo semplice nella richiesta:

<AssignMessage name="AM-set-verb-1">
  <Set>
    <Verb>POST</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Esempio 2

I contenuti di <Verb> vengono trattati come un modello di messaggio. Ciò significa che un nome di variabile racchiuso tra parentesi graffe verrà sostituito in fase di runtime con il valore della variabile di riferimento.

L'esempio seguente utilizza una variabile per compilare un verbo:

<AssignMessage name="AM-set-verb-to-dynamic-value">
  <Set>
    <Verb>{my_variable}</Verb>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

Puoi utilizzare <Verb> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: richiesta

<Version> (secondario di <Set>)

Imposta la versione HTTP su una richiesta. Questo elemento non ha alcun effetto su una risposta.

Valore predefinito N/A
Obbligatorio? Facoltativo
Tipo Stringa o VARIABLE
Elemento principale <Set>
Elementi secondari Nessuna

L'elemento <Version> utilizza la seguente sintassi:

Sintassi

<AssignMessage
    continueOnError="[false|true]"
    enabled="[true|false]"
    name="POLICY_NAME" >
  <Set>
    <Version>[1.0|1.1|{variable}]</Verb>
  </Set>
</AssignMessage>

Esempio 1

Nell'esempio seguente il numero di versione viene impostato su 1.1:

<AssignMessage name="AM-set-version-1">
  <Set>
    <Version>1.1</Version>
  </Set>
 </AssignMessage>

Esempio 2

Di seguito viene utilizzata una variabile tra parentesi graffe per impostare il numero di versione:

<AssignMessage name="AM-set-version-2">
  <Set>
    <Version>{my_version}</Version>
  </Set>
  <AssignTo>request</AssignTo>
</AssignMessage>

I contenuti di <Version> vengono trattati come un modello di messaggio. Ciò significa che un nome di variabile racchiuso tra parentesi graffe verrà sostituito in fase di runtime con il valore della variabile di riferimento.

Puoi utilizzare <Version> solo se vengono soddisfatti i seguenti criteri:

  • Tipo di messaggio: richiesta

Crea messaggi di richiesta personalizzati

Puoi utilizzareAssignMessage per creare un messaggio di richiesta personalizzato. Dopo aver creato una richiesta personalizzata, puoi utilizzarla nei seguenti modi:

  • Accedi alle relative variabili in altri criteri
  • Passalo a un servizio esterno

Per creare un messaggio di richiesta personalizzato, utilizza l'elemento <AssignTo> nel criterio AssegnaMessage. Imposta createNew su true e specifica il nome del nuovo messaggio nel corpo dell'elemento, come mostrato nell'esempio seguente:

<AssignMessage name="assignto-2">
  <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo>
  ...
</AssignMessage>

Per impostazione predefinita, Apigee non esegue alcuna operazione con il messaggio di richiesta personalizzato. Dopo averla creata, Apigee continuerà il flusso con la richiesta originale. Per utilizzare la richiesta personalizzata, aggiungi al proxy un criterio come il criterio ServiceCallout e fai riferimento esplicitamente al messaggio di richiesta appena creato nella relativa configurazione. Ciò ti consente di passare la richiesta personalizzata a un endpoint di servizio esterno.

I seguenti esempi creano messaggi di richiesta personalizzati:

Esempio 1

L'esempio seguente crea un oggetto di richiesta personalizzato conAssignMessage:

<AssignMessage name="AssignMessage-3">
  <AssignTo createNew="true" type="request">MyCustomRequest</AssignTo>
  <Copy>
    <Headers>
      <Header name="user-agent"/>
    </Headers>
  </Copy>
  <Set>
    <QueryParams>
      <QueryParam name="address">{request.queryparam.addy}</QueryParam>
    </QueryParams>
    <Verb>GET</Verb>
  </Set>
  <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
</AssignMessage>

Questo esempio:

  • Crea un nuovo oggetto del messaggio di richiesta denominato MyCustomRequest.
  • In MyCustomRequest, questo criterio:
    • Copia il valore dell'intestazione HTTP user-agent dalla richiesta in entrata al nuovo messaggio. Poiché <Copy> non specifica l'attributo source, Apigee utilizzerà il messaggio request come origine da cui copiare da.
    • Imposta il parametro di query address nel messaggio personalizzato sul valore del parametro di query addy della richiesta in entrata.
    • Imposta il verbo HTTP su GET.
  • Imposta <IgnoreUnresolvedVariables> su false. Quando <IgnoreUnresolvedVariables> è false, se una delle variabili a cui si fa riferimento nella configurazione dei criteri non esiste, Apigee entrerà nello stato di errore nel flusso API.

Esempio 2

Ecco un altro esempio che mostra come creare un oggetto di richiesta personalizzato conAssignMessage:

<AssignMessage name="AssignMessage-2">
  <AssignTo createNew="true" type="request">partner.request</AssignTo>
  <Set>
    <Verb>POST</Verb>
    <Payload contentType="text/xml">
      <request><operation>105</operation></request>
    </Payload>
  </Set>
</AssignMessage>

In questo esempio viene creata una nuova richiesta personalizzata denominata partner.request. Quindi, imposta <Verb> e <Payload> per la nuova richiesta.

Puoi accedere alle varie proprietà di un messaggio personalizzato in un altro criterioAssignMessage che si verifica più avanti nel flusso. L'esempio seguente ottiene il valore di un'intestazione da una risposta personalizzata denominata e lo inserisce in una nuova intestazione nel messaggio di richiesta:

<AssignMessage name="AM-Copy-Custom-Header">
  <AssignTo>request</AssignTo>
  <Set>
    <Headers>
      <Header name="injected-approval-id">{MyCalloutResponse.header.approval-id}</Header>
    </Headers>
  </Set>
</AssignMessage>

Codici di errore

Questa sezione descrive i codici e i messaggi di errore che vengono restituiti e le variabili di errore impostate da Apigee 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 Correggi
steps.assignmessage.SetVariableFailed 500 Il criterio non è stato in grado di impostare una variabile. Controlla la stringa di errore per trovare il nome della variabile non risolta.
steps.assignmessage.VariableOfNonMsgType 500

Questo errore si verifica se l'attributo source nell'elemento <Copy> è impostato su una variabile non di tipo message.

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

steps.assignmessage.UnresolvedVariable 500

Questo errore si verifica se una variabile specificata nel criterio AttributionMessage è:

  • Fuori ambito (non disponibile nel flusso specifico in cui viene eseguito il criterio)
  • o
  • Non può essere risolto (non è definito)

Errori di deployment

Questi errori possono verificarsi quando esegui il deployment di un proxy contenente questo criterio.

Nome errore Causa Correggi
InvalidIndex Se l'indice specificato negli elementi <Copy> e/o <Remove> del criterio AssignMessage è 0 o è un numero negativo, il deployment del proxy API non va a buon fine.
InvalidVariableName Se l'elemento secondario <Name> è vuoto o non è specificato nell'elemento <AssignVariable>, il deployment del proxy API non riesce perché non esiste un nome di variabile valido a cui assegnare un valore. È richiesto un nome di variabile valido.
InvalidPayload Un payload specificato nel criterio non è valido.

Variabili di errore

Queste variabili vengono impostate quando questo criterio attiva un errore in fase di runtime. Per maggiori informazioni, consulta la sezione Cosa devi sapere sugli errori dei 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 del guasto è l'ultima parte del codice di errore. fault.name Matches "UnresolvedVariable"
assignmessage.POLICY_NAME.failed POLICY_NAME è il nome specificato dall'utente del criterio che ha generato l'errore. assignmessage.AM-SetResponse.failed = true

Esempio di risposta di errore

{
   "fault":{
      "detail":{
         "errorcode":"steps.assignmessage.VariableOfNonMsgType"
      },
      "faultstring":"AssignMessage[AM-SetResponse]: value of variable is not of type Message"
   }
}

Esempio di regola di errore

<FaultRule name="Assign Message Faults">
    <Step>
        <Name>AM-CustomNonMessageTypeErrorResponse</Name>
        <Condition>(fault.name Matches "VariableOfNonMsgType") </Condition>
    </Step>
    <Step>
        <Name>AM-CustomSetVariableErrorResponse</Name>
        <Condition>(fault.name = "SetVariableFailed")</Condition>
    </Step>
    <Condition>(assignmessage.failed = true) </Condition>
</FaultRule>

Schema

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

Argomenti correlati

Gli esempi operativi del criterioAssignMessage sono disponibili negli esempi della piattaforma API.

Per un esempio più avanzato su come eseguire l'override di target.url da ProxyEndpoint, consulta questo articolo della community Apigee.

Per vedere un set path in azione in un criterio ServiceCallout, dai un'occhiata a questo esempio di apprendimento facendo pratica negli esempi di GitHub di Apigee. Basta clonare il repository e seguire le istruzioni in quell'argomento. L'esempio utilizza AssegnaMessage per impostare un percorso di richiesta, quindi utilizza un criterio ServiceCallout per inviare la richiesta a un servizio esterno.