Stai visualizzando la documentazione di Apigee Edge.
Vai alla sezione
Documentazione di Apigee X. Informazioni
Le intestazioni HTTP sono le coppie nome-valore che consentono alle applicazioni client e ai servizi di backend per trasmettere ulteriori informazioni rispettivamente 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 di richiesta/risposta inviati:Content-Type: application/json
Le intestazioni HTTP possono avere uno o più valori a seconda del definizioni del campo di intestazione. Un'intestazione a più valori avrà valori separati da virgole. Ecco alcuni esempi di intestazioni che contengono 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 Edge consente agli sviluppatori di accedere facilmente alle intestazioni utilizzando variabili di flusso in qualsiasi criterio o flusso condizionale Edge. Ecco un elenco di variabili che possono essere utilizzate per accedere a un'intestazione specifica di richiesta o risposta in Edge:
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
Ecco un esempio di criterioAssignMessage che mostra come leggere il valore dell'intestazione di una richiesta e archiviarlo 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
Accesso ai valori delle intestazioni HTTP nei criteri Edge in modo da restituire solo il primo valore non è corretta e può causare problemi se le intestazioni HTTP specifiche contengono più di un valore.
Le seguenti sezioni contengono esempi di accesso all'intestazione.
Esempio 1: leggere un'intestazione Accept a più valori utilizzando il codice JavaScript
Tieni presente che l'intestazione Accept
ha 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 dall'intestazione Accept
,
ad esempio text/html
.
Esempio 2: leggere un'intestazione Access-Control-Allow-Headers a più valori nel criterio AssegnaMessage o RaiseFault
Tieni presente che l'intestazione Access-Control-Allow-Headers
ha più valori, come mostrato di seguito:
Access-Control-Allow-Headers: content-type, authorization
Ecco la parte di codice dell'impostazione del criterioAssignMessage o RaiseFault per 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 del
intestazione della richiesta Access-Control-Allow-Headers
, in questo esempio content-type
.
Impatto
- In entrambi gli esempi precedenti, nota che viene restituito solo il primo valore delle intestazioni a più valori. Se questi valori vengono successivamente utilizzati da un altro criterio nel flusso del proxy API o dal servizio di backend eseguire alcune funzioni o logiche, ciò potrebbe portare a un risultato o risultato inaspettato.
- Quando si accede ai valori dell'intestazione delle richieste e vengono passati al server di destinazione, le richieste API possono essere elaborati dal backend in modo errato, potrebbero restituire risultati errati.
- Se l'applicazione client dipende da valori di intestazione specifici della risposta Edge, potrebbe anche elaborare in modo errato e restituire risultati errati.
Best practice
Utilizza le variabili di flusso integrate appropriate:
request.header.header_name.values.count
,request.header.header_name.N
,response.header.header_name.values.count
response.header.header_name.N
.Poi esegui l'iterazione per recuperare tutti i valori da un'intestazione specifica nei criteri di 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 un unico valore con il codice riportato sopra.Se i valori dell'intestazione devono essere suddivisi utilizzando il punto e virgola come delimitatore, usa
string.split(";")
per suddividerli in valori.Utilizza la funzione
substring()
sulla variabile di flussorequest.header.header_name.values
nel criterio RaiseFault oAssignMessage per leggere tutti i valori di un'intestazione specifica.Esempio: esempio di criterio RaiseFault oAssignMessage per leggere un'intestazione con più valori
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>