אתם צופים במסמכי העזרה של Apigee Edge.
כניסה למסמכי העזרה של Apigee X. info
כאן מוסבר איך משתמשים בתבניות הודעות בשרתי 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
.
אם לא ניתן לפתור את המשתנה, המחרוזת הריקה תוצג בפלט.
דוגמה
כשחורגים מהמכסה, מומלץ להחזיר למבצע הקריאה להפעלה הודעה משמעותית. התבנית הזו משמשת בדרך כלל עם 'כלל תקלה' כדי לספק פלט שמספק למבצע הקריאה החוזרת מידע על הפרת המכסה. במדיניות Assign Message הבאה, נעשה שימוש בתבניות של הודעות כדי לאכלס את פרטי המכסות באופן דינמי בכמה רכיבי 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
שוב, חשוב לזכור שמשתני תהליך בתבנית של הודעה צריכים להיות מוקפים בסוגריים מסולסלים.
כשהמדיניות הזו פועלת:
- רכיבי הכותרת מקבלים ערכים של משתני התהליך שצוינו.
- המטען הייעודי כולל שילוב של טקסט מילולי ומשתנים (ה-
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.
כללי מדיניות שמאפשרים להשתמש בתבניות של הודעות
מדיניות | רכיבים ורכיבי צאצא שתומכים בתבניות של הודעות |
---|---|
מדיניות בקרת גישה | <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 בלבד)
* הרכיבים האלה תומכים בתבנית הודעה רק כאשר type=map. |
מדיניות GenerateJWT מדיניות VerifyJWT |
<AdditionalClaims><Claim>
* הרכיבים האלה תומכים בתבנית הודעה רק כאשר type=map. |
מדיניות LDAP | <SearchQuery> |
המדיניות של MessageLogging | <Syslog><Message>
|
מדיניות OASValidation | רכיב
|
המדיניות של RaiseFault | רכיבי <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, Headers, QueryParams, FormParams
|
מדיניות SAMLAssertion | <Template>
* רק כשחתימה המדיניות היא |
המדיניות בנושא ServiceCallout | רכיבי <Set> : Payload, ContentType, Verb, Version, Path, StatusCode, ReasonPhrase, /Headers, QueryParams, FormParams
|
רכיבי TargetEndpoint שמקבלים תבניות של הודעות
רכיבי HTTPTargetConnection | רכיבי הצאצא שתומכים בתבניות של הודעות |
---|---|
SSLInfo | Enabled, KeyAlias, KeyStore, TrustStore, ClientAuthEnabled, CLRStore |
LocalTargetConnection | ApiProxy, ProxyEndpoint |
נתיב | כשמשתמשים ברכיב LoadBalancer, רכיב הנתיב פעיל ומקבל תבנית הודעה. |
תחביר של תבנית הודעה
בקטע הזה מוסבר מהם הכללים שצריך לפעול לפיהם כדי להשתמש בתבניות של הודעות.
שימוש בסוגריים מסולסלים כדי לציין משתנים
צריך להקיף את שמות המשתנים בסוגריים מסולסלים { }. אם המשתנה לא קיים, תוחזר מחרוזת ריקה בפלט. עם זאת, אפשר לציין ערכי ברירת מחדל בתבניות של ההודעות (ערכים שיוחלפו אם המשתנה לא יפתר). מידע נוסף זמין במאמר הגדרת ערכי ברירת מחדל בתבניות של הודעות.
חשוב לזכור שאפשר להקיף את כל מחרוזת תבנית ההודעה במירכאות, אבל זה לא חובה. לדוגמה, שתי תבניות ההודעות הבאות זהות:
<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 לפני הגרסה 16.08.17 של Cloud, לא ניתן היה להשתמש בסוגריים מסולסלים כדי לציין הפניות למשתנים בתוך עומסי נתונים של JSON. בגרסאות הקודמות האלה, צריך להשתמש במאפיינים variablePrefix
ו-variableSuffix
כדי לציין תווים מפרידים, ולהשתמש בהם כדי לעטוף את שמות המשתנים, כך:
<Set> <Payload contentType="application/json" variablePrefix="@" variableSuffix="#"> {"name":"foo", "type":"@variable_name#"} </Payload> </Set>
מומלץ להשתמש בתחביר החדש של סוגריים מסולסלים ב-Apigee, אבל אפשר להמשיך להשתמש בתחביר הישן.
שימוש בפונקציות של תבניות הודעות
ב-Edge יש קבוצה של פונקציות שאפשר להשתמש בהן בתבניות של הודעות כדי לסמן תווים לבריחה (escape), לקודד, לחשב גיבוב ולעצב משתני מחרוזות.
הפונקציות של תבניות ההודעות מתוארות בפירוט במאמר חומר עזר בנושא פונקציות של תבניות הודעות.
דוגמה: 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()
הנה תרחיש לדוגמה: נניח שאפליקציית הקצה העורפי מחזירה תגובת JSON שמכילה תווים תקינים של בריחה. לדוגמה:
{ "code": "INVALID", "user_message": "Invalid value for \"logonId\" check your input." }
נניח שאתם רוצים להחזיר את ההודעה הזו למבצע הקריאה החוזרת של הלקוח בתוכן מטען מותאם אישית. הדרך הרגילה לעשות זאת היא לחלץ את ההודעה ממטען התגובה של היעד ולהשתמש ב-Assign Message כדי להוסיף אותה לתשובת שרת proxy בהתאמה אישית (כלומר, לשלוח אותה חזרה ללקוח).
זוהי מדיניות החילוץ של המשתנים שמחלצת את המידע של user_message
למשתנה שנקרא standard.systemMessage
:
<ExtractVariables name="EV-BackendErrorResponse"> <DisplayName>EV-BackendErrorResponse</DisplayName> <JSONPayload> <Variable name="standard.systemMessage"> <JSONPath>$.user_message</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
זוהי מדיניות תקפה לחלוטין להקצאת הודעות שמוסיפה את המשתנה שחולץ לעומס התגובה (תגובת שרת ה-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>
לצערנו, יש בעיה. המדיניות של חילוץ המשתנים הסירה את תווים האשף של המרכאות סביב חלק מההודעה. פירוש הדבר הוא שהתגובה שהוחזרה ללקוח היא JSON לא תקין. ברור שזה לא מה שרצית.
{ "systemMessage": "Invalid value for "logonId" check your input." }
כדי לעקוף את הבעיה הזו, אפשר לשנות את המדיניות Assign Message כך שתשתמש בפונקציית תבנית הודעה שמבצעת בריחה מהמירכאות בתוך ה-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>
הפונקציה מוסיפה תווים לבריחה (escape) לתוך המירכאות המוטמעות, וכתוצאה מכך נוצרת מחרוזת 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)
חישוב ערך גיבוב והחזרת הייצוג של המחרוזת של הגיבוב.
פונקציות גיבוב (hash) הקסדצימליות
חישוב ערך גיבוב והחזרת הייצוג של המחרוזת של הגיבוב כמספר הקסדצימלי.
תחביר
תפקיד | תיאור |
---|---|
md5Hex(string)
|
חישוב גיבוב MD5 שמבוטא כמספר הקסדצימלי. |
sha1Hex(string)
|
חישוב גיבוב SHA1 שמבוטא כמספר הקסדצימלי. |
sha256Hex(string)
|
חישוב גיבוב SHA256 שמבוטא כמספר הקסדצימלי. |
sha384Hex(string)
|
הפונקציה מחשבת גיבוב SHA384 שמבוטא כמספר הקסדצימלי. |
sha512Hex(string)
|
חישוב גיבוב SHA512 שמבוטא כמספר הקסדצימלי. |
ארגומנטים
string – פונקציות הגיבוב מקבלות ארגומנט מחרוזת יחיד, שממנו מחושב אלגוריתם הגיבוב. הארגומנט יכול להיות מחרוזת לטינית או משתנה של מחרוזת זרימה.
דוגמאות
קריאה לפונקציה:
sha256Hex('abc')
תוצאה:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
קריאה לפונקציה:
var str = 'abc'; sha256Hex(str)
תוצאה:
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
פונקציות גיבוב Base64
חישוב ערך גיבוב והחזרת הייצוג של המחרוזת של הגיבוב הזה כערך בקידוד 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) | תו בריחה (escape) של קו נטוי לאחור מוסיף תו בריחה למירכאות כפולות. |
escapeXML(string) | הפונקציה מחליפה את הסוגריים הסוגריים, את התו ", את התו " ואת התו " בישויות ה-XML המתאימות. משתמשים ב-1.0 XML למסמכים בפורמט XML 1.0.
|
escapeXML11(string) | הפונקציה פועלת באותו אופן כמו escapeXML, אבל עבור ישויות XML v1.1. בהמשך מפורטות הערות לגבי השימוש. |
encodeHTML(string) | מקודד גרש, סוגריים זוויתיים ואמפרסנד. |
ארגומנטים
string – המחרוזת שרוצים להימלט ממנה. יכול להיות מחרוזת לטינית או משתנה של מחרוזת זרימה.
הערות לגבי שימוש
ב-XML 1.1 אפשר לייצג תווי בקרה מסוימים, אבל אי אפשר לייצג את הבייט האפס או נקודות קוד של סמלי Unicode חלופיים לא מותאמים, גם אחרי הוספת תווים להימלטות. הפונקציה 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 – מחרוזת או משתנה מחרוזת של זרימה שמכיל ערך זמן. הערך יכול להיות בשניות מאז תחילת המילניום או באלפיות שנייה מאז תחילת המילניום עבור timeFormatMs.
דוגמאות
נניח את הערכים הבאים ונניח שהשעון המקומי הוא שעון החוף המערבי:
epoch_time_ms = 1494390266000
epoch_time = 1494390266
fmt1 = yyyy-MM-dd
fmt2 = yyyy-MM-dd HH-mm-ss
fmt3 = 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
מחולל טקסטים של ביטוי רגולרי (regex)
יצירת מחרוזת טקסט שתואמת לביטוי רגולרי נתון.
תחביר
xeger(regex)
ארגומנט
regex – ביטוי רגולרי.
דוגמה
בדוגמה הזו נוצרת מחרוזת של שבע ספרות ללא אפסים:
xeger('[1-9]{7}')
תוצאה לדוגמה:
9857253
פונקציית coalescing של Null
הפונקציה firstnonnull()
מחזירה את הערך של הארגומנט הימני ביותר שאינו null.
תחביר
firstnonnull(var1,varn)
ארגומנט
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
החלת ביטוי של נתיב JSON על משתנה 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']