Wyświetlasz dokumentację Apigee Edge.
Przejdź do
dokumentacji Apigee X. info
Nagłówki HTTP to pary nazwa-wartość, które umożliwiają aplikacjom klienckim i usługom backendowym przekazywanie dodatkowych informacji o żądaniach i odpowiedziach. Oto kilka prostych przykładów:
- Nagłówek żądania autoryzacji przekazuje dane logowania użytkownika do serwera:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- Nagłówek
Content-Typewskazuje typ wysyłanej treści żądania/odpowiedzi:Content-Type: application/json
Nagłówki HTTP mogą mieć jedną lub więcej wartości w zależności od definicji pola nagłówka. Nagłówek z wieloma wartościami będzie 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-revalidateAccept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8X-Forwarded-For: 10.125.5.30, 10.125.9.125
Apigee Edge umożliwia deweloperom łatwy dostęp do nagłówków za pomocą zmiennych przepływu w dowolnej z zasad Edge lub przepływów warunkowych. Oto lista zmiennych, których można użyć do uzyskania dostępu do określonego nagłówka żądania lub nagłówka odpowiedzi w Edge:
Zmienne przepływu:
message.header.header-namerequest.header.header-nameresponse.header.header-namemessage.header.header-name.Nrequest.header.header-name.Nresponse.header.header-name.N
Obiekty JavaScript:
context.proxyRequest.headers.header-namecontext.targetRequest.headers.header-namecontext.proxyResponse.headers.header-namecontext.targetResponse.headers.header-name
Oto przykładowa zasada AssignMessage pokazująca, jak odczytać wartość nagłówka żądania i zapisać ją w zmiennej:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Antywzorzec
Uzyskiwanie dostępu do wartości nagłówków HTTP w zasadach Edge w sposób, który zwraca tylko pierwszą wartość jest nieprawidłowe i może powodować problemy, jeśli określone nagłówki HTTP mają więcej niż 1 wartość.
W sekcjach poniżej znajdziesz przykłady dostępu do nagłówka.
Przykład 1. Odczytywanie nagłówka Accept z wieloma wartościami za pomocą kodu JavaScript
Załóżmy, ż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,
np. text/html.
Przykład 2. Odczytywanie nagłówka Access-Control-Allow-Headers z wieloma wartościami w zasadzie AssignMessage lub RaiseFault
Załóżmy, ż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 zasady AssignMessage lub RaiseFault ustawiający nagłówek Access-Control-Allow-Headers:
<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
nagłówka żądania Access-Control-Allow-Headers, w tym przykładzie content-type.
Wpływ
- W obu powyższych przykładach zwracana jest tylko pierwsza wartość z nagłówków z wieloma wartościami. Jeśli te wartości są następnie używane przez inną zasadę w przepływie proxy interfejsu API lub przez usługę backendową do wykonania jakiejś funkcji lub logiki, może to prowadzić do nieoczekiwanego wyniku.
- Gdy wartości nagłówka żądania są dostępne i przekazywane do serwera docelowego, żądania do interfejsu API mogą być przetwarzane przez backend nieprawidłowo, a tym samym mogą dawać nieprawidłowe wyniki.
- Jeśli aplikacja kliencka jest zależna od określonych wartości nagłówka z odpowiedzi Edge, to może też przetwarzać dane nieprawidłowo i dawać nieprawidłowe wyniki.
Sprawdzona metoda
Użyj odpowiednich wbudowanych zmiennych przepływu:
request.header.header_name.values.count,request.header.header_name.N,response.header.header_name.values.count,response.header.header_name.N.Następnie wykonaj iterację, aby pobrać wszystkie wartości z określonego nagłówka w zasadach wywołania JavaScript lub Java.
Przykład: przykładowy kod JavaScript do odczytywania 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.8będzie wyświetlana jako jedna wartość w powyższym kodzie.Jeśli wartości nagłówka mają być dzielone za pomocą średnika jako separatora, użyj
string.split(";"), aby rozdzielić je na wartości.Użyj funkcji
substring()w zmiennej przepływurequest.header.header_name.valuesw zasadzie RaiseFault lub AssignMessage, aby odczytać wszystkie wartości określonego nagłówka.Przykład: przykładowa zasada RaiseFault lub AssignMessage do odczytywania 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>