Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di
Apigee Edge.
Le intestazioni HTTP sono le coppie nome-valore che consentono alle applicazioni client e ai servizi di backend di trasmettere rispettivamente informazioni aggiuntive sulle richieste e sulle risposte. Ecco alcuni semplici esempi:
- L'intestazione della richiesta di autorizzazione passa le credenziali utente al server:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- L'intestazione
Content-Type
indica il tipo di contenuti della richiesta/risposta inviati:Content-Type: application/json
Le intestazioni HTTP possono avere uno o più valori a seconda delle definizioni dei campi delle intestazioni. Un'intestazione con più valori avrà valori separati da virgole. Ecco alcuni esempi di intestazioni contenenti più valori:
Cache-Control: no-cache, no-store, must-revalidate
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
X-Forwarded-For: 10.125.5.30, 10.125.9.125
Apigee consente agli sviluppatori di accedere facilmente alle intestazioni utilizzando variabili di flusso in uno dei criteri o dei flussi condizionali. Di seguito è riportato l'elenco delle variabili che possono essere utilizzate per accedere a un'intestazione di richiesta o risposta specifica in Apigee:
Variabili di flusso:
message.header.header-name
request.header.header-name
response.header.header-name
message.header.header-name.N
request.header.header-name.N
response.header.header-name.N
Oggetti JavaScript:
context.proxyRequest.headers.header-name
context.targetRequest.headers.header-name
context.proxyResponse.headers.header-name
context.targetResponse.headers.header-name
Di seguito è riportato un esempio di criterio AssignMessage che mostra come leggere il valore di un'intestazione della richiesta e memorizzarlo in una variabile:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Antipattern
Accedere ai valori delle intestazioni HTTP nei criteri Apigee in modo da restituire solo il primo valore non è corretto e può causare problemi se l'intestazione HTTP specifica ha più di un valore.
Le seguenti sezioni contengono esempi di accesso all'intestazione.
Esempio 1: leggi un'intestazione Accept con più valori utilizzando il codice JavaScript
Supponiamo che l'intestazione Accept
abbia più valori, come mostrato di seguito:
Accept: text/html, application/xhtml+xml, application/xml
Ecco il codice JavaScript che legge il valore dall'intestazione Accept
:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
Il codice JavaScript riportato sopra restituisce solo il primo valore dell'intestazione Accept
, come text/html
.
Esempio 2: leggi un'intestazione Access-Control-Allow-Headers con più valori nel criterio AssignMessage o RaiseFault
Supponiamo che l'intestazione Access-Control-Allow-Headers
abbia più valori, come mostrato di seguito:
Access-Control-Allow-Headers: content-type, authorization
Di seguito è riportata la parte di codice del criterio AssignMessage o RaiseFault che imposta l'intestazione Access-Control-Allow-Headers
:
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header> </Headers> </Set>
Il codice riportato sopra imposta l'intestazione Access-Control-Allow-Headers
con solo il primo valore dell'intestazione della richiesta Access-Control-Allow-Headers
, in questo esempio content-type
.
Impatto
- In entrambi gli esempi precedenti, tieni presente che viene restituito solo il primo valore degli intestazioni con più valori. Se questi valori vengono successivamente utilizzati da un altro criterio nel flusso dell'API Proxy o dal servizio di backend per eseguire alcune funzioni o logiche, potrebbe verificarsi un risultato o un esito imprevisto.
- Quando i valori dell'intestazione della richiesta vengono acceduti e trasmessi al server di destinazione, le richieste API potrebbero essere elaborate in modo errato dal backend e quindi fornire risultati errati.
- Se l'applicazione client dipende da valori di intestazione specifici della risposta di Apigee, potrebbe anche essere elaborata in modo errato e fornire risultati errati.
Best practice
Fai riferimento alla forma
request.header.header_name.values.string
della variabile di flusso per leggere tutti i valori di un'intestazione specifica.Esempio: frammento di esempio che potrebbe essere utilizzato in RaiseFault o AssignMessage per leggere un'intestazione con più valori
<Set> <Headers> <Header name="Inbound-Headers">{request.header.Accept.values.string}</Header> </Headers> </Set>
Se vuoi accedere singolarmente a ciascuno dei valori distinti, puoi utilizzare le variabili di flusso predefinite appropriate:
request.header.header_name.values.count
,request.header.header_name.N
,response.header.header_name.values.count
,response.header.header_name.N
.Quindi, esegui l'iterazione per recuperare tutti i valori da un'intestazione specifica nei criteri dei callout JavaScript o Java.
Esempio: codice JavaScript di esempio per leggere un'intestazione con più valori
for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
Ad esempio,
application/xml;q=0.9, */*;q=0.8
verrà visualizzato come due valori con il codice riportato sopra. Il primo valore èapplication/xml;q=0.9
e il secondo sarà*/*;q=0.8
.Se i valori dell'intestazione devono essere suddivisi utilizzando il punto e virgola come delimitatore, puoi utilizzare
string.split(";")
all'interno del callout JavaScript per separare i valori distinti.In alternativa, puoi utilizzare la funzione
substring()
disponibile all'interno di un modello di messaggio sulla variabile di flussorequest.header.header_name.values
per leggere tutti i valori di un'intestazione specifica.Esempio: utilizza
substring()
all'interno di un modello di messaggio per leggere un'intestazione completa con più valori<Set> <Headers> <Header name="Inbound-Headers">{substring(request.header.Accept.values,1,-1)}</Header> </Headers> </Set>
Per approfondire
- Come gestire le intestazioni con più valori in JavaScript?
- Commento del documento IETF RFC 7230 sull'utilizzo di elenchi separati da virgole per i campi di intestazione HTTP con più valori
- Variabili di richiesta e risposta
- Riferimento alle variabili di flusso