הדף הזה רלוונטי ל-Apigee ול-Apigee Hybrid.
לעיון במסמכי התיעוד של Apigee Edge
כותרות ה-HTTP הן זוגות של שם וערך שמאפשרים לאפליקציות הלקוח ולשירותי הקצה העורפי להעביר מידע נוסף על בקשות ותגובות בהתאמה. הנה כמה דוגמאות פשוטות:
- כותרת בקשת ההרשאה מעבירה את פרטי הכניסה של המשתמש לשרת:
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 מאפשר למפתחים לגשת לכותרות בקלות באמצעות משתני זרימה בכל אחת מהמדיניות או מהזרימות המותנות. הנה רשימת המשתנים שאפשר להשתמש בהם כדי לגשת לכותרת ספציפית של בקשה או תגובה ב-Apigee:
משתני Flow:
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 במדיניות של Apigee באופן שמחזיר רק את הערך הראשון היא שגויה, ויכולה לגרום לבעיות אם לכותרת ה-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.
השפעה
- בשתי הדוגמאות שלמעלה, שימו לב שמוחזר רק הערך הראשון מכותרות מרובות ערכים. אם נעשה שימוש בערכים האלה בהמשך על ידי מדיניות אחרת בתהליך של proxy ל-API או על ידי שירות לקצה העורפי כדי לבצע פונקציה או לוגיקה מסוימת, יכול להיות שזה יוביל לתוצאה בלתי צפויה.
- כשניגשים לערכים של כותרות בקשות ומעבירים אותם לשרת היעד, יכול להיות שהבקשות ל-API יעובדו בצד השרת בצורה שגויה, ולכן הן עשויות להניב תוצאות שגויות.
- אם אפליקציית הלקוח תלויה בערכי כותרת ספציפיים מהתגובה של Apigee, יכול להיות שהיא תעבד את התגובה בצורה שגויה ותציג תוצאות שגויות.
שיטה מומלצת
כדי לקרוא את כל הערכים של כותרת ספציפית, צריך להפנות למשתנה של זרימת העבודה
request.header.header_name.values.string.דוגמה: קטע לדוגמה שאפשר להשתמש בו ב-RaiseFault או ב-AssignMessage כדי לקרוא כותרת עם כמה ערכים
<Set> <Headers> <Header name="Inbound-Headers">{request.header.Accept.values.string}</Header> </Headers> </Set>אם רוצים גישה נפרדת לכל אחד מהערכים השונים, אפשר להשתמש במשתני הזרימה המובנים המתאימים:
request.header.header_name.values.count,request.header.header_name.N, response.header.header_name.values.count,response.header.header_name.N.לאחר מכן חוזרים על הפעולה כדי לאחזר את כל הערכים מכותרת ספציפית במדיניות JavaScript או JavaCallout.
דוגמה: קוד 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יופיע כשני ערכים עם הקוד שלמעלה. הערך הראשון הואapplication/xml;q=0.9, והערך השני יהיה*/*;q=0.8.אם צריך לפצל את ערכי הכותרת באמצעות נקודה-פסיק כמפריד, אפשר להשתמש ב-
string.split(";")בתוך קריאת ה-JavaScript כדי להפריד בין הערכים השונים.לחלופין, אפשר להשתמש בפונקציה
substring()שזמינה בתבנית הודעה במשתנה של זרימת העבודהrequest.header.header_name.valuesכדי לקרוא את כל הערכים של כותרת ספציפית.דוגמה: שימוש ב-
substring()בתבנית הודעה כדי לקרוא כותרת מלאה עם כמה ערכים<Set> <Headers> <Header name="Inbound-Headers">{substring(request.header.Accept.values,1,-1)}</Header> </Headers> </Set>
קריאה נוספת
- איך מטפלים בכותרות עם כמה ערכים ב-JavaScript?
- הערות של IETF RFC 7230 על שימוש ברשימות מופרדות בפסיקים בשדות של כותרות HTTP עם כמה ערכים
- משתני בקשה ותגובה
- הסבר על משתני Flow