אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
כותרות ה-HTTP הן זוגות של שם וערך שמאפשרים לאפליקציות הלקוח ולשירותי ה-Backend להעביר מידע נוסף על בקשות ותגובות, בהתאמה. דוגמאות פשוטות:
- כותרת בקשת ההרשאה מעבירה את פרטי הכניסה של המשתמש לשרת:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- הכותרת
Content-Typeמציינת את סוג התוכן של הבקשה או התגובה שנשלחת:Content-Type: application/json
בכותרות ה-HTTP יכולים להיות ערך אחד או יותר, בהתאם להגדרות של שדות הכותרת. בכותרת עם כמה ערכים, הערכים יופרדו בפסיקים. הנה כמה דוגמאות לכותרות שמכילות כמה ערכים:
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 מאפשר למפתחים לגשת בקלות לכותרות באמצעות משתני זרימה בכל אחת ממדיניות Edge או מזרימות מותנות. זו רשימת המשתנים שאפשר להשתמש בהם כדי לגשת לכותרת ספציפית של בקשה או כותרת תגובה ב-Edge:
משתני זרימה:
message.header.header-namerequest.header.header-nameresponse.header.header-namemessage.header.header-name.Nrequest.header.header-name.Nresponse.header.header-name.N
אובייקטים ב-JavaScript:
context.proxyRequest.headers.header-namecontext.targetRequest.headers.header-namecontext.proxyResponse.headers.header-namecontext.targetResponse.headers.header-name
זוהי דוגמה למדיניות AssignMessage שמראה איך לקרוא את הערך של כותרת בקשה ולאחסן אותו במשתנה:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
תבנית אנטי
גישה לערכים של כותרות HTTP במדיניות של Edge באופן שמחזיר רק את הערך הראשון היא שגויה, ויכולה לגרום לבעיות אם לכותרות ה-HTTP הספציפיות יש יותר מערך אחד.
בקטעים הבאים יש דוגמאות לגישה לכותרות.
דוגמה 1: קריאה של כותרת Accept עם כמה ערכים באמצעות קוד JavaScript
נניח שלכותרת Accept יש כמה ערכים כמו שמוצג בהמשך:
Accept: text/html, application/xhtml+xml, application/xml
זהו קוד ה-JavaScript שקורא את הערך מהכותרת Accept:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
קוד ה-JavaScript שלמעלה מחזיר רק את הערך הראשון מהכותרת Accept, כמו text/html.
דוגמה 2: קריאת כותרת Access-Control-Allow-Headers עם כמה ערכים במדיניות AssignMessage או RaiseFault
נניח שלכותרת Access-Control-Allow-Headers יש כמה ערכים כמו שמוצג בהמשך:
Access-Control-Allow-Headers: content-type, authorization
זהו קטע הקוד מההגדרה של מדיניות AssignMessage או RaiseFault שקובע את הכותרת Access-Control-Allow-Headers:
<Set>
<Headers>
<Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header>
</Headers>
</Set>הקוד שלמעלה מגדיר את הכותרת Access-Control-Allow-Headers עם הערך הראשון בלבד מכותרת הבקשה Access-Control-Allow-Headers, ובדוגמה הזו content-type.
השפעה
- בשתי הדוגמאות שלמעלה, שימו לב שמוחזר רק הערך הראשון מכותרות עם כמה ערכים. אם ערכים כאלה ישמשו בהמשך מדיניות אחרת בתהליך של API Proxy או בשירות הקצה העורפי כדי לבצע פונקציה או לוגיקה מסוימת, יכול להיות שהתוצאה תהיה לא צפויה.
- כשניגשים לערכים של כותרות בקשות ומעבירים אותם לשרת היעד, יכול להיות שהבקשות ל-API יעובדו בצד השרת בצורה שגויה, ולכן הן עשויות להניב תוצאות שגויות.
- אם אפליקציית הלקוח תלויה בערכי כותרת ספציפיים מהתגובה של Edge, יכול להיות שהיא תעבד את התגובה בצורה שגויה ותציג תוצאות שגויות.
שיטה מומלצת
משתמשים במשתני הזרימה המובנים המתאימים:
request.header.header_name.values.count,request.header.header_name.N, response.header.header_name.values.count,response.header.header_name.N.לאחר מכן חוזרים על הפעולה כדי לאחזר את כל הערכים מכותרת ספציפית במדיניות של קריאות ל-JavaScript או ל-Java.
דוגמה: קוד JavaScript לדוגמה לקריאת כותרת עם כמה ערכים
for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
לדוגמה,
application/xml;q=0.9, */*;q=0.8יופיע כערך אחד עם הקוד שלמעלה.אם צריך לפצל את ערכי הכותרת באמצעות נקודה-פסיק כמפריד, צריך להשתמש ב-
string.split(";")כדי להפריד אותם לערכים.אפשר להשתמש בפונקציה
substring()במשתנה של זרימת הנתוניםrequest.header.header_name.valuesבמדיניות RaiseFault או AssignMessage כדי לקרוא את כל הערכים של כותרת ספציפית.דוגמה: מדיניות לדוגמה של RaiseFault או AssignMessage לקריאת כותרת עם כמה ערכים
<Set> <Headers> <Header name="Access-Control-Allow-Headers">{substring(request.header.Access-Control-Request-Headers.values,1,-1)}</Header> </Headers> </Set>