Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Nagłówki HTTP to pary nazwy i wartości, które umożliwiają aplikacjom klienckim i usługom backendu do przekazywania dodatkowych informacji o żądaniach i odpowiedziach. Oto kilka prostych przykładów:
- Nagłówek żądania autoryzacji przekazuje dane logowania użytkownika na serwer:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- Nagłówek
Content-Type
wskazuje typ wysyłanych treści żądania/odpowiedzi:Content-Type: application/json
Nagłówki HTTP mogą mieć jedną lub więcej wartości w zależności od parametru definicje pól nagłówka. Nagłówek z wieloma wartościami zawiera wartości rozdzielone przecinkami. Oto kilka przykładów nagłówków zawierających wiele wartości:
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 umożliwia programistom dostęp do nagłówków za pomocą zmienne przepływu w dowolnej z zasad Edge lub przepływów warunkowych. Oto lista zmiennych, których możesz użyć aby uzyskać dostęp do określonego nagłówka żądania lub odpowiedzi w Edge:
Zmienne przepływu:
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
Obiekty JavaScript:
context.proxyRequest.headers.header-name
context.targetRequest.headers.header-name
context.proxyResponse.headers.header-name
context.targetResponse.headers.header-name
Oto przykładowa zasada AssignMessage, która pokazuje, jak odczytywać wartość nagłówka żądania i zapisywać ją w zmiennej:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Antywzór
Uzyskiwanie dostępu do wartości nagłówków HTTP w zasadach Edge w sposób zwracający tylko pierwszą wartość jest nieprawidłowy i może powodować problemy, jeśli określone nagłówki HTTP mają więcej niż jedną wartość.
Poniższe sekcje zawierają przykłady dostępu do nagłówka.
Przykład 1: odczytywanie wielowartościowego nagłówka Accept za pomocą kodu JavaScript
Weź pod uwagę, że nagłówek Accept
ma wiele wartości, jak pokazano poniżej:
Accept: text/html, application/xhtml+xml, application/xml
Oto kod JavaScript, który odczytuje wartość z nagłówka Accept
:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
Powyższy kod JavaScript zwraca tylko pierwszą wartość z nagłówka Accept
,
na przykład text/html
.
Przykład 2. Odczytywanie wielowartościowego nagłówka Access-Control-Allow-Headers w zasadzie AssignMessage lub RaiseFault
Weź pod uwagę, że nagłówek Access-Control-Allow-Headers
ma wiele wartości, jak pokazano poniżej:
Access-Control-Allow-Headers: content-type, authorization
Oto fragment kodu z nagłówka Access-Control-Allow-Headers
, który określa zasadę AssignMessage lub RaiseFault:
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header> </Headers> </Set>
Powyższy kod ustawia nagłówek Access-Control-Allow-Headers
tylko z pierwszą wartością z parametru
nagłówek żądania Access-Control-Allow-Headers
, w tym przykładzie: content-type
.
Wpływ
- W obu powyższych przykładach można zauważyć, że zwracana jest tylko pierwsza wartość z nagłówków wielowartościowych. Jeśli te wartości są później używane przez inną zasadę w procesie interfejsu API serwera proxy lub przez usługę backendu do realizacji funkcji lub logiki, może to prowadzić do nieoczekiwanych rezultatów.
- Po uzyskaniu dostępu do wartości nagłówków żądania i przekazaniu ich do serwera docelowego żądania do interfejsu API mogą być nieprawidłowo przetwarzane przez backend i dlatego mogą podawać nieprawidłowe wyniki.
- Jeśli aplikacja kliencka zależy od określonych wartości nagłówka w odpowiedzi Edge, może również zostać nieprawidłowo przetworzony i wyświetlić nieprawidłowe wyniki.
Sprawdzona metoda
Użyj odpowiednich wbudowanych zmiennych procesu:
request.header.header_name.values.count
,request.header.header_name.N
,response.header.header_name.values.count
response.header.header_name.N
Następnie powtarzaj czynności, aby pobrać wszystkie wartości z określonego nagłówka w zasadach dotyczących wywołań JavaScriptu lub Javy.
Przykład: przykładowy kod JavaScript do odczytu nagłówka z wieloma wartościami
for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
Na przykład
application/xml;q=0.9, */*;q=0.8
pojawi się jako jedna wartość z powyższym kodem.Jeśli musisz podzielić wartości nagłówków średnikami jako separatorami, użyj
string.split(";")
aby podzielić je na wartości.Użyj funkcji
substring()
na zmiennej przepływurequest.header.header_name.values
w zasadzie RaiseFault lub AssignMessage w celu odczytania wszystkich wartości określonego nagłówka.Przykład: przykładowa zasada RaiseFault lub AssignMessage do odczytu nagłówka z wieloma wartościami
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>