אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
בנושא הזה מוסבר איך להשתמש בתבניות של הודעות בשרתי proxy ל-API, ומוצגות הפניות לפונקציות.
מהי תבנית הודעה?
תבנית הודעה מאפשרת לבצע החלפה של מחרוזות משתנות ברכיבים מסוימים של מדיניות ושל TargetEndpoint. התכונה הזו, שזמינה במקומות שבהם היא נתמכת, מאפשרת לכם לאכלס מחרוזות באופן דינמי כשמתבצעת הפעלה של שרת proxy.
אתם יכולים לכלול בתבנית הודעה כל שילוב של הפניות למשתני זרימה וטקסט מילולי. שמות של משתני זרימה צריכים להיות מוקפים בסוגריים מסולסלים, וכל טקסט שלא מוקף בסוגריים מסולסלים מוצג כטקסט מילולי.
מידע נוסף זמין במאמר בנושא איפה אפשר להשתמש בתבניות של הודעות?
דוגמה
לדוגמה, המדיניות Assign Message מאפשרת להשתמש בתבנית הודעה בתוך הרכיב <Payload>:
<AssignMessage name="set-dynamic-content"> <AssignTo createNew="false" type="response"></AssignTo> <Set> <Payload contentType="application/json"> {"name":"Alert", "message":"You entered an invalid username: {user.name}"} </Payload> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
בדוגמה שלמעלה, הערך של משתנה התהליך user.name (בסוגריים מסולסלים) יוערך ויוחלף במחרוזת המטען הייעודי בזמן הריצה. לדוגמה, אם user.name=jdoe,
אז פלט ההודעה שיתקבל במטען הייעודי (payload) יהיה: You entered an invalid username: jdoe.
אם אי אפשר לפתור את המשתנה, הפלט הוא מחרוזת ריקה.
דוגמה
כשחורגים ממכסת השימוש, מומלץ להחזיר הודעה משמעותית למתקשר. התבנית הזו משמשת בדרך כלל עם כלל שגיאה כדי לספק פלט שנותן למתקשר מידע על חריגה מהמכסה. במדיניות הבאה של הקצאת הודעות, נעשה שימוש בתבניות של הודעות כדי לאכלס באופן דינמי מידע על מכסות בכמה רכיבי XML:
<AssignMessage name='AM-QuotaViolationMessage'> <Description>message for quota exceeded</Description> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <Set> <Headers> <Header name='X-Quota-Reset'>{ratelimit.Quota-1.expiry.time}</Header> <Header name='X-Quota-Allowed'>{ratelimit.Quota-1.allowed.count}</Header> <Header name='X-Quota-Available'>{ratelimit.Quota-1.available.count}</Header> </Headers> <Payload contentType='application/json'>{ "error" : { "message" : "you have exceeded your quota", "clientId" : "{request.queryparam.apikey}" } } </Payload> <StatusCode>429</StatusCode> <ReasonPhrase>Quota Exceeded</ReasonPhrase> </Set> </AssignMessage>
במדיניות AssignMessage, הרכיבים הבאים ברכיב <Set>
תומכים בתבניות של הודעות:
- כותרת
- QueryParam
- FormParam
- PayLoad
- גרסה
- פועל
- נתיב
- StatusCode
- ReasonPhrase
שוב, חשוב לזכור שמשתני זרימה בתבנית הודעה חייבים להיות בתוך סוגריים מסולסלים.
כשהמדיניות הזו מופעלת:
- רכיבי הכותרת מקבלים ערכים של משתני התהליך שצוינו.
- המטען הייעודי (Payload) כולל שילוב של טקסט מילולי ומשתנים (הערך של
client_idמאוכלס באופן דינמי). - השדות StatusCode ו-ReasonPhrase כוללים רק טקסט מילולי, אבל הם תומכים גם בתבניות של הודעות אם רוצים להשתמש בהן.
דוגמה
בהגדרת TargetEndpoint של שרת proxy, רכיבי צאצא של <SSLInfo> תומכים בתבניות של הודעות. בדומה לתבנית שמשמשת במדיניות, משתני הזרימה בסוגריים מסולסלים מוחלפים כשה-proxy מופעל.
<TargetEndpoint name="default"> … <HTTPTargetConnection> <SSLInfo> <Enabled>{myvars.ssl.enabled}</Enabled> <ClientAuthEnabled>{myvars.ssl.client.auth.enabled}</ClientAuthEnabled> <KeyStore>{myvars.ssl.keystore}</KeyStore> <KeyAlias>{myvars.ssl.keyAlias}</KeyAlias> <TrustStore>{myvars.ssl.trustStore}</TrustStore> </SSLInfo> </HTTPTargetConnection> … </TargetEndpoint>
איפה אפשר להשתמש בתבניות של הודעות?
תבניות של הודעות נתמכות בכמה כללי מדיניות וגם באלמנטים מסוימים שמשמשים בהגדרות של TargetEndpoint.
כללי מדיניות שמקבלים תבניות של הודעות
| מדיניות | רכיבים ורכיבי צאצא שתומכים בתבניות של הודעות |
|---|---|
| מדיניות AccessControl | <SourceAddress>, למאפיין mask ולכתובת ה-IP. |
| מדיניות AssignMessage | רכיבי צאצא של <Set>: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams
רכיב צאצא |
| המדיניות בנושא ExtensionCallout |
<Input> |
| מדיניות ExtractVariables | <JsonPath>
|
| GenerateJWS policy VerifyJWS policy |
<Payload> (GenerateJWS policy בלבד)
* הרכיבים האלה תומכים בתבנית הודעה רק כשמגדירים type=map. |
| GenerateJWT policy VerifyJWT policy |
<AdditionalClaims><Claim>
* הרכיבים האלה תומכים בתבנית הודעה רק כשמגדירים type=map. |
| מדיניות LDAP | <SearchQuery> |
| מדיניות MessageLogging | <Syslog><Message>
|
| OASValidation policy | רכיב
|
| מדיניות RaiseFault | רכיבי <Set>: מטען ייעודי (Payload), סוג תוכן (ContentType), פועל (Verb), גרסה (Version), נתיב (Path), קוד סטטוס (StatusCode), ביטוי סיבה (ReasonPhrase), כותרות (Headers), פרמטרים של שאילתה (QueryParams), פרמטרים של טופס (FormParams)
רכיבי |
| SAMLAssertion policy | <Template>
* רק אם חתימת המדיניות היא |
| מדיניות ServiceCallout | <Set> elements: Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, /Headers, QueryParams, FormParams
רכיבי |
רכיבי TargetEndpoint שמקבלים תבניות הודעות
| רכיבי HTTPTargetConnection | רכיבי צאצא שתומכים בתבניות של הודעות |
|---|---|
| SSLInfo | מופעל, KeyAlias, KeyStore, TrustStore, ClientAuthEnabled, CLRStore |
| LocalTargetConnection | ApiProxy, ProxyEndpoint |
| נתיב | כשמשתמשים ברכיב LoadBalancer, רכיב Path פעיל ומקבל תבנית הודעה. |
תחביר של תבנית הודעה
בקטע הזה מוסבר מהם הכללים שצריך לפעול לפיהם כדי להשתמש בתבניות של הודעות.
משתמשים בסוגריים מסולסלים כדי לציין משתנים
שמות המשתנים צריכים להיות מוקפים בסוגריים מסולסלים { }. אם המשתנה לא קיים, מחזירים מחרוזת ריקה בפלט. עם זאת, אפשר לציין ערכי ברירת מחדל בתבניות של הודעות (ערכים שמוחלפים אם המשתנה לא נפתר). מידע נוסף זמין במאמר בנושא הגדרת ערכי ברירת מחדל בתבניות הודעות.
הערה: אפשר להוסיף מרכאות סביב כל מחרוזת התבנית של ההודעה, אבל זה לא חובה. לדוגמה, שתי תבניות ההודעות הבאות שקולות:
<Set>
<Headers>
<Header name="x-h1">"Hello {user.name}"</Header>
<Header name="x-h1">Hello {user.name}</Header>
</Headers>
</Set>הגדרת ערכי ברירת מחדל בתבניות של הודעות
אם לא ניתן לפתור משתנה של תבנית, Edge מחליף אותו במחרוזת ריקה. עם זאת, אפשר לציין ערך ברירת מחדל באופן הבא:
<Header name="x-h1">Test message. id = {request.header.id:Unknown}</Header>בדוגמה שלמעלה, אם אי אפשר לפתור את המשתנה request.header.id, הערך שלו מוחלף ב-Unknown. לדוגמה:
Test message. id = Unknown
אסור להשתמש ברווחים בביטויי פונקציות
אסור להשתמש ברווחים בשום מקום בביטויי פונקציות של תבניות הודעות. לדוגמה:
מותר:
{substring(alpha,0,4)}
{createUuid()}
{randomLong(10)}אסור:
{substring( alpha, 0, 4 )}
{ createUuid( ) }
{randomLong( 10 )}תחביר מדור קודם למטענים ייעודיים (payloads) של JSON
בגרסאות של Edge לפני Cloud release 16.08.17, אי אפשר להשתמש בסוגריים מסולסלים כדי לציין הפניות למשתנים במטענים ייעודיים (payloads) בפורמט JSON. בגרסאות הישנות יותר, היה צריך להשתמש במאפיינים variablePrefix ו-variableSuffix כדי לציין תווים להפרדה, ולהשתמש בהם כדי להקיף שמות של משתנים, כך:
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set>
למרות שב-Apigee מומלץ להשתמש בתחביר החדש יותר עם הסוגריים המסולסלים, התחביר הישן עדיין פועל.
שימוש בפונקציות של תבניות הודעות
Edge מספקת קבוצה של פונקציות שאפשר להשתמש בהן בתבניות של הודעות כדי לבצע בריחה, קידוד, גיבוב ועיצוב של משתני מחרוזת.
תיאור מפורט של הפונקציות של תבניות ההודעות מופיע במאמר הפניה לפונקציות של תבניות הודעות.
דוגמה: toLowerCase()
משתמשים בפונקציה המובנית toLowerCase() כדי להמיר משתנה מחרוזת לאותיות קטנות:
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Test header: {toLowerCase(foo.bar:FOO)}</Header> </Headers> </Set> </AssignMessage>
אם משתנה הזרימה foo.bar נפתר, התווים שלו יהיו באותיות קטנות.
אם foo.bar לא נפתר, ערך ברירת המחדל FOO מוחלף ומומר לאותיות קטנות. לדוגמה:
Test header: foo
דוגמה: escapeJSON()
הנה תרחיש שימוש מעניין: נניח שאפליקציית ה-Backend מחזירה תגובת JSON שמכילה תווי בריחה תקינים. לדוגמה:
{
"code": "INVALID",
"user_message": "Invalid value for \"logonId\" check your input."
}נניח שאתם רוצים להחזיר את ההודעה הזו ללקוח שמתקשר במטען ייעודי (payload) מותאם אישית. הדרך הרגילה לעשות זאת היא לחלץ את ההודעה ממטען הייעודי (payload) של תגובת היעד ולהשתמש בפעולה Assign Message כדי להוסיף אותה לתגובת proxy מותאמת אישית (כלומר, לשלוח אותה בחזרה ללקוח).
זו מדיניות Extract Variables ששולפת את המידע user_message למשתנה שנקרא standard.systemMessage:
<ExtractVariables name="EV-BackendErrorResponse"> <DisplayName>EV-BackendErrorResponse</DisplayName> <JSONPayload> <Variable name="standard.systemMessage"> <JSONPath>$.user_message</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
עכשיו, הנה מדיניות Assign Message תקינה לחלוטין שמוסיפה את המשתנה שחולץ למטען הייעודי (payload) של התגובה (תגובת ה-proxy):
<AssignMessage name="AM-SetStandardFaultResponse"> <DisplayName>AM-SetStandardFaultResponse</DisplayName> <Set> <Payload contentType="application/json"> { "systemMessage": "{standard.systemMessage}" } </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
לצערי, יש בעיה. המדיניות Extract Variables (חילוץ משתנים) הסירה את תווי המירכאות עם התו הבורח סביב חלק מההודעה. המשמעות היא שהתגובה שמוחזרת ללקוח היא JSON לא תקין. ברור שלא לזה התכוונת!
{
"systemMessage": "Invalid value for "logonId" check your input."
}
כדי לעקוף את הבעיה הזו, אפשר לשנות את מדיניות Assign Message כך שתשתמש בפונקציית תבנית הודעה שמבצעת escape לגרשיים ב-JSON. הפונקציה הזו, escapeJSON(), מוסיפה תו בריחה לכל המירכאות או התווים המיוחדים האחרים שמופיעים בביטוי JSON:
<AssignMessage name="AM-SetStandardFaultResponse"> <DisplayName>AM-SetStandardFaultResponse</DisplayName> <Set> <Payload contentType="application/json"> { "systemMessage": "{escapeJSON(standard.systemMessage)}" } </Payload> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
הפונקציה מוסיפה תו בריחה למירכאות המוטמעות, וכך נוצר JSON תקין, בדיוק כמו שרציתם:
{
"systemMessage": "Invalid value for \"logonId\" check your input.",
}תבנית הודעה היא תכונה של החלפת מחרוזות דינמית שאפשר להשתמש בה במדיניות מסוימת ובהגדרות של TargetEndpoint. פונקציות של תבניות הודעות מאפשרות לבצע פעולות שימושיות כמו גיבוב, מניפולציה של מחרוזות, ביטול בריחה של תווים ועוד, בתוך תבנית הודעה.
לדוגמה, במדיניות AssignMessage הבאה, נעשה שימוש בפונקציה toLowerCase() בתבנית הודעה:
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Test header: {Hello, toLowerCase(user.name)}</Header> </Headers> </Set> </AssignMessage>
במאמר הזה מפורטות פונקציות של תבניות הודעות, הארגומנטים והפלט שלהן. המאמר הזה מבוסס על ההנחה שאתם מכירים את תבניות ההודעות ואת ההקשרים שבהם משתמשים בהן.
פונקציות גיבוב (Hash)
מחשבת ערך גיבוב ומחזירה את ייצוג המחרוזת של הגיבוב הזה.
פונקציות גיבוב הקסדצימליות
חישוב ערך גיבוב והחזרת הייצוג של הגיבוב כמחרוזת הקסדצימלית.
תחביר
| תפקיד | תיאור |
|---|---|
md5Hex(string)
|
חישוב של גיבוב MD5 שמבוטא כמספר הקסדצימלי. |
sha1Hex(string)
|
מחשבת גיבוב (hash) מסוג SHA1 שמבוטא כמספר הקסדצימלי. |
sha256Hex(string)
|
מחשבת גיבוב SHA256 שמבוטא כמספר הקסדצימלי. |
sha384Hex(string)
|
מחשבת גיבוב SHA384 שמבוטא כמספר הקסדצימלי. |
sha512Hex(string)
|
מחשבת גיבוב SHA512 שמבוטא כמספר הקסדצימלי. |
ארגומנטים
string – פונקציות הגיבוב מקבלות ארגומנט מחרוזת יחיד שעליו מחושב אלגוריתם הגיבוב. הארגומנט יכול להיות מחרוזת מילולית או משתנה זרימה של מחרוזת.
דוגמאות
בקשה להפעלת פונקציה:
sha256Hex('abc')תוצאה:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
בקשה להפעלת פונקציה:
var str = 'abc'; sha256Hex(str)
תוצאה:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
פונקציות גיבוב (Hash) של Base64
מחשבת ערך גיבוב (hash) ומחזירה את הייצוג של הגיבוב כמחרוזת בקידוד Base64.
תחביר
| תפקיד | תיאור |
|---|---|
md5Base64(string)
|
מחשבת גיבוב MD5 שמבוטא כערך בקידוד Base64. |
sha1Base64(string)
|
מחשבת גיבוב SHA1 שמבוטא כערך בקידוד Base64. |
sha256Base64(string)
|
מחשבת גיבוב SHA256 שמוצג כערך בקידוד Base64. |
sha384Base64(string)
|
מחשבת גיבוב SHA384 שמוצג כערך בקידוד Base64. |
sha512Base64(string)
|
מחשבת גיבוב SHA512 שמבוטא כערך בקידוד Base64. |
ארגומנטים
string – פונקציות הגיבוב מקבלות ארגומנט מחרוזת יחיד שעליו מחושב אלגוריתם הגיבוב. הארגומנט יכול להיות מחרוזת מילולית או משתנה של זרימת מחרוזת.
דוגמאות
בקשה להפעלת פונקציה:
sha256Base64('abc')תוצאה:
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
בקשה להפעלת פונקציה:
var str = 'abc'; sha256Base64(str)
תוצאה:
ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=
פונקציות מחרוזת
ביצוע פעולות על מחרוזות בתבנית של הודעה.
פונקציות קידוד Base64
קידוד ופענוח של מחרוזות באמצעות סכמת הקידוד Base64.
תחביר
| תפקיד | תיאור |
|---|---|
encodeBase64(string)
|
מקודד מחרוזת באמצעות קידוד Base64. לדוגמה: encodeBase64(value), כאשר value מכיל את הערך
abc, הפונקציה מחזירה את המחרוזת: YWJj
|
decodeBase64(string)
|
פענוח של מחרוזת בקידוד Base64. לדוגמה: decodeBase64(value) אם value מכיל
aGVsbG8sIHdvcmxk, הפונקציה מחזירה את המחרוזת hello, world.
|
ארגומנטים
string – המחרוזת לקידוד או לפענוח. יכול להיות מחרוזת ליטרל או משתנה זרימה מסוג מחרוזת.
דוגמה
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Hello, {decodeBase64('d29ybGQK')}</Header> </Headers> </Set> </AssignMessage>
פונקציות לשינוי אותיות רישיות
המרת מחרוזת לאותיות רישיות או לאותיות קטנות.
תחביר
| תפקיד | תיאור |
|---|---|
toUpperCase(string)
|
הפונקציה ממירה מחרוזת לאותיות רישיות. |
toLowerCase(string)
|
הפונקציה ממירה מחרוזת לאותיות קטנות. |
ארגומנטים
string - המחרוזת להמרה. יכול להיות מחרוזת ליטרל או משתנה זרימה מסוג מחרוזת.
דוגמה
<AssignMessage name="AM-Set-Custom-Response"> <AssignTo createNew="false" type="response"/> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <Set> <Headers> <Header name="x-h1">Hello, {toLowerCase(user.name)}</Header> </Headers> </Set> </AssignMessage>
פונקציית מחרוזת משנה
הפונקציה מחזירה את התווים שבין אינדקס ההתחלה לאינדקס הסיום של המחרוזת שצוינה.
תחביר
substring(str,start_index,end_index)
ארגומנטים
- str – מחרוזת ליטרלית או משתנה זרימה של מחרוזת.
- start_index – האינדקס ההתחלתי בתוך המחרוזת.
- end_index – (אופציונלי) אינדקס הסיום במחרוזת. אם לא מציינים אותו, האינדקס לסיום הוא סוף המחרוזת.
דוגמאות
בדוגמאות הבאות, נניח שקיימים משתני הזרימה האלה:
| שם המשתנה | ערך |
|---|---|
alpha
|
ABCDEFGHIJKLMNOPQRSTUVWXYZאבגדהוזחטיכלמנסעפצקרשת |
seven
|
7 |
אלה התוצאות של קריאות לפונקציות שמשתמשות במשתנים האלה:
| ביטוי של תבנית הודעה | תוצאה |
|---|---|
{substring(alpha,22)}
|
WXYZ
|
hello {substring(alpha,22)}
|
hello WXYZ
|
{substring(alpha,-4)}
|
WXYZ
|
{substring(alpha,-8,-4)}
|
STUV
|
{substring(alpha,0,10)}
|
ABCDEFGHIJ
|
{substring(alpha,0,seven)}
|
ABCDEFG
|
הפונקציה 'החלפת הכול'
הפונקציה מחילה ביטוי רגולרי על מחרוזת, ובכל מקום שבו נמצאת התאמה, מחליפה את ההתאמה בערך חלופי.
תחביר
replaceAll(string,regex,value)
ארגומנטים
- string – מחרוזת מילולית או משתנה זרימה שבה יתבצעו ההחלפות.
- regex – ביטוי רגולרי.
- value – הערך שיחליף את כל ההתאמות לביטוי הרגולרי במחרוזת.
דוגמאות
בדוגמאות הבאות, נניח שקיימים משתני הזרימה האלה:
| שם המשתנה | ערך |
|---|---|
header
|
Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
regex1
|
"^Bearer "
|
replacement
|
"TOKEN: "
|
אלה התוצאות של קריאות לפונקציות שמשתמשות במשתנים האלה:
| ביטוי של תבנית הודעה | תוצאה |
|---|---|
{replaceAll(header,"9993",'')}
|
Bearer ABCDEFGHIJKLMNOPQRSTUVWXYZ-
|
{replaceAll(header,regex1,'')}
|
ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
{replaceAll(header,regex1,replacement)}
|
TOKEN: ABCDEFGHIJKLMNOPQRSTUVWXYZ-9993
|
הפונקציה Replace First
הפונקציה מחליפה רק את המופע הראשון של הביטוי הרגולרי שצוין במחרוזת.
תחביר
replaceFirst(string,regex,value)
ארגומנטים
- string – מחרוזת מילולית או משתנה זרימה שבה יתבצעו ההחלפות.
- regex – ביטוי רגולרי.
- value – הערך שיחליף את ההתאמות של הביטוי הרגולרי במחרוזת.
פונקציות של תו בריחה (escape) וקידוד
פונקציות שיוצרות תו בריחה (escape) או מקודדות תווים מיוחדים במחרוזת.
תחביר
| תפקיד | תיאור |
|---|---|
| escapeJSON(string) | הקו הנטוי ההפוך משמש כתו בריחה למירכאות כפולות. |
| escapeXML(string) | הפונקציה מחליפה סוגריים זוויתיים, גרש, מרכאות כפולות וסימני אמפרסנד בישויות ה-XML המתאימות. לשימוש במסמכי XML 1.0.
|
| escapeXML11(string) | פועלת באותו אופן כמו escapeXML, אבל עבור ישויות XML v1.1. הערות לגבי השימוש מופיעות בהמשך. |
| encodeHTML(string) | מקודד גרש, סוגריים זוויתיים ואמפרסנד. |
ארגומנטים
string - המחרוזת שצריך להוסיף לה תווי escape. יכול להיות מחרוזת ליטרל או משתנה זרימה מסוג מחרוזת.
הערות שימוש
XML 1.1 יכול לייצג תווי בקרה מסוימים, אבל הוא לא יכול לייצג את בייט האפס או נקודות קוד של Unicode surrogate לא מזווגות, גם אחרי ביצוע escape. הפונקציה escapeXML11() מסירה תווים שלא נכללים בטווחים הבאים:
[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
הפונקציה escapeXML11() משתמשת בתו בריחה (escape) עם תווים בטווחים הבאים:
[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
דוגמאות
נניח שקיים משתנה זרימה בשם food עם הערך הבא: "bread" & "butter". לאחר מכן, הפונקציה:
{escapeHTML(food)}התוצאה היא:
"bread" & "butter"
פונקציות של פורמט זמן
הפונקציה מחזירה ייצוג מחרוזת של הזמן, בפורמט של אזור הזמן המקומי או ב-UTC.
תחביר
| תפקיד | תיאור |
|---|---|
timeFormat(format,str)
|
הפונקציה מחזירה את התאריך בפורמט של אזור הזמן המקומי. |
timeFormatMs(format,str)
|
הפונקציה מחזירה את התאריך בפורמט של אזור הזמן המקומי. |
timeFormatUTC(format,str)
|
הפונקציה מחזירה את התאריך בפורמט UTC. |
timeFormatUTCMs(format,str)
|
הפונקציה מחזירה את התאריך בפורמט UTC. |
ארגומנטים
- format – מחרוזת של פורמט תאריך או שעה. יכול להיות מחרוזת מילולית או משתנה מחרוזת.
- str – מחרוזת או משתנה זרימה שמכיל ערך של זמן. הערך יכול להיות בשניות מאז תקופת ה-Epoch או באלפיות השנייה מאז תקופת ה-Epoch עבור timeFormatMs.
דוגמאות
נניח שיש לכם את הערכים הבאים ושאזור הזמן המקומי הוא אזור הזמן הפסיפי:
epoch_time_ms = 1494390266000epoch_time = 1494390266fmt1 = yyyy-MM-ddfmt2 = yyyy-MM-dd HH-mm-ssfmt3 = yyyyMMddHHmmss
הפונקציות מחזירות את התוצאות הבאות:
- key – (חובה) מציין את המפתח הסודי, בקידוד כמחרוזת, שמשמש לחישוב ה-HMAC.
- valueToSign – (חובה) מציין את ההודעה לחתימה. הוא צריך להיות מחרוזת.
- keyencoding – (אופציונלי) מחרוזת המפתח הסודי תפוענח בהתאם לקידוד שצוין. ערכים תקפים:
hex, base16, base64,utf-8. ברירת מחדל:utf-8 - outputencoding – (אופציונלי) מציין את אלגוריתם הקידוד שבו יש להשתמש עבור הפלט.
ערכים תקינים:
hex, base16, base64. הערכים לא תלויי-רישיות.hexו-base16הם מילים נרדפות. ברירת מחדל:base64 - אם לא מציינים ארגומנטים, הפונקציה מחזירה מספר שלם אקראי ארוך, כפי שמחושב על ידי המחלקה Java SecureRandom.
- אם יש ארגומנט אחד, הוא נחשב לערך המינימלי של החישוב.
- אם יש ארגומנט שני, הוא נחשב כערך המקסימלי של החישוב.
- (חובה)
json-path: (מחרוזת) ביטוי של נתיב JSON. - (חובה)
json-var: (מחרוזת) משתנה של זרימת נתונים או מחרוזת שמכילים JSON. - (אופציונלי)
want-array: (מחרוזת) אם הפרמטר הזה מוגדר כ-'true'ואם קבוצת התוצאות היא מערך, כל רכיבי המערך מוחזרים. אם מגדירים ערך אחר או אם משמיטים את הפרמטר הזה, הפונקציה מחזירה רק את הרכיב האפס של מערך של קבוצת תוצאות. אם קבוצת התוצאות היא לא מערך, המערכת מתעלמת מהפרמטר השלישי הזה, אם הוא קיים.
| פונקציה | פלט |
|---|---|
timeFormatMs(fmt1,epoch_time_ms) |
2017-05-09 |
timeFormat(fmt1,epoch_time) |
2017-05-09 |
timeFormat(fmt2,epoch_time) |
2017-05-09 21:24:26 |
timeFormat(fmt3,epoch_time) |
20170509212426 |
timeFormatUTC(fmt1,epoch_time) |
2017-05-10 |
timeFormatUTC(fmt2,epoch_time) |
2017-05-10 04:24:26 |
timeFormatUTC(fmt3,epoch_time) |
20170510042426 |
פונקציות לחישוב HMAC
פונקציות החישוב של HMAC מספקות חלופה לשימוש במדיניות HMAC כדי לחשב HMAC. הפונקציות האלה שימושיות כשמבצעים חישוב HMAC מדורג, למשל כשמשתמשים בפלט של HMAC אחד כמפתח ל-HMAC שני.
תחביר
| תפקיד | תיאור |
|---|---|
hmacSha224(key,valueToSign[,keyencoding[,outputencoding]])
|
מחשבת HMAC באמצעות פונקציית הגיבוב SHA-224. |
hmacSha256(key,valueToSign[,keyencoding[,outputencoding]])
|
מקודד HMAC באמצעות פונקציית הגיבוב SHA-256. |
hmacSha384(key,valueToSign[,keyencoding[,outputencoding]])
|
מקודדת HMAC באמצעות פונקציית הגיבוב SHA-384. |
hmacSha512(key,valueToSign[,keyencoding[,outputencoding]])
|
מקודדת HMAC באמצעות פונקציית הגיבוב SHA-512. |
hmacMd5(key,valueToSign[,keyencoding[,outputencoding]])
|
מקודדת HMAC באמצעות פונקציית הגיבוב MD5. |
hmacSha1(key, valueToSign [,keyencoding[,outputencoding]])
|
מקודד HMAC באמצעות אלגוריתם ההצפנה SHA-1. |
ארגומנטים
דוגמאות
בדוגמה הזו נעשה שימוש במדיניות AssignMessage כדי לחשב HMAC-256 ולהקצות אותו למשתנה של זרימת נתונים:
<AssignMessage name='AM-HMAC-1'>
<AssignVariable>
<Name>valueToSign</Name>
<Template>{request.header.apikey}.{request.header.date}</Template>
</AssignVariable>
<AssignVariable>
<Name>hmac_value</Name>
<Template>{hmacSha256(private.secretkey,valueToSign)}</Template>
</AssignVariable>
</AssignMessage>בדוגמה הזו מוסבר איך ליצור HMAC מדורג שאפשר להשתמש בו בתהליך החתימה AWS Signature v4. בדוגמה נעשה שימוש במדיניות AssignMessage כדי ליצור את חמש הרמות של HMAC מדורג שמשמשות לחישוב חתימה עבור AWS Signature v4:
<AssignMessage name='AM-HMAC-AWS-1'> <!-- 1 --> <AssignVariable> <Name>DateValue</Name> <Template>{timeFormatUTCMs('yyyyMMdd',system.timestamp)}</Template> </AssignVariable> <!-- 2 --> <AssignVariable> <Name>FirstKey</Name> <Template>AWS4{private.secret_aws_access_key}</Template> </AssignVariable> <!-- 3 --> <AssignVariable> <Name>DateKey</Name> <Template>{hmacSha256(FirstKey,DateValue,'utf-8','base16')}</Template> </AssignVariable> <!-- 4 --> <AssignVariable> <Name>DateRegionKey</Name> <Template>{hmacSha256(DateKey,aws_region,'base16','base16')}</Template> </AssignVariable> <!-- 5 --> <AssignVariable> <Name>DateRegionServiceKey</Name> <Template>{hmacSha256(DateRegionKey,aws_service,'base16','base16')}</Template> </AssignVariable> <!-- 6 --> <AssignVariable> <Name>SigningKey</Name> <Template>{hmacSha256(DateRegionServiceKey,'aws4_request','base16','base16')}</Template> </AssignVariable> <!-- 7 --> <AssignVariable> <Name>aws4_hmac_value</Name> <Template>{hmacSha256(SigningKey,stringToSign,'base16','base16')}</Template> </AssignVariable> </AssignMessage>
פונקציות אחרות
יצירת פונקציית UUID
הפונקציה יוצרת ומחזירה מזהה ייחודי אוניברסלי (UUID).
תחביר
createUuid()
ארגומנטים
ללא.
דוגמה
{createUuid()}
תוצאה לדוגמה:
ec3ca9be-d1e1-4ef4-aee4-4a58f3130db8
הפונקציה Random Long Generator
מחזירה מספר שלם אקראי ארוך.
תחביר
randomLong(args)
ארגומנטים
דוגמה
{random()}התוצאה תהיה משהו כזה:
5211338197474042880כלי ליצירת טקסט באמצעות ביטויים רגולריים
יצירת מחרוזת טקסט שתואמת לביטוי רגולרי נתון.
תחביר
xeger(regex)
ארגומנט
regex – ביטוי רגולרי.
דוגמה
בדוגמה הזו נוצרת מחרוזת בת שבע ספרות ללא אפסים:
xeger('[1-9]{7}')תוצאה לדוגמה:
9857253פונקציית איחוד של ערכי Null
הפונקציה firstnonnull() מחזירה את הערך של הארגומנט השמאלי ביותר שאינו null.
תחביר
firstnonnull(var1,varnn>)
ארגומנט
var1 – משתנה הקשר.
varn – משתנה הקשר אחד או יותר. אפשר להגדיר את הארגומנט הימני ביותר כמחרוזת כדי לספק ערך חלופי (ערך שיוגדר אם אף אחד מהארגומנטים בצד שמאל לא מוגדר).
דוגמאות
בטבלה הבאה מוסבר איך להשתמש בפונקציה:
| תבנית | Var1 | Var2 | Var3 | תוצאה |
|---|---|---|---|---|
{firstnonnull(var1,var2)}
|
לא מוגדר | foo
|
לא רלוונטי | foo
|
{firstnonnull(var1,var2)}
|
foo
|
bar
|
לא רלוונטי | foo
|
{firstnonnull(var1,var2)}
|
foo
|
לא מוגדר | לא רלוונטי | foo
|
{firstnonnull(var1,var2,var3)}
|
foo
|
bar
|
baz
|
foo
|
{firstnonnull(var1,var2,var3)}
|
לא מוגדר | bar
|
baz
|
bar
|
{firstnonnull(var1,var2,var3)}
|
לא מוגדר | לא מוגדר | baz
|
baz
|
{firstnonnull(var1,var2,var3)}
|
לא מוגדר | לא מוגדר | לא מוגדר | null
|
{firstnonnull(var1)}
|
לא מוגדר | לא רלוונטי | לא רלוונטי | null
|
{firstnonnull(var1)}
|
foo
|
לא רלוונטי | לא רלוונטי | foo
|
{firstnonnull(var1,var2)}
|
""
|
bar
|
לא רלוונטי | ""
|
{firstnonnull(var1,var2,'fallback value')}
|
null
|
null
|
fallback value
|
fallback value
|
פונקציית XPath
הפעולה מחילה ביטוי XPath על משתנה XML.
תחביר
xpath(xpath_expression,xml_string,[datatype])
ארגומנטים
xpath_expression – ביטוי XPath.
xml_string – משתנה זרימה או מחרוזת שמכילים XML.
datatype – (אופציונלי) מציין את סוג ההחזרה הרצוי של השאילתה. יכול להיות nodeset, node, number, boolean, string. ברירת המחדל היא nodeset. בדרך כלל ברירת המחדל היא הבחירה הנכונה.
דוגמה 1
נניח שמשתני ההקשר האלה מגדירים מחרוזת XML וביטוי XPath:
xml = "<tag><tagid>250397</tagid><readerid>1</readerid><rssi>74</rssi><date>2019/06/15</date></tag>" xpath = "/tag/tagid"
והפונקציה xpath() משמשת במדיניות AssignMessage, באופן הבא:
<AssignMessage>
<AssignVariable>
<Name>extracted_tag</Name>
<Template>{xpath(xpath,xml)}</Template>
</AssignVariable>
</AssignMessage><
הפונקציה מחזירה את הערך <tagid>250397</tagid>. הערך הזה מוצב במשתנה ההקשר שנקרא extracted_tag.
דוגמה 2
אם רוצים רק את הערך של הצומת, משתמשים בפונקציה text(), באופן הבא:
<AssignMessage>
<AssignVariable>
<Name>extracted_tag</Name>
<Template>{xpath('/tag/tagid/text()',xml)}</Template>
</AssignVariable>
</AssignMessage>
כתוצאה מהפעולה הזו, משתנה ההקשר extracted_tag מוגדר לערך 250397
אם נבחרו כמה צמתים, התוצאה של xpath() היא כל הערכים של הבחירה, מחוברים באמצעות פסיק.
דוגמה 3: מרחבי שמות של XML
כדי לציין מרחב שמות, מוסיפים פרמטרים נוספים, כל אחד מהם מחרוזת שנראית כך:
prefix:namespaceuri. לדוגמה, פונקציית xpath() שבוחרת את רכיב הצאצא של גוף SOAP יכולה להיראות כך:
<AssignMessage> <AssignVariable> <Name>soapns</Name> <Value>soap:http://schemas.xmlsoap.org/soap/envelope/</Value> </AssignVariable> <AssignVariable> <Name>xpathexpression</Name> <Value>/soap:Envelope/soap:Body/*</Value> </AssignVariable> <AssignVariable> <Name>extracted_element</Name> <Template>{xpath(xpathexpression,xml,soapns)}</Template> </AssignVariable> </AssignMessage>
כדי להוסיף עוד מרחבי שמות, אפשר להוסיף עד 10 פרמטרים נוספים לפונקציה xpath()
אפשר לציין ביטוי XPath פשוט כמחרוזת שמוקפת במירכאות בודדות:
{xpath('/tag/tagid/text()',xml)}אם ביטוי ה-XPath כולל קידומות של מרחבי שמות (ונקודתיים), צריך להקצות את ביטוי ה-XPath הזה למשתנה ולציין את שם המשתנה במקום את הביטוי ישירות.
{xpath(xpathexpression,xml,ns1)}דוגמה 4: ציון סוג ההחזרה הרצוי
הפרמטר השלישי האופציונלי שמועבר לפונקציה xpath() מציין את סוג ההחזרה הרצוי של השאילתה.
חלק משאילתות XPath יכולות להחזיר ערכים מספריים או בוליאניים. לדוגמה, הפונקציה count() מחזירה מספר. זוהי שאילתת XPath תקינה:
count(//Record/Fields/Pair)
השאילתה החוקית הזו מחזירה ערך בוליאני:
count(//Record/Fields/Pair)>0
במקרים כאלה, מפעילים את הפונקציה xpath() עם פרמטר שלישי שמציין את הסוג:
{xpath(expression,xml,'number')}
{xpath(expression,xml,'boolean')}
אם הפרמטר השלישי מכיל נקודתיים, הוא יפורש כארגומנט של מרחב שמות.
אם לא, המערכת מתייחסת אליו כאל סוג ההחזרה הרצוי. במקרה כזה, אם הפרמטר השלישי הוא לא אחד מהערכים התקפים (בלי להתחשב באותיות רישיות), הפונקציה xpath() תחזיר כברירת מחדל קבוצת צמתים.
פונקציית JSON Path
הפעולה מחילה ביטוי JSON Path על משתנה JSON.
תחביר
jsonPath(json-path,json-var,want-array)
ארגומנטים
דוגמה 1
אם זו תבנית ההודעה:
The address is {jsonPath($.results[?(@.name == 'Mae West')].address.line1,the_json_variable)}
the_json_variable מכיל:
{ "results" : [ { "address" : { "line1" : "18250 142ND AV NE", "city" : "Woodinville", "state" : "Washington", "zip" : "98072" }, "name" : "Fred Meyer" }, { "address" : { "line1" : "1060 West Addison Street", "city" : "Chicago", "state" : "Illinois", "zip" : "60613" }, "name" : "Mae West" } ] }
התוצאה של הפונקציה היא:
The address is 1060 West Addison Street
שימו לב שבמקרה הזה, קבוצת התוצאות היא רכיב יחיד (ולא מערך של רכיבים). אם
קבוצת התוצאות הייתה מערך, רק הרכיב האפס של המערך היה מוחזר. כדי להחזיר את המערך המלא, צריך להפעיל את הפונקציה עם 'true' כפרמטר השלישי, כמו בדוגמה הבאה.
דוגמה 2
אם זו תבנית ההודעה:
{jsonPath($.config.quota[?(@.operation=='ManageOrder')].appname,the_json_variable,'true')}
the_json_variable מכיל:
{
"results" : [
{
"config": {
"quota": [
{
"appname": "A",
"operation": "ManageOrder",
"value": "900"
},
{
"appname": "B",
"operation": "ManageOrder",
"value": "1000"
},
{
"appname": "B",
"operation": "SubmitOrder",
"value": "800"
}
]
}
}
]
} התוצאה של הפונקציה היא:
['A','B']