درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
این موضوع درباره نحوه استفاده از الگوهای پیام در پراکسیهای API بحث میکند و مرجع تابع ارائه میدهد.
الگوی پیام چیست؟
�الگوی پیام به شما اجازه میدهد تا در عناصر خاصی از خطمشی و TargetEndpoint، جایگزینی رشته متغیر را انجام دهید. این ویژگی، درصورت پشتیبانی، به شما امکان میدهد رشتهها را بهصورت پویا هنگام اجرای پراکسی تکمیل کنید.
میتوانید هر ترکیبی از ارجاعهای متغیر گردش کار و نوشتار ثابت را در الگوی پیام بگنجانید. نامهای متغیر جریان باید در آکولاد قرار بگیرند، درحالیکه هر نوشتاری که در آکولاد نباشد بهعنوان نوشتار تحتاللفظی برونداد میشود.
همچنین کجا میتوانید از الگوهای پیام استفاده کنید؟ را ببینید
مثال
برای مثال، خطمشی «اختصاص پیام» به شما امکان میدهد از الگوی پیام در عنصر <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،
پیام برونداد حاصل در محموله این خواهد بود: 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
دوباره توجه داشته باشید که متغیرهای جریان در الگوی پیام باید در آکولاد قرار بگیرند.
وقتی این خطمشی اجرا میشود:
- عناصر «سرصفحه» مقادیر متغیرهای جریان مشخصشده را دریافت میکنند.
- «پایهبار» شامل ترکیبی از نوشتار تحتاللفظی و متغیرها است (
client_idبهصورت پویا تکمیل میشود). - «کد وضعیت» و «عبارت دلیل» فقط شامل نوشتار تحتاللفظی است؛ بااینحال، اگر بخواهید از قالببندی پیام استفاده کنید، این عناصر از آن پشتیبانی میکنند.
مثال
در تعریف TargetEndpoint نیابتی، عناصر فرزند <SSLInfo> از الگوسازی پیام پشتیبانی میکنند. با پیروی از الگوی مشابه استفادهشده در خطمشیها، متغیرهای جریان در آکولادهای مجعد هنگام اجرای پراکسی جایگزین میشوند.
<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
عنصر فرزند |
| خطمشی «نوشته راهنمای افزونه» |
<Input> |
| خطمشی ExtractVariables | <JsonPath>
|
| خطمشی GenerateJWS خطمشی VerifyJWS |
<Payload> (فقط خطمشی GenerateJWS)
* این عناصر فقط زمانی از الگوی پیام پشتیبانی میکنند که type=map باشد. |
| خطمشی GenerateJWT خطمشی VerifyJWT |
<AdditionalClaims><Claim>
* این عناصر فقط زمانی از الگوی پیام پشتیبانی میکنند که type=map باشد. |
| خطمشی الدپ | <SearchQuery> |
| خطمشی MessageLogging | <Syslog><Message>
|
| خطمشی OASValidation | عنصر
|
| خطمشی RaiseFault | <Set> عنصر: Payload، ContentType، Verb، Version، Path، StatusCode، ReasonPhrase، Headers، QueryParams، FormParams
|
| خطمشی SAMLAssertion | <Template>
* فقط زمانی که امضای خطمشی |
| خطمشی «بازدید از سرویس» | <Set> عنصر: Payload، ContentType، Verb، Version، Path، StatusCode، ReasonPhrase، /Headers، QueryParams، FormParams
|
عناصر «نقطه پایانی هدف» که الگوهای پیام را میپذیرند
| عناصر 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 )}نحو قدیمی برای پایهبارهای JSON
در نسخههای Edge قبلاز انتشار Cloud نسخه ۱۶.۰۸.۱۷، نمیتوانستید
از آکولاد برای نشان دادن ارجاعهای متغیر در پایهبارهای 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()
در اینجا یک مورد استفاده جالب آورده شده است: فرض کنید برنامه زیرین شما یک پاسخ JSON برمیگرداند که حاوی نویسههای گریز معتبر است. برای مثال:
{
"code": "INVALID",
"user_message": "Invalid value for \"logonId\" check your input."
}سپس، فرض کنیم میخواهید این پیام را در یک بار سفارشی به تماسگیرنده مشتری برگردانید. روش معمول برای انجام این کار استخراج پیام از بار پاسخ هدف و استفاده از «اختصاص پیام» برای افزودن آن به پاسخ کارگزار نیابتی سفارشی (یعنی ارسال آن به کارخواه) است.
در اینجا خطمشی «استخراج متغیرها» را میبینید که اطلاعات user_message را در متغیری بهنام standard.systemMessage استخراج میکند:
<ExtractVariables name="EV-BackendErrorResponse"> <DisplayName>EV-BackendErrorResponse</DisplayName> <JSONPayload> <Variable name="standard.systemMessage"> <JSONPath>$.user_message</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
اکنون، در اینجا یک خطمشی «تخصیص پیام» کاملاً معتبر وجود دارد که متغیر استخراجشده را به بار پاسخ (پاسخ پراکسی) اضافه میکند:
<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."
}
برای دور زدن این مشکل، میتوانید خطمشی «اختصاص پیام» را تغییر دهید تا از تابع الگوی پیام استفاده کند که نقلقولهای درون 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>
این موضوع کارکردهای الگوی پیام، آرگومانها، و بروندادهای آنها را شرح میدهد. این موضوع فرض میکند که با الگوهای پیام و زمینههایی که در آنها استفاده میشوند آشنا هستید.
توابع درهمسازی
مقدار درهمسازی را محاسبه میکند و نمایش رشتهای آن درهمسازی را برمیگرداند.
توابع درهمسازی شانزدهشانزدهی
مقدار درهمسازی را محاسبه میکند و نمایش رشتهای آن درهمسازی را بهصورت عدد مبنای شانزده برمیگرداند.
نحو
| عملکرد | شرح |
|---|---|
md5Hex(string)
|
درهمسازی MD5 را که بهصورت عدد هگزادسیمال بیان شده است محاسبه میکند. |
sha1Hex(string)
|
درهمسازی SHA1 را که بهصورت عدد شانزدهشانزدهی بیان شده است محاسبه میکند. |
sha256Hex(string)
|
درهمسازی SHA256 را که بهصورت عدد شانزدهشانزدهی بیان شده است محاسبه میکند. |
sha384Hex(string)
|
درهمسازی SHA384 را که بهصورت عدد شانزدهشانزدهی بیان شده است محاسبه میکند. |
sha512Hex(string)
|
درهمسازی SHA512 را که بهصورت عدد شانزدهشانزدهی بیان شده است محاسبه میکند. |
آرگومانها
رشته - توابع «درهمسازی» یک آرگومان رشتهای واحد میگیرند که الگوریتم درهمسازی روی آن محاسبه میشود. متغیر مستقل میتواند رشتهای تحتاللفظی یا متغیر جاری رشتهای باشد.
مثالها
فراخوانی تابع:
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 بیان شده است محاسبه میکند. |
آرگومانها
رشته - توابع «درهمسازی» یک آرگومان رشتهای واحد میگیرند که الگوریتم درهمسازی روی آن محاسبه میشود. متغیر مستقل میتواند رشتهای تحتاللفظی یا متغیر جریان رشتهای باشد.
مثالها
فراخوانی تابع:
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 را برمیگرداند.
|
آرگومانها
رشته - رشتهای که باید کدبندی یا کدگشایی شود. میتواند رشتهای تحتاللفظی یا متغیر جاری رشتهای باشد.
مثال
<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)
|
رشتهای را به حروف کوچک تبدیل میکند. |
متغیرهای مستقل
رشته - رشتهای که باید تبدیل شود. میتواند رشتهای تحتاللفظی یا متغیر جاری رشتهای باشد.
مثال
<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)
آرگومانها
- رشته - رشتهای تحتاللفظی یا متغیر جریان رشتهای که جایگزینیها در آن انجام میشود.
- regex - عبارت باقاعده.
- مقدار - مقداری که جایگزین همه مطابقتهای عبارت باقاعده در رشته میشود.
مثالها
برای مثالهای زیر، فرض کنید این متغیرهای جاری وجود دارند:
| نام متغیر | مقدار |
|---|---|
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
|
جایگزین کردن تابع اول
فقط اولین مورد مطابقت عبارت باقاعده مشخصشده را در رشته جایگزین میکند.
نحو
replaceFirst(string,regex,value)
آرگومانها
- رشته - رشتهای تحتاللفظی یا متغیر جریان رشتهای که جایگزینیها در آن انجام میشود.
- regex - عبارت باقاعده.
- value - مقدار جایگزین کردن تطابقهای عبارت باقاعده در رشته.
توابع کدبندی و فرار از نویسه
کارکردهایی که نویسههای خاص را در یک رشته فرار یا کدبندی میکنند.
نحو
| عملکرد | شرح |
|---|---|
| escapeJSON(string) | علامت نقلقول دوتایی را با خط مورب معکوس فرار میکند. |
| escapeXML(string) | کروشههای زاویهدار، آپوستروف، گیومه دوتایی، و امپرسند را با نهادهای XML مربوطه جایگزین میکند. برای اسناد «زبان نشانهگذاری توسعهپذیر ۱.۰» استفاده میشود.
|
| escapeXML11(string) | عملکردی مشابه escapeXML دارد، اما برای نهادهای XML نسخه ۱.۱. «یادداشتهای استفاده» در زیر را ببینید. |
| encodeHTML(string) | آپوستروف، براکتهای زاویهدار، و علامت امپرسند را کدبندی میکند. |
آرگومانها
رشته - رشتهای که باید گریز داده شود. میتواند رشتهای تحتاللفظی یا متغیر جاری رشتهای باشد.
یادداشتهای استفاده
زبان نشانهگذاری توسعهپذیر ۱.۱ میتواند نویسههای کنترلی خاصی را نشان دهد، اما نمیتواند بایت تهی یا نقاط کد جانشین یونیکد جفتنشده را نشان دهد، حتی پساز گریز. تابع escapeXML11() نویسههایی را که در محدودههای زیر قرار نمیگیرند برمیدارد:
[#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
تابع escapeXML11() نویسههای موجود در محدودههای زیر را از حالت گریز خارج میکند:
[#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
مثالها
فرض کنید متغیر جریانی بهنام غذا با این مقدار وجود دارد: "bread" & "butter". سپس، تابع:
{escapeHTML(food)}نتایج در:
"bread" & "butter"
توابع قالب زمان
نمایش رشتهای زمان را برمیگرداند که در منطقه زمانی محلی یا در ساعت هماهنگ جهانی قالببندی شده است.
نحو
| عملکرد | شرح |
|---|---|
timeFormat(format,str)
|
تاریخ را با قالب منطقه زمانی محلی برمیگرداند. |
timeFormatMs(format,str)
|
تاریخ را با قالب منطقه زمانی محلی برمیگرداند. |
timeFormatUTC(format,str)
|
تاریخ را با قالب ساعت هماهنگ جهانی برمیگرداند. |
timeFormatUTCMs(format,str)
|
تاریخ را با قالب ساعت هماهنگ جهانی برمیگرداند. |
آرگومانها
- قالب - رشته قالب تاریخ/زمان. میتواند یک رشته تحتاللفظی یا یک متغیر رشتهای باشد.
- str - متغیر رشتهای یا جریان رشتهای حاوی مقدار زمان. مقدار میتواند برحسب ثانیه از تاریخ یا میلیثانیه از تاریخ برای timeFormatMs باشد.
مثالها
مقادیر زیر را درنظر بگیرید و فرض کنید منطقه زمانی محلی اقیانوس آرام است:
epoch_time_ms = 1494390266000epoch_time = 1494390266fmt1 = yyyy-MM-ddfmt2 = yyyy-MM-dd HH-mm-ssfmt3 = yyyyMMddHHmmss
توابع نتایج زیر را برمیگردانند:
- کلید - (الزامی) کلید مخفی را که بهصورت رشتهای کدبندی شده است و برای محاسبه 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 کدبندی میکند. |
آرگومانها
مثالها
این مثال از خطمشی «تخصیص پیام» برای محاسبه 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
تابع «تولیدکننده تصادفی طولانی»
عدد صحیح بلند تصادفی را برمیگرداند.
نحو
randomLong(args)
آرگومانها
مثال
{random()}به چیزی شبیه این منجر میشود:
5211338197474042880مولد نوشتار عبارت باقاعده
رشته نوشتاری تولید کنید که با عبارت باقاعده دادهشده مطابقت داشته باشد.
نحو
xeger(regex)
متغیر مستقل
regex - عبارت باقاعده.
مثال
این مثال رشتهای هفترقمی بدون صفر تولید میکند:
xeger('[1-9]{7}')نتیجه نمونه:
9857253تابع ادغام تهی
تابع firstnonnull() مقدار سمت چپترین آرگومان غیرتهی را برمیگرداند.
نحو
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 - (اختیاری) نوع برگشتی موردنظر برای پُرسمان را مشخص میکند. میتواند مجموعه گره، گره، عدد، بولی، رشته باشد. بهطور پیشفرض روی مجموعه گرهها تنظیم میشود. پیشفرض معمولاً انتخاب درستی است.
مثال ۱
فرض کنید این متغیرهای زمینهای رشته XML و عبارت XPath را تعریف میکنند:
xml = "<tag><tagid>250397</tagid><readerid>1</readerid><rssi>74</rssi><date>2019/06/15</date></tag>" xpath = "/tag/tagid"
و تابع xpath() در خطمشی «تخصیص پیام» بهصورت زیر استفاده میشود:
<AssignMessage>
<AssignVariable>
<Name>extracted_tag</Name>
<Template>{xpath(xpath,xml)}</Template>
</AssignVariable>
</AssignMessage><
این تابع مقدار <tagid>250397</tagid> را برمیگرداند. این مقدار در متغیر زمینهای بهنام extracted_tag قرار میگیرد.
مثال ۲
اگر فقط مقدار گره را میخواهید، از تابع text() بهصورت زیر استفاده کنید:
<AssignMessage>
<AssignVariable>
<Name>extracted_tag</Name>
<Template>{xpath('/tag/tagid/text()',xml)}</Template>
</AssignVariable>
</AssignMessage>
درنتیجه این عملیات، متغیر زمینهای extracted_tag روی
250397 تنظیم میشود
اگر چند گره انتخاب شده باشد، نتیجه xpath() همه مقادیر انتخاب است که با کاما بههم متصل شدهاند.
مثال ۳: فضانامهای 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>
برای فضای نامهای اضافی، میتوانید حداکثر ۱۰ پارامتر اضافی به تابع xpath()
اضافه کنید.
میتوانید عبارت ساده XPath را بهعنوان رشتهای که با تکنقلقول احاطه شده است مشخص کنید:
{xpath('/tag/tagid/text()',xml)}اگر عبارت XPath شامل پیشوندهای فضای نام (و دونقطهها) باشد، باید آن عبارت XPath را به متغیری اختصاص دهید و نام متغیر را بهجای عبارت مستقیماً مشخص کنید.
{xpath(xpathexpression,xml,ns1)}مثال ۴: مشخص کردن نوع برگشتی موردنظر
پارامتر سوم اختیاری که به تابع 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)
آرگومانها
مثال ۱
اگر این الگوی پیام باشد:
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' بهعنوان پارامتر سوم فراخوانی کنید، همانطور که در
مثال بعدی نشان داده شده است.
مثال ۲
اگر این الگوی پیام باشد:
{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']