درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
چه
این خطمشی به شما امکان میدهد کد جاوا اسکریپت سفارشی اضافه کنید که در بافت جریان پراکسی API اجرا میشود. در کد جاوا اسکریپت سفارشی خود، میتوانید از اشیا، روشها، و داراییهای مدل شیء جاوا اسکریپت Apigee Edge استفاده کنید. مدل شیء به شما امکان میدهد متغیرها را در بافت جاریسازی پراکسی دریافت، تنظیم، و حذف کنید. همچنین میتوانید از توابع رمزنگاری پایه که با مدل شیء ارائه میشوند استفاده کنید.
درباره
خطمشی جاوا اسکریپت موارد استفاده زیادی دارد. برای مثال، میتوانید متغیرهای جاریسازی را دریافت و تنظیم کنید، منطق سفارشی را اجرا کنید و مدیریت خطا انجام دهید، دادهها را از درخواستها یا پاسخها استخراج کنید، نشانی وب مقصد زیرینه را بهصورت پویا ویرایش کنید، و بسیاری موارد دیگر. این خطمشی به شما امکان میدهد رفتار سفارشی را که تحت پوشش هیچیک از خطمشیهای استاندارد Edge نیست پیادهسازی کنید. درواقع، میتوانید از خطمشی JavaScript برای دستیابی به بسیاری از رفتارهای مشابهی که توسط خطمشیهای دیگر، مانند AssignMessage و ExtractVariable، پیادهسازی شدهاند، استفاده کنید.
یکی از موارد استفادهای که برای خطمشی JavaScript توصیه نمیکنیم، گزارشگیری است. خطمشی «گزارشگیری پیام» برای گزارشگیری در پلاتفرمهای گزارشگیری طرف سوم مثل Splunk، Sumo، و Loggly بسیار مناسبتر است و با اجرای خطمشی «گزارشگیری پیام» در PostClientFlow، که پساز ارسال پاسخ به کارخواه اجرا میشود، عملکرد کارگزار نیابتی API را بهبود میبخشید.
خطمشی جاوا اسکریپت به شما امکان میدهد فایل منبع جاوا اسکریپت را برای اجرا مشخص کنید یا
میتوانید کد جاوا اسکریپت را مستقیماً در پیکربندی خطمشی با عنصر <Source>
قرار دهید.
در هرصورت، کد جاوا اسکریپت زمانی اجرا میشود که مرحلهای که خطمشی به آن پیوست شده است اجرا شود.
برای گزینه فایل منبع، کد منبع همیشه در مکان استاندارد درون بسته پراکسی ذخیره میشود: apiproxy/resources/jsc. یا میتوانید کد منبع را در فایل منبع در سطح محیط یا سازمان ذخیره کنید. برای
دستورالعملها، فایلهای منبع را ببینید. همچنین میتوانید
جاوا اسکریپت خود را ازطریق ویرایشگر پراکسی Apigee UI بارگذاری کنید.
فایلهای منبع جاوا اسکریپت همیشه باید افزونه .js داشته باشند.
برای اطلاع از نسخه فعلی پشتیبانیشده جاوا اسکریپت، نرمافزار پشتیبانیشده و نسخههای پشتیبانیشده را ببینید.
ویدیو
برای آشنایی با نحوه ایجاد افزونه خطمشی سفارشی بااستفاده از خطمشی JavaScript، ویدیو کوتاهی را تماشا کنید.
نمونهها
بازنویسی نشانی وب مقصد
در اینجا یک مورد استفاده رایج آورده شده است: استخراج دادهها از بدنه درخواست، ذخیره کردن آن در متغیر جاریسازی، و استفاده از آن متغیر جاریسازی در جای دیگری از جاریسازی پراکسی. فرض کنیم برنامهای دارید که در آن کاربر نامش را در فرم HTML وارد میکند و آن را ارسال میکند. میخواهید کارگزار نیابتی API دادههای فرم را استخراج کند و بهصورت پویا به نشانی وب مورداستفاده برای فراخوانی سرویس زیرینه اضافه کند. چگونه این کار را در خطمشی JavaScript انجام میدهید؟
توجه: اگر میخواهید این مثال را امتحان کنید، فرض میکنیم که در ویرایشگر پراکسی یک پراکسی جدید ایجاد کردهاید. وقتی آن را ایجاد میکنید، کافی است نشانی وب سرویس زیرینه زیر را به آن بدهید: http://www.example.com. برای این مثال، نشانی وب زیرینه را بهصورت پویا بازنویسی خواهیم کرد. اگر نمیدانید چگونه کارگزار جدیدی ایجاد کنید، به آموزش گامبهگام شروع کار مراجعه کنید. .
- در «میانای کاربری Edge»، پراکسی را که در ویرایشگر پراکسی ایجاد کردهاید باز کنید.
- برگه توسعه را انتخاب کنید.
- از منو «جدید»، برنامه جدید را انتخاب کنید.
- در چارگوش گفتگو، JavaScript را انتخاب کنید و نامی برای دستورگان انتخاب کنید، مثلاً
js-example. - کد زیر را در ویرایشگر کد جایگذاری کنید و کارگزار را ذخیره کنید. مورد مهمی که باید
متوجه شوید شیء
contextاست. این شیء در هرجایی از جریان پراکسی برای کد جاوا اسکریپت دردسترس است. از آن برای دریافت ثابتهای مختص جریان، فراخوانی روشهای مفید دریافت/تنظیم، و برای عملیات بیشتر استفاده میشود. این بخش شیء از مدل شیء جاوا اسکریپت Edge است. توجه داشته باشید که متغیر جریانtarget.urlنیز یک متغیر خواندنی/نوشتنی داخلی است که در جریان «درخواست هدف» دردسترس است. وقتی آن متغیر را با نشانی وب میانای برنامهسازی کاربردی تنظیم میکنیم، Edge تماس زیرینه خود را با آن نشانی وب برقرار میکند. اساساً نشانی وب مقصد اصلی را که هنگام ایجاد پراکسی مشخص کرده بودید (برای نمونه، http://www.example.com) بازنویسی کردهایم.
if (context.flow=="PROXY_REQ_FLOW") { var username = context.getVariable("request.formparam.user"); context.setVariable("info.username", username); } if (context.flow=="TARGET_REQ_FLOW") { context.setVariable("request.verb", "GET"); var name = context.getVariable("info.username"); var url = "http://mocktarget.apigee.net/" context.setVariable("target.url", url + "?user=" + name); }
- از منو «خطمشی جدید»، JavaScript را انتخاب کنید.
- نامی برای خطمشی انتخاب کنید، مثلاً
target-rewrite. پیشفرضها را بپذیرید و خطمشی را ذخیره کنید. - اگر «جاریسازی پیشاز جریان داده نقطه پایانی پراکسی» را در «پیمایشگر» انتخاب کنید، خواهید دید که خطمشی به آن جریان داده اضافه شده است.
- در «پیمایشگر»، نماد جریان پیشاز نقطه پایانی هدف را انتخاب کنید.
- از «پیمایشگر»، خطمشی جاوا اسکریپت را به سمت «درخواست» در «نقطه پایانی هدف» در ویرایشگر جاری بکشید.
- ذخیره کلیک کنید.
- API را بهاینصورت فراخوانی کنید و نام سازمان و نام پراکسی صحیح خود را جایگزین کنید: مناسب:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example
یک نکته آخر، بیایید نگاهی به تعریف XML برای خطمشی جاوا اسکریپت استفادهشده در این مثال بیندازیم. نکته مهمی که باید به آن توجه کنید این است که عنصر <ResourceURL>
برای مشخص کردن فایل منبع جاوا اسکریپت برای اجرا استفاده میشود. این الگوی یکسان برای هر فایل منبع جاوا اسکریپت استفاده میشود: jsc://filename.js. اگر کد جاوا اسکریپت شما
به گنجاندن نیاز دارد، میتوانید از یک یا چند عنصر <IncludeURL> برای انجام این کار استفاده کنید،
همانطور که در ادامه این مرجع توضیح داده شده است.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="target-rewrite"> <DisplayName>target-rewrite</DisplayName> <Properties/> <ResourceURL>jsc://js-example.js</ResourceURL> </Javascript>
بازیابی مقدار دارایی از جاوا اسکریپت
میتوانید عنصر <Property> را در پیکربندی اضافه کنید، سپس مقدار عنصر را با جاوا اسکریپت در زمان اجرا بازیابی کنید.
از مشخصه name عنصر برای مشخص کردن نامی که با آن به دارایی از کد جاوا اسکریپت دسترسی پیدا میکنید استفاده کنید. مقدار عنصر <Property> (مقدار بین برچسبهای باز و بسته) مقدار تحتاللفظی است که توسط جاوا اسکریپت دریافت خواهد شد.
در جاوا اسکریپت، مقدار دارایی خطمشی را با دسترسی به آن بهعنوان دارایی شیء Properties بازیابی میکنید، مانند مثال زیر:
- دارایی را پیکربندی کنید. در اینجا، مقدار دارایی نام متغیر
response.status.codeاست.<Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavascriptURLRewrite"> <DisplayName>JavascriptURLRewrite</DisplayName> <Properties> <Property name="source">response.status.code</Property> </Properties> <ResourceURL>jsc://JavascriptURLRewrite.js</ResourceURL> </Javascript>
- دارایی را با جاوا اسکریپت بازیابی کنید. در اینجا، مقدار بازیابیشده -- نام متغیر --
سپس توسط تابع
getVariableبرای بازیابی مقدار متغیر استفاده میشود.var responseCode = properties.source; // Returns "response.status.code" var value = context.getVariable(responseCode); // Get the value of response.status.code context.setVariable("response.header.x-target-response-code", value);
مدیریت خطاها
برای مثالها و بحث درباره تکنیکهای مدیریت خطا که میتوانید در ندای JavaScript استفاده کنید، این پست در «انجمن Apigee» را ببینید. پیشنهادهای ارائهشده در «انجمن Apigee» فقط برای اطلاعرسانی است و لزوماً نشاندهنده روالهای مطلوب توصیهشده ازسوی Apigee نیست.
مرجع عنصر
مرجع عنصر عناصر و مشخصههای خطمشی JavaScript را توصیف میکند.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Javascript async="false" continueOnError="false" enabled="true" timeLimit="200" name="JavaScript-1"> <DisplayName>JavaScript 1</DisplayName> <Properties> <Property name="propName">propertyValue</Property> </Properties> <SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo> <IncludeURL>jsc://a-javascript-library-file</IncludeURL> <ResourceURL>jsc://my-javascript-source-file</ResourceURL> <Source>insert_js_code_here</Source> </Javascript>
مشخصههای <Javascript>
<Javascript name="Javascript-1" enabled="true" continueOnError="false" async="false" timeLimit="200">
ویژگیهای زیر مختص این خطمشی است.
| مشخصه | شرح | پیشفرض | حضور |
|---|---|---|---|
| timeLimit |
حداکثر زمان (به میلیثانیه) مجاز برای اجرای نوشتار را مشخص میکند. برای مثال، اگر از حد مجاز ۲۰۰ میلیثانیه فراتر بروید، خطمشی این خطا را ایجاد میکند:
توجه: برای حسابهای آزمایشی رایگان، زمان اجرا به ۲۰۰ میلیثانیه محدود میشود. |
موجود نیست | الزامی |
جدول زیر ویژگی هایی را توصیف می کند که برای همه عناصر اصلی خط مشی مشترک هستند:
| صفت | توضیحات | پیش فرض | حضور |
|---|---|---|---|
name | نام داخلی سیاست. مقدار مشخصه در صورت تمایل، از عنصر | N/A | مورد نیاز |
continueOnError | برای بازگرداندن خطا در صورت شکست خط مشی، روی روی | نادرست | اختیاری |
enabled | برای اجرای خط مشی روی برای خاموش کردن خط مشی، روی | درست است | اختیاری |
async | این ویژگی منسوخ شده است. | نادرست | منسوخ شده است |
عنصر <DisplayName>
علاوه بر ویژگی name برای برچسبگذاری خطمشی در ویرایشگر پروکسی رابط کاربری مدیریت با نامی متفاوت و به زبان طبیعی، از آن استفاده کنید.
<DisplayName>Policy Display Name</DisplayName>
| پیش فرض | N/A اگر این عنصر را حذف کنید، از مقدار ویژگی |
|---|---|
| حضور | اختیاری |
| تایپ کنید | رشته |
عنصر <IncludeURL>
فایل کتابخانه جاوااسکریپتی را مشخص میکند که بهعنوان وابستگی فایل اصلی جاوااسکریپت
مشخصشده با عنصر <ResourceURL> یا <Source> بار شود. متنها به ترتیبی که در خطمشی فهرست شدهاند ارزیابی خواهند شد. کد شما میتواند از اشیا، روشها، و
داراییهای مدل شیء جاوا اسکریپت استفاده کند.
بیشاز یک منبع وابستگی جاوا اسکریپت با عناصر
<IncludeURL> اضافی اضافه کنید.
<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
| پیشفرض: | خالی |
| حضور: | اختیاری |
| نوع: | رشته |
مثال
«مثال پایه» را در بخش نمونهها ببینید.
عنصر <Property>
داراییای را مشخص میکند که میتوانید در زمان اجرا از کد جاوا اسکریپت به آن دسترسی داشته باشید.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| پیشفرض: | خالی |
| حضور: | اختیاری |
| نوع: | رشته |
مشخصهها
| مشخصه | شرح | پیشفرض | حضور |
|---|---|---|---|
| نام |
نام دارایی را مشخص میکند. |
موجود نیست | الزامی. |
مثال
مثال را در بخش نمونهها ببینید.
عنصر <ResourceURL>
فایل اصلی جاوا اسکریپت را که در جریان میانای برنامهسازی کاربردی اجرا خواهد شد مشخص میکند. میتوانید این فایل را در
محدوده پراکسی API (در /apiproxy/resources/jsc در بسته پراکسی API یا در
بخش «دستورگان» در قاب «پیمایشگر» ویرایشگر پراکسی API)، یا در محدودههای سازمان یا
محیط برای استفاده مجدد در چندین پراکسی API ذخیره کنید، همانطور که در فایلهای منبع توضیح داده شده است. کد شما میتواند از اشیا،
روشها، و داراییهای مدل شیء جاوا اسکریپت استفاده کند.
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| پیشفرض: | خالی |
| حضور: | <ResourceURL> یا <Source> لازم است. اگر
<ResourceURL> و <Source> هر دو حضور داشته باشند، <ResourceURL> نادیده گرفته میشود. |
| نوع: | رشته |
مثال
«مثال پایه» را در بخش نمونهها ببینید.
عنصر <Source>
به شما امکان میدهد جاوا اسکریپت را مستقیماً در پیکربندی XML خطمشی درج کنید. کد جاوا اسکریپت درجشده وقتی خطمشی در جریان API اجرا میشود، اجرا میشود.
| پیشفرض: | خالی |
| حضور: | <ResourceURL> یا <Source> لازم است. اگر
<ResourceURL> و <Source> هر دو حضور داشته باشند، <ResourceURL> نادیده گرفته میشود. |
| نوع: | رشته |
مثال
<Javascript name='JS-ParseJsonHeaderFullString' timeLimit='200' > <Properties> <Property name='inboundHeaderName'>specialheader</Property> <Property name='outboundVariableName'>json_stringified</Property> </Properties> <Source> var varname = 'request.header.' + properties.inboundHeaderName + '.values.string'; var h = context.getVariable(varname); if (h) { h = JSON.parse(h); h.augmented = (new Date()).valueOf(); var v = JSON.stringify(h, null, 2) + '\n'; // further indent var r = new RegExp('^(\S*)','mg'); v= v.replace(r,' $1'); context.setVariable(properties.outboundVariableName, v); } </Source> </Javascript>
عنصر <SSLInfo>
مشخص میکند از کدام داراییها برای پیکربندی «امنیت لایه انتقال» برای همه نمونههای کارخواه HTTP ایجادشده توسط خطمشی جاوا اسکریپت استفاده شود.
<SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo>
| پیشفرض: | خالی |
| حضور: | اختیاری |
| نوع: | رشته |
فرایند پیکربندی «امنیت لایه انتقال» برای کارخواه HTTP همان فرایندی است که برای پیکربندی «امنیت لایه انتقال» برای TargetEndpoint/TargetServer استفاده میکنید. برای اطلاعات بیشتر، پیکربندی «امنیت لایه انتقال» از Edge به زیرینه را ببینید.
یادداشتهای استفاده
خطمشی جاوا اسکریپت حاوی کد واقعی نیست. درعوض، خطمشی جاوا اسکریپت به یک
«منبع» جاوا اسکریپت ارجاع میدهد و «مرحله» را در جریان میانای برنامهسازی کاربردی که جاوا اسکریپت در آن اجرا میشود تعریف میکند. میتوانید
نوشته خود را ازطریق ویرایشگر پراکسی «واسط کاربر مدیریت» بارگذاری کنید، یا میتوانید آن را در
/resources/jsc دایرکتوری در پراکسیهای API که بهصورت محلی توسعه میدهید اضافه کنید.
عیبیابی کردن کد خطمشی جاوا اسکریپت
از تابع print() برای برونداد کردن اطلاعات اشکالزدایی به پانل برونداد تراکنش در «ابزار ردیابی» استفاده کنید. برای جزئیات و مثالها، به «اشکالزدایی با دستورات print() جاوا اسکریپت» مراجعه کنید.
برای مشاهده دستورات چاپ در Trace:
- «ابزار ردیابی» را باز کنید و جلسه ردیابی را برای پراکسی حاوی خطمشی جاوا اسکریپت شروع کنید.
- با پراکسی تماس بگیرید.
- در «ابزار ردیابی»، روی برونداد از همه تراکنشها کلیک کنید تا پانل برونداد باز شود.

- گزارشهای چاپی شما در این پانل نشان داده میشود.
میتوانید از تابع print() برای برونداد کردن اطلاعات اشکالزدایی در ابزار ردیابی استفاده کنید. این تابع مستقیماً ازطریق مدل شیء JavaScript دردسترس است. برای جزئیات، «عیبیابی جاوا اسکریپت با دستورات print()» را ببینید.
متغیرهای جریان
این خطمشی بهطور پیشفرض هیچ متغیری را پر نمیکند؛ بااینحال، میتوانید متغیرهای جاریسازی را با فراخوانی روشها در شیء زمینهای در کد جاوا اسکریپت خود تنظیم (و دریافت) کنید. الگوی معمول به این شکل است:
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))
شیء زمینهای بخشی از مدل شیء جاوا اسکریپت Apigee Edge است.
مرجع خطا
این بخش کدهای خطا و پیامهای خطایی را که برگردانده میشوند و متغیرهای خطا را که توسط Edge تنظیم میشوند، هنگامی که این خطمشی خطا را راهاندازی میکند، توضیح میدهد. این اطلاعات برای دانستن اینکه آیا در حال توسعه قوانین خطا برای رسیدگی به خطاها هستید، مهم است. برای کسب اطلاعات بیشتر، آنچه را که باید در مورد خطاهای خط مشی و مدیریت خطاها بدانید را ببینید.
خطاهای زمان اجرا
این خطاها ممکن است هنگام اجرای سیاست رخ دهند.
| کد خطا | وضعیت HTTP | علت | رفع کنید |
|---|---|---|---|
steps.javascript.ScriptExecutionFailed | 500 | خط مشی جاوا اسکریپت می تواند انواع مختلفی از خطاهای ScriptExecutionFailed را ایجاد کند. انواع خطاهای رایج عبارتند از RangeError ، ReferenceError ، SyntaxError ، TypeError و URIError . | build |
steps.javascript.ScriptExecutionFailedLineNumber | 500 | خطایی در کد جاوا اسکریپت رخ داد. برای جزئیات بیشتر به رشته خطا مراجعه کنید. | N/A |
steps.javascript.ScriptSecurityError | 500 | هنگام اجرای جاوا اسکریپت یک خطای امنیتی روی داد. برای جزئیات بیشتر به رشته خطا مراجعه کنید. | N/A |
خطاهای استقرار
این خطاها ممکن است زمانی رخ دهند که یک پروکسی حاوی این خط مشی را مستقر می کنید.
| نام خطا | علت | رفع کنید |
|---|---|---|
InvalidResourceUrlFormat | اگر قالب URL منبع مشخص شده در <ResourceURL> یا عنصر <IncludeURL> خط مشی جاوا اسکریپت نامعتبر باشد، در این صورت استقرار پروکسی API با شکست مواجه می شود. | build |
InvalidResourceUrlReference | اگر عناصر <ResourceURL> یا <IncludeURL> به یک فایل جاوا اسکریپت اشاره می کنند که وجود ندارد، در این صورت استقرار پروکسی API با شکست مواجه می شود. فایل منبع ارجاع شده باید در سطح پروکسی API، محیط یا سطح سازمان باشد. | build |
WrongResourceType | اگر عناصر <ResourceURL> یا <IncludeURL> خط مشی جاوا اسکریپت به هر نوع منبعی غیر از jsc (فایل جاوا اسکریپت) اشاره داشته باشند، این خطا در حین استقرار رخ می دهد. | build |
NoResourceURLOrSource | اگر عنصر <ResourceURL> اعلان نشده باشد یا URL منبع در این عنصر تعریف نشده باشد، استقرار خط مشی جاوا اسکریپت می تواند با این خطا شکست بخورد. عنصر <ResourceURL> یک عنصر اجباری است. یا، عنصر <IncludeURL> اعلام شده است اما URL منبع در این عنصر تعریف نشده است. عنصر <IncludeURL> اختیاری است، اما اگر اعلام شود، URL منبع باید در عنصر <IncludeURL> مشخص شود. | build |
متغیرهای خطا
این متغیرها زمانی تنظیم می شوند که این خط مشی خطایی را در زمان اجرا ایجاد کند. برای اطلاعات بیشتر، به آنچه باید در مورد خطاهای خط مشی بدانید مراجعه کنید.
| متغیرها | کجا | مثال |
|---|---|---|
fault.name=" fault_name " | fault_name نام خطا است، همانطور که در جدول خطاهای Runtime در بالا ذکر شده است. نام خطا آخرین قسمت کد خطا است. | fault.name Matches "ScriptExecutionFailed" |
javascript. policy_name .failed | policy_name نام سیاستی است که توسط کاربر مشخص شده است که خطا را ایجاد کرده است. | javascript.JavaScript-1.failed = true |
نمونه پاسخ خطا
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
مثال قانون خطا
<FaultRule name="JavaScript Policy Faults"> <Step> <Name>AM-CustomErrorResponse</Name> <Condition>(fault.name Matches "ScriptExecutionFailed") </Condition> </Step> <Condition>(javascript.JavaScript-1.failed = true) </Condition> </FaultRule>
طرح
هر نوع خطمشی با یک طرحواره XML (.xsd) تعریف میشود. برای مرجع، طرحوارههای خطمشی
در GitHub دردسترس است.
موضوعات مرتبط
- مدل شیء جاوا اسکریپت
- برای دستورالعملها، نمونههای خطمشی، و نمونههای جاوا اسکریپت، برنامهنویسی کارگزاران میانای برنامهسازی کاربردی با جاوا اسکریپت را ببینید.
مقالات انجمن Apigee
این مقالههای مرتبط را میتوانید در انجمن Apigeeپیدا کنید: