Questa pagina si applica ad Apigee e Apigee hybrid.
Visualizza la documentazione di
Apigee Edge.
Cosa
Il criterio AssignMessage può modificare un messaggio di richiesta o risposta esistente oppure creare un nuovo messaggio di richiesta o risposta durante il flusso del proxy API. Le norme ti consentono di eseguire le seguenti azioni su questi messaggi:
- Aggiungere nuovi parametri del modulo, intestazioni o parametri di ricerca a un messaggio
- Copiare le proprietà esistenti da un messaggio a un altro
- Rimuovi intestazioni, parametri di ricerca, parametri del modulo e payload dei messaggi da un messaggio
- Impostare il valore delle proprietà in un messaggio
AssignMessage consente anche di impostare variabili di contesto arbitrarie, indipendentemente da una delle operazioni precedenti che potrebbero essere applicate a un messaggio.
Con AssignMessage, puoi aggiungere, modificare o rimuovere le proprietà della richiesta o della risposta. In alternativa, puoi utilizzare AssignMessage per creare una richiesta personalizzata o un messaggio di risposta e passarlo a una destinazione alternativa, come descritto in Creare messaggi di richiesta personalizzati.
Queste norme sono estendibili e il loro utilizzo potrebbe avere implicazioni in termini di costi o utilizzo, a seconda della licenza Apigee. Per informazioni sui tipi di criteri e sulle implicazioni di utilizzo, consulta Tipi di criteri.
Il criterio AssignMessage può creare o modificare le 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 appaiono nella configurazione del criterio. Se devi rimuovere tutte le intestazioni e impostarne
una specifica, devi includere l'elemento <Remove>
prima dell'elemento <Set>
.
Elemento <AssignMessage>
Definisce una policy AssignMessage.
Valore predefinito | Consulta la scheda Policy predefinita di seguito. |
Obbligatorio? | Obbligatorio |
Tipo | Oggetto complesso |
Elemento principale | N/D |
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> <Authentication> <HeaderName>HEADER_NAME</HeaderName> <!-- Use either GoogleAccessToken or GoogleIDToken --> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> </GoogleAccessToken> ----- or ----- <GoogleIDToken> <Audience ref='FLOW_VARIABLE_NAME>TARGET_URL</Scope> </GoogleAccessToken> </Authentication> <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>
Norme predefinite
L'esempio seguente mostra le impostazioni predefinite quando aggiungi un criterio AssignMessage al flusso nell'interfaccia utente di Apigee. Probabilmente non vorrai mai visualizzare tutti gli elementi di configurazione mostrati qui.
<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 inserisci una nuova policy AssignMessage nell'interfaccia utente Apigee, il modello contiene stub per tutte le
possibili operazioni. In genere, selezioni le operazioni che vuoi eseguire con questo criterio
e rimuovi il resto degli 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/D | Obbligatorio |
Il nome interno del criterio. Il valore dell'attributo Se vuoi, utilizza l'elemento |
continueOnError |
falso | Facoltativo | Imposta su false per restituire un errore quando un criterio non va a buon fine. Questo è un comportamento previsto per la maggior parte dei criteri. Imposta su true per continuare l'esecuzione del flusso anche dopo un fallimento del 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 | Ritirato | Questo attributo è stato ritirato. |
La tabella seguente 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> .
Per sovrascrivere intestazioni o parametri esistenti, utilizza l'elemento |
<Copy> |
Facoltativo | Copia le informazioni dal messaggio specificato dall'attributo source
al messaggio specificato dall'elemento <AssignTo> . |
<Remove> |
Facoltativo | Elimina gli elementi specificati dalla variabile del messaggio specificata nell'elemento
<AssignTo> . |
<Set> |
Facoltativo | Sostituisce i valori delle proprietà esistenti nella richiesta o nella risposta, specificati dall'elemento <AssignTo> .
|
Altri elementi secondari | ||
<AssignTo> |
Facoltativo | Specifica su quale messaggio opera il criterio AssignMessage. Può trattarsi della richiesta o della risposta standard oppure di 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. |
Ognuno di questi elementi secondari è descritto nelle sezioni seguenti.
Esempi
I seguenti esempi mostrano alcuni dei modi in cui puoi utilizzare il criterio AssignMessage:
1. Aggiungi intestazione
L'esempio seguente aggiunge 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 il payload
L'esempio seguente elimina 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 risposta
L'esempio seguente modifica un oggetto risposta esistente aggiungendovi 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. Modifica invece un messaggio di risposta esistente aggiungendo un'intestazione HTTP.
Poiché questo esempio specifica response
come nome della variabile nell'elemento
<AssignTo>
, questa policy modifica l'oggetto risposta originariamente
impostato con i dati restituiti dal server di destinazione.
L'intestazione HTTP aggiunta al messaggio di risposta da queste norme deriva da una variabile compilata dalle norme LookupCache. Pertanto, il messaggio di risposta modificato da questa policy 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: Imposta i contenuti dinamici
Puoi utilizzare AssignMessage 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, ad esempio: {prefix.name}
.
Il seguente esempio incorpora il valore della variabile di flusso dell'intestazione HTTP user-agent
in un elemento XML chiamato 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 variabili utilizzando gli attributi variablePrefix
e
variableSuffix
con caratteri delimitatori come mostrato nel seguente
esempio:
<AssignMessage name="AM-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 alle variabili di flusso.
Puoi anche utilizzare le parentesi graffe per inserire le variabili.
5: Rimuovi parametro di query
Il seguente esempio 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>
È una best practice rimuovere il parametro di query apikey
dal messaggio di richiesta
quando utilizzi il criterio VerifyAPIKey per l'autenticazione utente. In questo modo, impedisci
il trasferimento di informazioni sensibili sulle chiavi al target di backend.
6: Impostare/recuperare variabili
L'esempio seguente utilizza tre policy AssignMessage:
- Crea tre variabili di flusso nella richiesta, con valori statici
- Recupera le variabili di flusso in modo dinamico in una seconda policy nel flusso di richiesta
- Li 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 e <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>
Nella seconda policy, l'elemento <Ref>
fa riferimento alla variabile di origine,
mentre 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 norme:
- Aggiungi le norme n. 1 e n. 2 al flusso di richiesta. Assicurati di inserire la norma n. 1 prima della norma n. 2.
- Aggiungi la terza norma nel flusso di risposta.
- Il terzo criterio utilizza l'elemento
<Set>
per aggiungere le variabili alla risposta. L'esempio seguente crea 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>
prevede di racchiuderle tra parentesi graffe.Assicurati di impostare l'attributo
contentType
dell'elemento<Payload>
suapplication/xml
. - Invia una richiesta al proxy API, ad esempio:
curl -vL https://ahamilton-eval-test.apigee.net/myproxy
Se vuoi, puoi inviare i risultati tramite una utility come
xmllint
in modo che l'XML venga visualizzato in una struttura ben formattata:curl -vL https://ahamilton-eval-test.apigee.net/myproxy | xmllint --format -
Il corpo della risposta dovrebbe essere simile al seguente:
42 test gopher
7: Ottieni le intestazioni di risposta di ServiceCallout
Nell'esempio seguente, supponiamo che nella richiesta del proxy API sia presente un ServiceCallout policy e che la risposta callout contenga più intestazioni con lo stesso nome (Set-Cookie
). Supponendo che la variabile di risposta di Service Callout sia quella predefinita calloutResponse
, il seguente criterio recupera 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 invece la seguente variabile:
{calloutResponse.header.Set-Cookie.values}
8: Memorizza e rimuovi parametri del modulo, intestazioni, parametri di query
Se vuoi utilizzare <Remove>
per eliminare le intestazioni, parametri di ricerca o i parametri del modulo, ma
mantenere l'accesso ai relativi valori in un secondo momento nel flusso delle norme, puoi memorizzarli 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 contiene esempi aggiuntivi. Per altri esempi, consulta l'esempio AssignMessage su GitHub.
Riferimento all'elemento secondario
Questa sezione descrive 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/D |
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
Il seguente esempio modifica il messaggio di richiesta recuperando i valori di tre parametri della stringa di query dalla richiesta iniziale e impostandoli come parametri del modulo nella richiesta dell'endpoint di destinazione, per poi rimuovere tutti i parametri della stringa di query originali:
<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 un singolo parametro di query
con un valore statico alla richiesta:
<AssignMessage name="AM-add-queryparams-1"> <Add> <QueryParams> <QueryParam name="myParam">42</QueryParam> </QueryParams> </Add> <AssignTo>request</AssignTo> </AssignMessage>
Questo esempio utilizza <Add>
nel preflusso della richiesta. Se esamini i risultati in uno strumento
come la panoramica del 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>
(figlio di <Add>
)
Aggiunge nuovi parametri del modulo al messaggio di richiesta. Questo elemento non ha alcun effetto su un messaggio di risposta.
Valore predefinito | N/D |
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
L'esempio seguente aggiunge un singolo parametro del modulo (answer
) e un valore statico (42
) alla
richiesta:
<AssignMessage name="AM-add-formparams-1"> <Add> <FormParams> <FormParam name="answer">42</FormParam> </FormParams> </Add> <AssignTo>request</AssignTo> </AssignMessage>
Esempio 2
Il seguente esempio recupera il valore del parametro di query name
e
lo aggiunge alla richiesta come parametro del modulo, quindi 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
Il seguente esempio aggiunge più parametri del 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 recupera i parametri della stringa di query dalla richiesta di origine e li aggiunge come parametri del modulo con nomi diversi. Poi rimuove i parametri di ricerca originali. Apigee invierà la richiesta modificata all'endpoint di destinazione.
Puoi utilizzare la panoramica del debug per esaminare il flusso. Vedrai che il corpo della richiesta contiene i dati del modulo codificati nell'URL, che originariamente sono stati passati come parametri della stringa di query:
username=nick&zip_code=90210&default_language=en
Puoi utilizzare <FormParams>
solo se sono soddisfatti i seguenti criteri:
- Verbo HTTP: POST
- Tipo di messaggio: richiesta
- Uno (o entrambi) dei seguenti elementi:
- Dati del modulo: impostato su un valore o su "" (la stringa vuota). Ad esempio, con
curl
, aggiungi-d ""
alla richiesta. - Intestazione
Content-Length
: impostata su 0 (se non sono presenti dati nella richiesta originale; altrimenti, la lunghezza corrente, in byte). Ad esempio, concurl
aggiungi-H "Content-Length: 0"
alla richiesta.
- Dati del modulo: impostato su un valore o su "" (la stringa vuota). Ad esempio, con
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>
(figlio di <Add>
)
Aggiunge nuove intestazioni alla richiesta o alla risposta specificata, che viene specificata dall'elemento
<AssignTo>
.
Valore predefinito | N/D |
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>
(figlio di <Add>
)
Aggiunge nuovi parametri di ricerca alla richiesta. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
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
L'esempio seguente aggiunge il parametro di query myParam
alla richiesta e gli assegna 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 sono soddisfatti i seguenti criteri:
- Verbi HTTP:
GET
,POST
,PATCH
,DELETE
- Tipo di messaggio: richiesta
Inoltre, puoi impostare i parametri di query solo quando l'attributo type
dell'elemento <AssignTo>
è un messaggio di richiesta. Impostarli nella risposta non ha alcun effetto.
Se definisci un array vuoto di parametri di ricerca nella norma
(<Add><QueryParams/></Add>
), la norma non aggiunge alcun parametro
di ricerca. È come omettere <QueryParams>
.
<AssignTo>
Determina su quale oggetto opera il criterio AssignMessage. 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 di richiesta o risposta personalizzato
Tieni presente che in alcuni casi non puoi modificare l'oggetto su cui agisce il criterio AssignMessage.
Ad esempio, non puoi utilizzare <Add>
o <Set>
per aggiungere o modificare i parametri di query
(<QueryParams>
) o i parametri del modulo (<FormParams>
) nella risposta. Puoi manipolare solo i parametri di query e i parametri del modulo nella richiesta.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignMessage>
|
Elementi secondari | Nessuno |
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 sulla posizione in cui viene eseguito il criterio. Se il criterio viene eseguito nel flusso della 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 alcun messaggio nel testo di <AssignTo>
. Ciò implica
che le norme agiranno sul messaggio request
o response
,
a seconda di dove vengono eseguite.
<AssignMessage name="assignto-1"> <AssignTo createNew="false" transport="http" type="request"/> <!-- no-op --> ... </AssignMessage>
Se specifichi createNew="false"
e non fornisci esplicitamente un nome del messaggio,
gli altri attributi di <AssignTo>
non sono pertinenti. In questo caso, potresti
voler omettere completamente l'elemento <AssignTo>
.
Esempio 2
L'esempio seguente crea un nuovo oggetto richiesta, sovrascrivendo l'oggetto esistente:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request"/> ... </AssignMessage>
Quando crei un nuovo oggetto richiesta o risposta, gli altri elementi del criterio AssignMessage (ad esempio <Add>
, <Set>
e <Copy>
) agiscono su questo nuovo
oggetto richiesta o risposta.
Puoi accedere al nuovo oggetto richiesta in altre norme più avanti nel flusso o inviare il nuovo oggetto richiesta a un servizio esterno con un'norma ServiceCallout.
Esempio 3
Il seguente esempio crea un nuovo oggetto richiesta denominato MyRequestObject
:
<AssignMessage name="assignto-2"> <AssignTo createNew="true" transport="http" type="request">MyRequestObject</AssignTo> ... </AssignMessage>
Quando crei un nuovo oggetto richiesta o risposta, gli altri elementi del criterio AssignMessage (come <Add>
, <Set>
e <Copy>
) agiscono su questo nuovo
oggetto richiesta.
Puoi accedere al nuovo oggetto richiesta per nome in altre policy più avanti nel flusso oppure inviare il nuovo oggetto richiesta a un servizio esterno con una policy ServiceCallout.
La tabella seguente descrive gli attributi di <AssignTo>
:
Attributo | Descrizione | Obbligatorio? | Tipo |
---|---|---|---|
createNew |
Determina se questo criterio crea un nuovo messaggio durante l'assegnazione dei valori. Se Se
Se
|
Facoltativo | Booleano |
transport |
Specifica il tipo di trasporto per il tipo di messaggio di richiesta o risposta. Il valore predefinito è |
Facoltativo | Stringa |
type |
Specifica il tipo di nuovo messaggio quando createNew è true . I valori validi sono request o response .
Il valore predefinito è |
Facoltativo | Stringa |
<AssignVariable>
Assegna un valore a una variabile di flusso di destinazione (ad esempio una variabile il cui valore è impostato dal criterio AssignMessage). Se la variabile di flusso non esiste, <AssignVariable>
la crea. Puoi utilizzare più elementi AssignVariable all'interno del criterio AssignMessage. Vengono
eseguiti nell'ordine di visualizzazione nella configurazione dei criteri.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Tipo complesso |
Elemento principale |
<AssignMessage>
|
Elementi secondari |
<Name> (obbligatorio)<PropertySetRef> <Ref> <ResourceURL> <Template> <Value> |
Il valore che assegni alla variabile di flusso di destinazione può essere uno dei seguenti:
- Stringa letterale: utilizza l'elemento secondario
<Value>
per specificare un valore di stringa letterale per la variabile di flusso di destinazione. - Variabile di flusso: utilizza l'elemento secondario
<Ref>
per specificare il valore di una variabile di flusso esistente per la variabile di flusso di destinazione. Per un elenco completo delle variabili di flusso che possono essere utilizzate come origine, consulta Riferimento alle variabili di flusso. - Set di proprietà: utilizza l'elemento secondario
<PropertySetRef>
per recuperare il valore da una coppia nome/chiave di un set di proprietà e memorizzarlo in una variabile di flusso. Consente di accedere dinamicamente ai set di proprietà. - URL risorsa: utilizza l'elemento secondario
<ResourceURL>
per specificare un URL per una risorsa di testo di tipo XSL, XSD, WSDL, JavaScript o specifica OpenAPI. In questo modo, i contenuti della risorsa vengono assegnati alla variabile di flusso denominata. - Modello di messaggio: utilizza l'elemento secondario
<Template>
per specificare un modello di messaggio per la variabile di flusso di destinazione.
L'ordine di precedenza per 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>
, questo ha la precedenza sugli elementi
<Ref>
e <Value>
associati.
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
Il seguente esempio assegna il valore della variabile di flusso
request.header.user-agent
alla variabile di flusso di destinazione myvar
e il valore del parametro di ricerca country
alla variabile di 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 uno dei due assegnamenti non riesce, Apigee assegna invece il valore ErrorOnCopy
alla variabile di 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 disattivare il comportamento predefinito di
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 utilizzo comune di <AssignVariable>
è impostare un valore predefinito per un parametro di query, un'intestazione o
un altro valore che può essere trasmesso con la richiesta. A tale scopo, utilizza una combinazione degli elementi secondari
<Ref>
e <Value>
. Per ulteriori
informazioni, consulta gli esempi per <Ref>
.
<Name>
(figlio di <AssignVariable>
)
Specifica il nome della variabile di flusso di destinazione, ovvero la variabile il cui valore è impostato dal criterio AssignMessage. Se la variabile denominata in <Name>
non esiste, il criterio ne crea una con quel nome.
Valore predefinito | N/D |
Obbligatorio? | Obbligatorio |
Tipo | Stringa |
Elemento principale |
<AssignVariable>
|
Elementi secondari | Nessuno |
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>
(figlio di <AssignVariable>
)
Questo elemento consente di recuperare dinamicamente il valore di una coppia chiave/nome di un insieme di proprietà. Per scoprire di più sui set di proprietà, consulta Utilizzo dei set di proprietà.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignVariable>
|
Elementi secondari | Nessuno |
Un insieme di proprietà è costituito da una coppia nome/chiave.
Ad esempio: propset1.id=12345
,
dove propset1
è il nome del set di proprietà, id
è una chiave e
12345
è il valore della chiave.
L'elemento secondario PropertySetRef
consente di selezionare dinamicamente i nomi e/o le chiavi dei set di proprietà. Supponiamo
di avere 200 regole di routing in un file di insieme di proprietà. Puoi accedere alle regole del set di proprietà
nel seguente modo, dove routingrules
è il nome del set di proprietà e rule1
,
rule2
, rulen
sono chiavi:
propertyset.routingrules.rule1 propertyset.routingrules.rule2 propertyset.routingrules.rulen
Per accedere a queste proprietà in un flusso proxy API, devi sapere quale regola vuoi selezionare in fase di progettazione. Tuttavia, supponi che il nome della regola sia presente nell'intestazione o nel payload della richiesta. Un modo per selezionare la regola è utilizzare un criterio JavaScript con un codice come il seguente:
context.getVariables("propertyset.routingrules." + ruleName); //assuming ruleName was populated earlier.
D'altra parte, la funzionalità AssignMessage PropertySetRef
ti consente di selezionare dinamicamente una chiave di proprietà senza
introdurre JavaScript.
Puoi utilizzare una combinazione di variabili di flusso e valori letterali di stringa nell'elemento <PropertySetRef>
. Per maggiori 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
Questo esempio assegna il valore di una chiave del set di proprietà a una variabile di flusso. In questo caso,
il nome del set di proprietà viene ottenuto dall'intestazione propset_name
, la chiave viene fornita
nell'intestazione propset_key
e il valore assegnato alla chiave viene memorizzato 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
Questo esempio assegna il valore di una chiave del set di proprietà a una variabile di flusso utilizzando un nome di chiave fisso (stringa letterale). In questo caso, il nome del set di proprietà viene ottenuto dall'intestazione propset_name
, la chiave è la stringa letterale key1
e il valore assegnato alla chiave è memorizzato 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>
(figlio di <AssignVariable>
)
Specifica l'origine dell'assegnazione come variabile di flusso. La variabile di flusso può essere una delle variabili di flusso predefinite (elencate nel riferimento alle variabili di flusso) o una variabile di flusso personalizzata che hai creato.
Il valore di <Ref>
viene sempre interpretato come una variabile di flusso; non puoi
specificare una stringa letterale come
valore. Per assegnare un valore stringa letterale, utilizza invece l'elemento <Value>
.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignVariable>
|
Elementi secondari | Nessuno |
Quando specifichi una variabile di flusso con <Ref>
, ometti le
parentesi quadre {}
che normalmente utilizzeresti 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 di 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 invece il valore
di <Value>
alla variabile di 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
Il seguente esempio assegna il valore della variabile di flusso
request.header.user-agent
alla variabile di flusso di destinazione myvar
e
il valore del parametro di ricerca 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 di flusso di destinazione myvar
e il valore
del parametro di ricerca 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 validi, Apigee assegna
il valore ErrorOnCopy
alle nuove variabili.
Esempio 3
Un caso d'uso comune per <AssignVariable>
è impostare il valore predefinito di un parametro di query, un'intestazione o un altro valore che può essere trasmesso con la richiesta. Ad esempio, crei
un proxy API meteo in cui la richiesta accetta un singolo parametro di ricerca denominato w
. Questo
parametro contiene l'ID della città per cui vuoi conoscere le condizioni meteo. L'URL della richiesta ha
il formato:
http://myCO.com/v1/weather/forecastrss?w=CITY_ID
Per definire un valore predefinito per w
, crea un criterio AssignMessage 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 è null, il che significa che il parametro di query w
è stato
omesso dalla richiesta, questo esempio utilizza il valore predefinito dell'elemento
<Value>
. Pertanto, puoi effettuare una richiesta a questo proxy API che omette il parametro di query w
:
http://myCO.com/v1/weather/forecastrss
e che il proxy API restituisca comunque 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 di <Ref>
,
e il valore di <IgnoreUnresolvedVariables>
è false
, Apigee genera un errore.
<ResourceURL>
(figlio 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 a cui viene fatto riferimento. La risorsa può essere di tipo XSD, XSL, WSDL, JavaScript, insieme di proprietà o specifica OpenAPI.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignVariable>
|
Elementi secondari | Nessuno |
Se la risorsa specificata da <ResourceURL>
non esiste, allora: se il valore di
<IgnoreUnresolvedVariables>
è true
, Apigee
assegna il valore null
alla variabile di 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 testuale accetta un valore stringa e viene interpretato come un modello di messaggio. Uno qualsiasi di questi è valido:
jsc://my-js-file.js wsdl://{variable-goes-here} {variable-goes-here}
Esempio 1
L'esempio seguente assegna il valore di una risorsa JSON, caricata nel proxy nella cartella jsc
, alla 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
Il seguente esempio assegna il valore di una risorsa di specifica OpenAPI, caricata nel proxy
nella cartella oas
, alla variabile di flusso assigned-variable
e poi imposta
questo 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>
(figlio di <AssignVariable>
)
Specifica un modello di messaggio. Un modello di messaggio consente di eseguire la sostituzione di stringhe variabili durante l'esecuzione del criterio e può combinare stringhe letterali con nomi di variabili racchiusi tra parentesi graffe. Inoltre, i modelli di messaggio supportano funzioni come l'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 per sviluppatori. Quando Apigee identifica l'app per sviluppatori dopo aver verificato la chiave API
o il token di sicurezza (tramite un criterio aggiuntivo), l'elemento <AssignVariable>
potrebbe utilizzare il modello di messaggio dell'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 chiamato message_template
nell'app per sviluppatori che effettua la chiamata API, dove è stato utilizzato il criterio VerifyAPIKey per verificare la chiave API dell'app:
<Template ref='verifyapikey.myVerifyAPIKeyPolicy.app.name.message_template'/>
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignVariable>
|
Elementi secondari | Nessuno |
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
Il seguente esempio utilizza la sintassi dei modelli di messaggi per concatenare due variabili di contesto con una stringa letterale (un trattino) tra le due:
<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 a cui viene fatto riferimento non è nulla, questo valore viene utilizzato come modello. Se il valore
di riferimento è nullo, viene utilizzato il valore di testo (in questo caso, {system.uuid}-{messageid}
)
come modello. Questo pattern è utile per fornire un valore override
, dove
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 a cui viene fatto 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>
(figlio di <AssignVariable>
)
Definisce il valore della variabile di flusso di destinazione impostata con <AssignVariable>
. Il valore
viene sempre interpretato come una stringa letterale; non puoi utilizzare una variabile di flusso come valore, anche
se racchiudi il valore tra parentesi ({}
). Per utilizzare una variabile di flusso, utilizza <Ref>
in alternativa.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignVariable>
|
Elementi secondari | Nessuno |
Se utilizzato in combinazione con l'elemento <Ref>
, <Value>
funge da valore predefinito (o di riserva). Se <Ref>
non è 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 di 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 ricerca 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 va a buon fine, <AssignVariable>
assegna invece il valore ErrorOnCopy
alla variabile di flusso di destinazione.
<Copy>
Copia i valori dal messaggio specificato dall'attributo source
al messaggio specificato dall'elemento <AssignTo>
. Se non specifichi
una destinazione con <AssignTo>
, questo criterio copia i valori nella richiesta o nella risposta,
a seconda di dove viene eseguito nel flusso.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<AssignMessage>
|
Elementi secondari |
<FormParams> <Headers> <Path> <Payload> <QueryParams> <StatusCode> <Verb> <Version> |
Se non specifichi elementi secondari 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
Il seguente esempio 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, le norme non copiano queste parti del messaggio.
Esempio 2
Il seguente esempio rimuove innanzitutto tutto ciò che è presente nel messaggio response
esistente, quindi
copia tutti i valori di un altro messaggio chiamato secondResponse
nel messaggio
response
:
<AssignMessage name='AM-Copy-Response'> <AssignTo>response</AssignTo> <!-- first remove any existing values --> <Remove/> <!-- then copy everything from the designated message --> <Copy source="secondResponse"/> </AssignMessage>
L'elemento <Copy>
ha un solo attributo:
Attributo | Descrizione | Obbligatorio? | Tipo |
---|---|---|---|
origine |
Specifica l'oggetto di origine della copia.
|
Facoltativo | Stringa |
<FormParams>
(figlio di <Copy>
)
Copia i parametri del modulo 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/D |
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
Il seguente esempio copia un singolo parametro del modulo dalla richiesta alla
richiesta personalizzata MyCustomRequest
:
<AssignMessage name="AM-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
Il seguente esempio copia tutti i parametri del modulo nella richiesta personalizzata
MyCustomRequest
:
<AssignMessage name="AM-copy-formparams-2"> <Copy source="request"> <FormParams/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Esempio 3
Il seguente esempio copia tre parametri del modulo nella richiesta personalizzata
MyCustomRequest
:
<AssignMessage name="AM-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 sono presenti più parametri del modulo con lo stesso nome, utilizza la seguente sintassi:
<AssignMessage name="AM-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>
Questo esempio copia f1
, f2
e il secondo valore di f3
. Se f3
ha un solo
valore, non viene copiato.
Puoi utilizzare <Copy>
/<FormParams>
solo se vengono soddisfatti i seguenti criteri:
- Il tipo di messaggio sia per l'origine che per la destinazione è richiesta
- Il verbo HTTP per l'origine e la destinazione è
POST
oPUT
- Il messaggio di origine ha l'intestazione
Content-Type
impostata suapplication/x-www-form-urlencoded
.
Quando copi <FormParams>
, <Copy>
imposta l'intestazione Content-Type
nel messaggio di destinazione (indicato dall'elemento <AssignTo>
)
su application/x-www-form-urlencoded
.
<Headers>
(figlio di <Copy>
)
Copia le intestazioni HTTP da il messaggio di richiesta o risposta specificato dall'attributo source
dell'elemento <Copy>
a il messaggio di richiesta o risposta specificato dall'elemento <AssignTo>
.
Valore predefinito | N/D |
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 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="AM-copy-headers-2"> <Copy source="request"> <Headers/> </Copy> <AssignTo createNew="true" transport="http" type="request">MyCustomRequest</AssignTo> </AssignMessage>
Esempio 3
Se sono presenti più intestazioni con lo stesso nome, utilizza la seguente sintassi:
<AssignMessage name="AM-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>
Questo esempio copia h1
, h2
e il secondo valore di h3
. Se h3
ha un solo
valore, non viene copiato.
<Path>
(figlio 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 da il messaggio di richiesta specificato dall'attributo source
dell'elemento <Copy>
a il messaggio di richiesta specificato dall'elemento <AssignTo>
.
Valore predefinito | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<Copy>
|
Elementi secondari | Nessuno |
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 che AssignMessage deve copiare il percorso dalla richiesta di origine al nuovo oggetto 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 <Copy>
/<Path>
solo se vengono soddisfatti i seguenti criteri:
- Il tipo di messaggio sia per l'origine che per la destinazione è richiesta
<Payload>
(figlio 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 da il messaggio specificato dall'attributo source
dell'elemento <Copy>
a il messaggio specificato dall'elemento <AssignTo>
.
Valore predefinito | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<Copy>
|
Elementi secondari | Nessuno |
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>
(figlio di <Copy>
)
Copia i parametri della stringa di query da una richiesta specificata dall'attributo source
dell'elemento <Copy>
a una richiesta specificata dall'elemento <AssignTo>
. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Un array di elementi <QueryParam> o un array vuoto |
Elemento principale |
<QueryParam>
|
Elementi secondari | Nessuno |
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
Il seguente esempio copia il parametro di query my_param
dalla richiesta in un nuovo oggetto 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 i parametri di query dalla richiesta in un nuovo oggetto 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 sono presenti 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>
Questo esempio copia qp1
, qp2
e il secondo valore di qp3
. Se qp3
ha un solo valore, non viene copiato.
Puoi utilizzare <Copy>
/<QueryParams>
solo se vengono soddisfatti i seguenti criteri:
- Verbi HTTP:
GET
,PUT
,POST
,PATCH
,DELETE
- Il tipo di messaggio sia per l'origine che per la destinazione è richiesta
<StatusCode>
(figlio 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 da il messaggio di risposta specificato dall'attributo source
dell'elemento <Copy>
a il messaggio di risposta specificato dall'elemento <AssignTo>
.
Valore predefinito | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<Copy>
|
Elementi secondari | Nessuno |
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 personalizzato:
<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 quando i messaggi di origine e di destinazione sono di tipo risposta.
Un utilizzo comune di <StatusCode>
è impostare il codice di stato della risposta del proxy su
un valore diverso da quello ricevuto dalla destinazione.
<Verb>
(figlio 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 | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<Copy>
|
Elementi secondari | Nessuno |
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
Il seguente esempio imposta <Verb>
su true
, che copia il verbo dalla
richiesta predefinita a 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 <Copy>
/<Verb>
solo se vengono soddisfatti i seguenti criteri:
- Il tipo di messaggio sia per l'origine che per la destinazione è richiesta
<Version>
(figlio 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 | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<Copy>
|
Elementi secondari | Nessuno |
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
Il seguente esempio imposta <Version>
su true
nella richiesta, che copia la
versione dall'oggetto richiesta predefinito a un nuovo oggetto 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 <Copy>
/<Version>
solo se vengono soddisfatti i seguenti criteri:
- Il tipo di messaggio sia per l'origine che per la destinazione è richiesta
<DisplayName>
Da utilizzare insieme 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/D |
Obbligatorio? | Facoltativo. Se ometti <DisplayName> , viene utilizzato il valore dell'attributo name del criterio. |
Tipo | Stringa |
Elemento principale | <PolicyElement> |
Elementi secondari | Nessuno |
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 | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<AssignMessage>
|
Elementi secondari | Nessuno |
Imposta su 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 <AssignMessage>
's
continueOnError
su true
in quanto è specifica per l'impostazione e l'ottenimento 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 è definita, questo criterio non genererà un errore.
<Remove>
Rimuove le intestazioni, i parametri di query, i parametri del modulo e/o il payload del messaggio da
un messaggio. Un tag <Remove>
vuoto rimuove tutto dal messaggio.
Il messaggio interessato può essere una richiesta o una risposta. Specifica su quale messaggio <Remove>
agisce utilizzando l'elemento <AssignTo>
.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Tipo complesso |
Elemento principale |
<AssignMessage>
|
Elementi secondari |
<FormParams> <Headers> <Payload> <QueryParams> |
Un caso d'uso comune per <Remove>
è eliminare un parametro di query o un'intestazione che contiene informazioni sensibili
dall'oggetto richiesta in entrata, per evitare di passarlo 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
Il seguente esempio 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 al client solo le intestazioni HTTP.
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
L'esempio seguente rimuove tutto da un oggetto messaggio:
<AssignMessage name="AM-remove-3"> <Remove/> <AssignTo>request</AssignTo> </AssignMessage>
In genere, questa operazione viene eseguita solo se si intende utilizzare l'elemento <Set>
o
l'elemento <Copy>
per impostare alcuni valori di sostituzione nel messaggio.
<FormParams>
(figlio di <Remove>
)
Rimuove i parametri del modulo specificati dalla richiesta. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
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
Il seguente esempio 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
Il seguente esempio rimuove tutti i parametri del modulo dalla richiesta:
<AssignMessage name="AM-remove-formparams-2"> <Remove> <FormParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Esempio 3
Se sono presenti 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 sono soddisfatti i seguenti criteri:
- Tipo di messaggio: richiesta
Content-Type
:application/x-www-form-urlencoded
<Headers>
(figlio di <Remove>
)
Rimuove le intestazioni HTTP specificate dalla richiesta o dalla risposta, specificate dall'elemento
<AssignTo>
.
Valore predefinito | N/D |
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 sono presenti 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 h1
, h2
e il secondo valore di h3
dalla richiesta. Se h3
ha un solo valore, non viene rimosso.
<Payload>
(figlio di <Remove>
)
Determina se <Remove>
elimina il payload nella richiesta o nella risposta, che è
specificato dall'elemento <AssignTo>
. Imposta su true
per
cancellare il payload; altrimenti false
. Il valore predefinito è false
.
Valore predefinito | Falso |
Obbligatorio? | Facoltativo |
Tipo | Booleano |
Elemento principale |
<Remove>
|
Elementi secondari | Nessuno |
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
Il seguente esempio 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>
(figlio di <Remove>
)
Rimuove i parametri di query specificati dalla richiesta. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
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
Il seguente esempio 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>
Esempio 2
Il seguente esempio rimuove tutti i parametri di query dalla richiesta:
<AssignMessage name="AM-remove-queryparams-2"> <Remove> <QueryParams/> </Remove> <AssignTo>request</AssignTo> </AssignMessage>
Esempio 3
Se sono presenti 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 qp1
, qp2
e il secondo valore di qp3
dalla richiesta. Se
qp3
ha un solo valore, non viene rimosso.
Puoi utilizzare <QueryParams>
solo se sono soddisfatti i seguenti criteri:
- Verbi HTTP:
GET
,POST
,PATCH
,DELETE
- Tipo di messaggio: richiesta
<Set>
Imposta le informazioni nel messaggio di richiesta o risposta, specificate dall'elemento
<AssignTo>
. <Set>
sovrascrive le intestazioni o
i parametri di query o modulo già esistenti nel messaggio originale o ne aggiunge di nuovi se non esistono.
Le intestazioni e i parametri di query e modulo
in un messaggio HTTP possono contenere più valori. Per aggiungere valori aggiuntivi per un'intestazione o un parametro, utilizza
l'elemento <Add>
.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Tipo complesso |
Elemento principale |
<AssignMessage>
|
Elementi secondari |
<Authentication> <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> <Authentication> <HeaderName>HEADER_NAME</HeaderName> <!-- Use either GoogleAccessToken or GoogleIDToken --> <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> </GoogleAccessToken> ----- or ----- <GoogleIDToken> <Audience ref='FLOW_VARIABLE_NAME>TARGET_URL</Scope> </GoogleAccessToken> </Authentication> <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 allegato al flusso di richiesta, il sistema upstream potrà ricevere un'intestazione aggiuntiva non 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>
<Authentication> (elemento secondario di <Set>
)
Genera un token di accesso Google OAuth 2.0 o un token ID OpenID Connect emesso da Google e lo imposta nell'intestazione Authorization
. Ciò è utile quando il proxy
deve effettuare chiamate autenticate a servizi Google e servizi personalizzati in esecuzione
su determinati prodotti Google Cloud, come Cloud Functions e
Cloud Run.
L'utilizzo di questo elemento richiede i passaggi di configurazione e deployment descritti in
Utilizzo dell'autenticazione Google. Con
la configurazione corretta, il criterio crea un token e lo aggiunge all'intestazione appropriata nella richiesta.
Gli elementi secondari GoogleAccessToken
e GoogleIDToken
ti consentono di configurare il criterio per generare un token Google OAuth o OpenID Connect. Puoi
selezionare uno di questi elementi secondari in base al requisito del servizio che vuoi chiamare.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Tipo complesso |
Elemento principale |
<Set>
|
Elementi secondari |
<HeaderName> <GoogleAccessToken> <GoogleIdToken> |
L'elemento Authentication
utilizza la seguente sintassi:
Sintassi
<AssignMessage> ... <Set> <Authentication> <HeaderName>HEADER_NAME</HeaderName> --EITHER-- <GoogleAccessToken> <Scopes> <Scope>SCOPE</Scope> ... </Scopes> <GoogleAccessToken> --OR-- <GoogleIDToken> <Audience ref="FLOW_VARIABLE">TARGET_URL</Audience> </GoogleIDToken> </Authentication> </Set> ... </AssignMessage>
Utilizzo del token di accesso
L'esempio seguente mostra l'elemento GoogleAccessToken
:
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
Utilizzo del token ID
L'esempio seguente mostra l'elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> </GoogleIDToken> </Authentication>
Utilizzo di HeaderName
L'esempio seguente mostra l'elemento HeaderName
:
<Authentication> <HeaderName>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> </GoogleAccessToken> </Authentication>
<HeaderName> (elemento secondario di <Authentication>
)
Per impostazione predefinita, quando è presente una configurazione di autenticazione, Apigee genera un token di connessione e lo inserisce nell'intestazione Authorization
del messaggio inviato al sistema di destinazione.
L'elemento HeaderName
ti consente di specificare il nome di un'intestazione diversa
per contenere il token di autenticazione. L'intestazione Authorization
,
se presente, viene lasciata invariata e inviata anche nella richiesta.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<Authentication>
|
Elementi secondari |
Nessuno |
L'elemento HeaderName
utilizza la seguente sintassi:
Sintassi
<AssignMessage> ... <Authentication> <HeaderName>HEADER_NAME</HeaderName> <GoogleAccessToken> ... </GoogleAccessToken> </Authentication> ... </AssignMessage>
Con stringa statica
In questo esempio, il token di autenticazione generato viene aggiunto, per impostazione predefinita, a un'intestazione denominata Authorization
che viene inviata al sistema di destinazione. L'intestazione Authorization
,
se presente, viene lasciata invariata e inviata anche nella richiesta.
<Authentication> <HeaderName>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scope> </Scopes> </GoogleAccessToken> </Authentication>
Con riferimento variabile
In questo esempio, il token di autenticazione generato viene aggiunto, per impostazione predefinita, a un'intestazione denominata Authorization
che viene inviata al sistema di destinazione. Se my-variable
ha un valore, questo viene utilizzato
al posto della stringa predefinita. L'intestazione Authorization
,
se presente, viene lasciata invariata e inviata anche nella richiesta.
<Authentication> <HeaderName ref='my-variable'>Authorization</HeaderName> <GoogleAccessToken> <Scopes> <Scopes>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> >/GoogleAccessToken> </Authentication>
<GoogleAccessToken> (elemento secondario di <Authentication>
)
Genera token Google OAuth 2.0 per effettuare chiamate autenticate ai servizi Google. I token OAuth di Google possono essere utilizzati per chiamare molti tipi di servizi Google, come Cloud Logging e Secret Manager.
Valore predefinito | N/D |
Obbligatorio? | Deve essere presente l'elemento secondario GoogleAccessToken o GoogleIDToken . |
Tipo | Stringa |
Elemento principale |
<Authentication>
|
Elementi secondari |
<Scopes> |
L'elemento GoogleAccessToken
utilizza la seguente sintassi:
Sintassi
<AssignMessage> ... <Authentication> <GoogleAccessToken> <Scopes> <Scope>SCOPE_1</Scope> ... </Scopes> >/GoogleAccessToken> </Authentication> ... </AssignMessage>
Esempio 1
L'esempio seguente mostra l'elemento GoogleAccessToken
:
<Authentication> <GoogleAccessToken> <Scopes> <Scope>https://www.googleapis.com/auth/cloud-platform</Scopes> </Scopes> </GoogleAccessToken> </Authentication>
<Scopes> (elemento secondario di <GoogleAccessToken>
)
Identifica gli ambiti da includere nel token di accesso OAuth 2.0. Per ulteriori informazioni, vedi
Ambiti OAuth 2.0 per le API di Google. Puoi aggiungere uno o più elementi secondari <Scope>
sotto questo elemento.
Valore predefinito | N/D |
Obbligatorio? | Obbligatorio |
Tipo | Stringa |
Elemento principale |
<GoogleAccessToken>
|
Elementi secondari |
<Scope> |
L'elemento Scopes
utilizza la seguente sintassi:
<Scopes> <Scope>SCOPE_1</Scope> <Scope>SCOPE_2</Scope> ... </Scopes>
<Scope> (elemento secondario di <Scopes>
)
Specifica un ambito API Google valido. Per ulteriori informazioni, vedi Ambiti OAuth 2.0 per le API di Google.
Valore predefinito | N/D |
Obbligatorio? | Almeno un valore è obbligatorio. |
Tipo | Stringa |
Elemento principale |
<Scopes>
|
Elementi secondari |
Nessuno |
L'elemento Scope
utilizza la seguente sintassi:
<Scope>SCOPE_1</Scope>
<GoogleIDToken> (elemento secondario di <GoogleAccessToken>
)
Genera token OpenID Connect emessi da Google per effettuare chiamate autenticate ai servizi Google.
Valore predefinito | N/D |
Obbligatorio? | Deve essere presente l'elemento secondario GoogleAccessToken o GoogleIDToken . |
Tipo | Stringa |
Elemento principale |
<Authentication>
|
Elementi secondari |
<Audience> |
L'elemento GoogleIDToken
utilizza la seguente sintassi:
Sintassi
<AssignMessage> ... <Authentication> <GoogleIDToken> <Audience ref="FLOW_VARIABLE_NAME">TARGET_URL</Audience> </GoogleIDToken> </Authentication> </AssignMessage>
Esempio 1
L'esempio seguente mostra l'elemento GoogleIDToken
:
<Authentication> <GoogleIDToken> <Audience>https://httpserver0-bar.run.app</Audience> </GoogleIDToken> </Authentication>
<Audience> (elemento secondario di <GoogleAccessToken>
)
Il pubblico per il token di autenticazione generato, ad esempio l'API o l'account a cui il token concede l'accesso.
Se il valore di Audience
è vuoto o la variabile ref
non restituisce un valore valido e
useTargetUrl
è true
, l'URL della destinazione (esclusi i parametri
di query) viene utilizzato come pubblico. Per impostazione predefinita, useTargetUrl
è false
.
Valore predefinito | N/D |
Obbligatorio? | Obbligatorio |
Tipo | Stringa |
Elemento principale | |
Elementi secondari |
Nessuno |
L'elemento Audience
utilizza la seguente sintassi:
<Audience>TARGET_URL</Audience> or: <Audience ref='FLOW_VARIABLE_NAME'/>
<FormParams>
(figlio di <Set>
)
Sovrascrive i parametri del modulo esistenti in una richiesta e li sostituisce con i nuovi valori che specifichi con questo elemento. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
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
Il seguente esempio imposta un parametro del modulo chiamato myparam
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 sono soddisfatti i seguenti criteri:
- Verbo HTTP:
POST
- Tipo di messaggio: richiesta
Se imposti parametri del modulo vuoti nelle norme
(<Set><FormParams/></Set>
), le norme non aggiungono parametri
del modulo. Equivale a omettere <FormParams>
.
Quando utilizzi <Set>
con <FormParams>
, Apigee modifica Content-Type
del messaggio in
application/x-www-form-urlencoded
.
<Headers>
(figlio di <Set>
)
Sovrascrive le intestazioni HTTP esistenti nella richiesta o nella risposta, specificate dall'elemento
<AssignTo>
.
Valore predefinito | N/D |
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>
), il criterio non imposta alcuna intestazione. Questa operazione
avrà lo stesso effetto dell'omissione di <Headers>
.
<Path>
(figlio di <Set>
)
<Payload>
(figlio 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, ad esempio testo normale, JSON o XML.
Valore predefinito | stringa vuota |
Obbligatorio? | Facoltativo |
Tipo | Stringa |
Elemento principale |
<Set>
|
Elementi secondari | Nessuno |
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 di testo normale:
<AssignMessage name="AM-set-payload-1"> <Set> <Payload contentType="text/plain">42</Payload> </Set> </AssignMessage>
Esempio 2
L'esempio seguente imposta un payload JSON:
<AssignMessage name="AM-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 racchiudendo i nomi delle variabili tra parentesi graffe:
<AssignMessage name="AM-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 cloud 16.08.17, non era possibile utilizzare le parentesi graffe per indicare i riferimenti alle variabili all'interno dei payload JSON. In queste versioni, devi utilizzare gli attributi variablePrefix
e variableSuffix
per specificare i caratteri delimitatori e utilizzarli per racchiudere i nomi delle variabili, come segue:
<AssignMessage name="AM-set-payload-3b"> <Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set> </AssignMessage>
Questa sintassi precedente funziona ancora.
Esempio 4
I contenuti di <Payload>
vengono trattati come un modello di messaggio. Ciò significa che il criterio
AssignMessage sostituisce le variabili racchiuse tra parentesi graffe con il valore delle
variabili a cui viene fatto 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="AM-set-payload-4"> <Set> <Payload contentType="text/xml"> <root> <e1>sunday</e1> <e2>funday</e2> <e3>{var1}</e3> </root> </Payload> </Set> </AssignMessage>
La tabella seguente descrive gli attributi di <Payload>
:
Attributo | Descrizione | Presenza | Tipo |
---|---|---|---|
contentType |
Se specificato, il valore di |
Facoltativo | Stringa |
variablePrefix |
Specifica facoltativamente il delimitatore iniziale di una variabile di flusso. Il valore predefinito è "{". Per maggiori informazioni, vedi Riferimento alle variabili di flusso. | Facoltativo | Char |
variableSuffix |
Specifica facoltativamente il delimitatore finale di una variabile di flusso. Il valore predefinito è "}". Per ulteriori informazioni, consulta Riferimento alle variabili di flusso. | Facoltativo | Char |
<QueryParams>
(figlio di <Set>
)
Sovrascrive i parametri di query esistenti nella richiesta con nuovi valori. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
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
Il seguente esempio 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 <Set>
/<QueryParams>
solo se vengono soddisfatti i seguenti criteri:
- Verbi HTTP:
GET
,PUT
,POST
,PATCH
,DELETE
- Tipo di messaggio: richiesta
Se definisci parametri di query vuoti nella policy
(<Set><QueryParams/></Set>
), la policy non imposta alcun parametro di query. È come omettere <QueryParams>
.
<StatusCode>
(figlio di <Set>
)
Imposta il codice di stato nella 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 | Nessuno |
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 semplice codice di stato:
<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 a cui viene fatto riferimento, come mostrato nell'esempio seguente:
<AssignMessage name="set-statuscode-2"> <Set> <StatusCode>{calloutresponse.status.code}</StatusCode> </Set> <AssignTo>response</AssignTo> </AssignMessage>
Puoi utilizzare <Set>
/<StatusCode>
solo se vengono soddisfatti i seguenti criteri:
- Tipo di messaggio: risposta
<Verb>
(figlio di <Set>
)
Imposta il verbo HTTP nella richiesta. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa o VARIABLE |
Elemento principale |
<Set>
|
Elementi secondari | Nessuno |
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
a cui viene fatto 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 <Set>
/<Verb>
solo se vengono soddisfatti i seguenti criteri:
- Tipo di messaggio: richiesta
<Version>
(figlio di <Set>
)
Imposta la versione HTTP su una richiesta. Questo elemento non ha alcun effetto su una risposta.
Valore predefinito | N/D |
Obbligatorio? | Facoltativo |
Tipo | Stringa o VARIABLE |
Elemento principale |
<Set>
|
Elementi secondari | Nessuno |
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
L'esempio seguente imposta il numero di versione su 1.1
:
<AssignMessage name="AM-set-version-1"> <Set> <Version>1.1</Version> </Set> </AssignMessage>
Esempio 2
Il seguente esempio utilizza 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 a cui viene fatto riferimento.
Puoi utilizzare <Set>
/<Version>
solo se vengono soddisfatti i seguenti criteri:
- Tipo di messaggio: richiesta
Creare messaggi di richiesta personalizzati
Puoi utilizzare AssignMessage per creare un messaggio di richiesta personalizzato. Dopo aver creato una richiesta personalizzata, puoi utilizzarla nei seguenti modi:
- Accedere alle relative variabili in altre policy
- Trasferiscilo a un servizio esterno
Per creare un messaggio di richiesta personalizzato, utilizza l'elemento <AssignTo>
nel criterio AssignMessage. 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 averlo creato, Apigee continuerà il flusso con la richiesta originale. Per utilizzare la richiesta personalizzata, aggiungi al proxy una policy come la policy ServiceCallout e fai riferimento in modo esplicito al messaggio di richiesta appena creato nella configurazione di questa policy. In questo modo potrai trasmettere la richiesta personalizzata a un endpoint di servizio esterno.
I seguenti esempi creano messaggi di richiesta personalizzati:
Esempio 1
Il seguente esempio crea un oggetto richiesta personalizzato con AssignMessage:
<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>
In questo esempio:
- Crea un nuovo oggetto messaggio di richiesta denominato
MyCustomRequest
. - Su MyCustomRequest, queste norme:
- Copia il valore dell'intestazione HTTP
user-agent
dalla richiesta in entrata al nuovo messaggio. Poiché<Copy>
non specifica l'attributosource
, Apigee utilizzerà il messaggiorequest
come origine da cui copiare . - Imposta il parametro di query
address
nel messaggio personalizzato sul valore del parametro di queryaddy
della richiesta in entrata. - Imposta il verbo HTTP su
GET
.
- Copia il valore dell'intestazione HTTP
- Imposta
<IgnoreUnresolvedVariables>
sufalse
. Quando<IgnoreUnresolvedVariables>
èfalse
, se una delle variabili a cui viene fatto riferimento nella configurazione della policy non esiste, Apigee entra nello stato di errore nel flusso API.
Esempio 2
Ecco un altro esempio che mostra come creare un oggetto richiesta personalizzato con AssignMessage:
<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>
Questo esempio crea una nuova richiesta personalizzata denominata partner.request
. Imposta quindi
<Verb>
e <Payload>
nella nuova richiesta.
Puoi accedere alle varie proprietà di un messaggio personalizzato in un'altra norma AssignMessage che si verifica più avanti nel flusso. Il seguente esempio recupera 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 di errore e i messaggi di errore restituiti e le variabili di errore impostate da Apigee quando questo criterio attiva un errore. Queste informazioni sono importanti se stai sviluppando regole di errore per gestire gli errori. Per scoprire di più, consulta Informazioni importanti sugli errori relativi alle norme e Gestione degli errori.
Errori di runtime
Questi errori possono verificarsi durante l'esecuzione del criterio.
Codice guasto | Stato HTTP | Causa | Correggi |
---|---|---|---|
steps.assignmessage.SetVariableFailed |
500 |
Il criterio non è stato in grado di impostare una variabile. Consulta la stringa di errore per il nome della variabile non risolta. | |
steps.assignmessage.VariableOfNonMsgType |
500 |
Questo errore si verifica se l'attributo Le variabili di tipo di messaggio rappresentano intere richieste e risposte HTTP. Le variabili di flusso Apigee integrate |
build |
steps.assignmessage.UnresolvedVariable |
500 |
Questo errore si verifica se una variabile specificata nel criterio AssignMessage è:
|
build |
Errori di deployment
Questi errori possono verificarsi quando esegui il deployment di un proxy contenente questo criterio.
Nome dell'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.
|
build |
InvalidVariableName |
Se l'elemento secondario <Name> è vuoto o non specificato nell'elemento <AssignVariable> ,
il deployment del proxy dell'API non va a buon fine perché non esiste un nome di variabile valido a cui assegnare un valore. È necessario un nome di variabile valido.
|
build |
InvalidPayload |
Un payload specificato nel criterio non è valido. |
Variabili di errore
Queste variabili vengono impostate quando questo criterio attiva un errore in fase di esecuzione. Per ulteriori informazioni, consulta Informazioni importanti sugli errori relativi alle norme.
Variabili | Dove | Esempio |
---|---|---|
fault.name="FAULT_NAME" |
FAULT_NAME è il nome dell'errore, come indicato nella tabella Errori di runtime sopra. Il nome dell'errore è l'ultima parte del codice dell'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>
Schemi
Ogni tipo di policy è definito da uno schema XML (.xsd
). Per riferimento, gli schemi delle policy
sono disponibili su GitHub.
Argomenti correlati
Esempi funzionanti del criterio AssignMessage sono disponibili negli esempi della piattaforma API.
Per un esempio più avanzato di come eseguire l'override di target.url
da
ProxyEndpoint
, consulta questo articolo della community Apigee.
Per vedere un percorso impostato in azione in un criterio ServiceCallout, consulta questo esempio di Learn by doing negli esempi di GitHub di Apigee. Basta clonare il repository e
seguire le istruzioni riportate in questo argomento. L'esempio utilizza AssignMessage per impostare un percorso della richiesta,
quindi utilizza un criterio ServiceCallout
per effettuare la richiesta a un servizio esterno.