شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
چه
این خطمشی به شما امکان میدهد کد جاوا اسکریپت سفارشی اضافه کنید که در چارچوب یک جریان پروکسی API اجرا میشود. در کد جاوا اسکریپت سفارشی خود، میتوانید از اشیاء، روشها و ویژگیهای مدل شیء جاوا اسکریپت Apigee Edge استفاده کنید. مدل شیء به شما امکان میدهد متغیرها را در چارچوب جریان پروکسی دریافت، تنظیم و حذف کنید. همچنین میتوانید از توابع رمزنگاری پایه که با مدل شیء ارائه میشوند، استفاده کنید.
درباره
موارد استفاده زیادی برای سیاست جاوا اسکریپت وجود دارد. به عنوان مثال، میتوانید متغیرهای جریان را دریافت و تنظیم کنید، منطق سفارشی را اجرا کنید و مدیریت خطا را انجام دهید، دادهها را از درخواستها یا پاسخها استخراج کنید، URL هدف backend را به صورت پویا ویرایش کنید و موارد دیگر. این سیاست به شما امکان میدهد رفتار سفارشی را پیادهسازی کنید که توسط هیچ سیاست استاندارد Edge دیگری پوشش داده نمیشود. در واقع، میتوانید از یک سیاست جاوا اسکریپت برای دستیابی به بسیاری از رفتارهای مشابه پیادهسازی شده توسط سایر سیاستها، مانند AssignMessage و ExtractVariable، استفاده کنید.
یکی از موارد استفادهای که برای سیاست جاوا اسکریپت توصیه نمیکنیم، ثبت وقایع (logging) است. سیاست ثبت وقایع پیام ( Message Logging) برای ثبت وقایع در پلتفرمهای ثبت وقایع شخص ثالث مانند Splunk، Sumo و Loggly بسیار مناسبتر است و شما با اجرای سیاست ثبت وقایع پیام در PostClientFlow که پس از ارسال پاسخ به کلاینت اجرا میشود، عملکرد پروکسی API را بهبود میبخشید.
سیاست جاوا اسکریپت به شما امکان میدهد یک فایل منبع جاوا اسکریپت را برای اجرا مشخص کنید یا میتوانید کد جاوا اسکریپت را مستقیماً در پیکربندی سیاست با عنصر <Source> قرار دهید. در هر صورت، کد جاوا اسکریپت زمانی اجرا میشود که مرحلهای که سیاست به آن متصل است اجرا شود. برای گزینه فایل منبع، کد منبع همیشه در یک مکان استاندارد در بسته پروکسی ذخیره میشود: apiproxy/resources/jsc . یا میتوانید کد منبع را در یک فایل منبع در سطح محیط یا سازمان ذخیره کنید. برای دستورالعملها، به فایلهای منبع مراجعه کنید. همچنین میتوانید جاوا اسکریپت خود را از طریق ویرایشگر پروکسی Apigee UI آپلود کنید.
فایلهای منبع جاوا اسکریپت همیشه باید پسوند .js داشته باشند.
برای اطلاع از نسخه فعلی جاوا اسکریپت، به نرمافزارهای پشتیبانیشده و نسخههای پشتیبانیشده مراجعه کنید.
ویدئو
برای یادگیری نحوه ایجاد یک افزونه خطمشی سفارشی با استفاده از خطمشی جاوا اسکریپت، یک ویدیوی کوتاه تماشا کنید.
نمونهها
URL هدف را بازنویسی کنید
یک مورد استفاده رایج این است: استخراج دادهها از بدنه درخواست، ذخیره آن در یک متغیر جریان و استفاده از آن متغیر جریان در جای دیگری از جریان پروکسی. فرض کنید برنامهای دارید که کاربر نام خود را در یک فرم HTML وارد کرده و آن را ارسال میکند. شما میخواهید پروکسی API دادههای فرم را استخراج کرده و به صورت پویا آن را به URL مورد استفاده برای فراخوانی سرویس backend اضافه کند. چگونه این کار را در یک سیاست JavsScript انجام میدهید؟
توجه: اگر میخواهید این مثال را امتحان کنید، فرض میکنیم که یک پروکسی جدید در ویرایشگر پروکسی ایجاد کردهاید. وقتی آن را ایجاد میکنید، فقط یک URL سرویس backend به صورت http://www.example.com به آن بدهید. برای این مثال، ما قصد داریم URL backend را به صورت پویا بازنویسی کنیم. اگر نمیدانید چگونه یک پروکسی جدید ایجاد کنید، به آموزش شروع به کار مراجعه کنید.
- در رابط کاربری اج، پروکسی که ایجاد کردهاید را در ویرایشگر پروکسی باز کنید.
- برگه توسعه را انتخاب کنید.
- از منوی جدید، اسکریپت جدید را انتخاب کنید.
- در پنجرهی محاورهای، جاوا اسکریپت را انتخاب کنید و نامی برای اسکریپت، مانند
js-exampleتعیین کنید. - کد زیر را در ویرایشگر کد قرار دهید و پروکسی را ذخیره کنید. نکته مهمی که باید به آن توجه کنید، شیء
contextاست. این شیء در هر کجای جریان پروکسی برای کد جاوا اسکریپت در دسترس است. از آن برای بدست آوردن ثابتهای خاص جریان، فراخوانی متدهای مفید get/set و برای عملیات بیشتر استفاده میشود. این بخش شیء، بخشی از مدل شیء جاوا اسکریپت Edge است. همچنین توجه داشته باشید که متغیر جریانtarget.urlیک متغیر داخلی خواندنی/نوشتنی است که در جریان درخواست هدف قابل دسترسی است. وقتی آن متغیر را با URL API تنظیم میکنیم، Edge فراخوانی backend خود را به آن URL انجام میدهد. ما اساساً URL هدف اصلی را بازنویسی کردهایم، که هر چیزی بود که هنگام ایجاد پروکسی مشخص کردید (مثلاً 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); }
- از منوی «سیاست جدید»، جاوا اسکریپت را انتخاب کنید.
- به این سیاست یک نام بدهید، مثلاً
target-rewrite. مقادیر پیشفرض را بپذیرید و سیاست را ذخیره کنید. - اگر در ناوبر، پیشجریان پروکسی نقطه پایانی را انتخاب کنید، خواهید دید که این سیاست به آن جریان اضافه شده است.
- در ناوبر، آیکون Target Endpoint PreFlow را انتخاب کنید.
- از ناوبر، سیاست جاوا اسکریپت را به سمت درخواست نقطه پایانی هدف در ویرایشگر جریان بکشید.
- ذخیره کنید.
- 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 . اگر کد جاوا اسکریپت شما نیاز به include دارد، میتوانید از یک یا چند عنصر <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> (مقداری که بین تگهای باز و بسته قرار میگیرد) مقدار تحتاللفظی است که توسط جاوا اسکریپت دریافت خواهد شد.
در جاوا اسکریپت، برای بازیابی مقدار ویژگی policy، آن را به عنوان یک ویژگی از شیء 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);
مدیریت خطاها
برای مثالها و بحث در مورد تکنیکهای مدیریت خطا که میتوانید در یک فراخوان جاوا اسکریپت استفاده کنید، به این پست در انجمن Apigee مراجعه کنید. پیشنهادات ارائه شده در انجمن Apigee فقط برای اطلاعرسانی هستند و لزوماً بهترین شیوههای توصیه شده توسط Apigee را نشان نمیدهند.
مرجع عنصر
مرجع عنصر، عناصر و ویژگیهای سیاست جاوا اسکریپت را توصیف میکند.
<?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">
ویژگیهای زیر مختص این سیاست هستند.
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| محدودیت زمانی | حداکثر زمانی (به میلیثانیه) که اسکریپت مجاز به اجرای آن است را مشخص میکند. برای مثال، اگر از محدودیت ۲۰۰ میلیثانیه عبور شود، این خطمشی این خطا را نشان میدهد: توجه: برای حسابهای آزمایشی رایگان، زمان اجرا به ۲۰۰ میلیثانیه محدود میشود. | ناموجود | مورد نیاز |
جدول زیر ویژگی هایی را توصیف می کند که برای همه عناصر اصلی خط مشی مشترک هستند:
| صفت | توضیحات | پیش فرض | حضور |
|---|---|---|---|
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>
| پیشفرض: | هیچکدام |
| حضور: | اختیاری |
| نوع: | رشته |
مثال
به مثال پایه در بخش نمونهها مراجعه کنید.
عنصر <ویژگی>
ویژگیای را مشخص میکند که میتوانید در زمان اجرا از طریق کد جاوا اسکریپت به آن دسترسی داشته باشید.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| پیشفرض: | هیچکدام |
| حضور: | اختیاری |
| نوع: | رشته |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| نام | نام ملک را مشخص میکند. | ناموجود | الزامی است. |
مثال
به مثال در بخش نمونهها مراجعه کنید.
عنصر <ResourceURL>
فایل اصلی جاوا اسکریپت را که در جریان API اجرا خواهد شد، مشخص میکند. میتوانید این فایل را در محدوده پروکسی API (در مسیر /apiproxy/resources/jsc در بسته پروکسی API یا در بخش اسکریپتها از پنل Navigator ویرایشگر پروکسی API) یا در محدودههای سازمان یا محیط برای استفاده مجدد در چندین پروکسی API، همانطور که در فایلهای منبع توضیح داده شده است، ذخیره کنید. کد شما میتواند از اشیاء، متدها و ویژگیهای مدل شیء جاوا اسکریپت استفاده کند.
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| پیشفرض: | هیچکدام |
| حضور: | یا <ResourceURL> یا <Source> الزامی است. اگر <ResourceURL> و <Source> هر دو موجود باشند، <ResourceURL> نادیده گرفته میشود. |
| نوع: | رشته |
مثال
به مثال پایه در بخش نمونهها مراجعه کنید.
عنصر <منبع>
به شما امکان میدهد جاوا اسکریپت را مستقیماً در پیکربندی 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>
ویژگیهای مورد استفاده برای پیکربندی TLS برای همه نمونههای کلاینت HTTP ایجاد شده توسط سیاست جاوا اسکریپت را مشخص میکند.
<SSLInfo> <Enabled>trueFalse</Enabled> <ClientAuthEnabled>trueFalse</ClientAuthEnabled> <KeyStore>ref://keystoreRef</KeyStore> <KeyAlias>keyAlias</KeyAlias> <TrustStore>ref://truststoreRef</TrustStore> </SSLInfo>
| پیشفرض: | هیچکدام |
| حضور: | اختیاری |
| نوع: | رشته |
فرآیند پیکربندی TLS برای یک کلاینت HTTP همان فرآیندی است که برای پیکربندی TLS برای یک TargetEndpoint/TargetServer استفاده میکنید. برای اطلاعات بیشتر به بخش پیکربندی TLS از Edge به backend مراجعه کنید.
یادداشتهای استفاده
یک سیاست جاوا اسکریپت حاوی هیچ کد واقعی نیست. در عوض، یک سیاست جاوا اسکریپت به یک «منبع» جاوا اسکریپت ارجاع میدهد و مرحلهای را در جریان API که جاوا اسکریپت در آن اجرا میشود، تعریف میکند. میتوانید اسکریپت خود را از طریق ویرایشگر پروکسی رابط کاربری مدیریت آپلود کنید، یا میتوانید آن را در دایرکتوری /resources/jsc در پروکسیهای API که به صورت محلی توسعه میدهید، قرار دهید.
اشکالزدایی کد خطمشی جاوا اسکریپت
از تابع print() برای ارسال اطلاعات اشکالزدایی به پنل خروجی تراکنش در ابزار Trace استفاده کنید. برای جزئیات و مثالها، به بخش اشکالزدایی با دستورات print() جاوا اسکریپت مراجعه کنید.
برای مشاهده دستورات چاپ در Trace:
- ابزار ردیابی را باز کنید و یک جلسه ردیابی برای پروکسی که حاوی خطمشی جاوا اسکریپت شماست، آغاز کنید.
- با پروکسی تماس بگیرید.
- در ابزار ردیابی، روی خروجی از همه تراکنشها کلیک کنید تا پنل خروجی باز شود.

- عبارات چاپ شما در این پنل ظاهر میشوند.
شما میتوانید از تابع ()print برای ارسال اطلاعات اشکالزدایی به ابزار Trace استفاده کنید. این تابع مستقیماً از طریق مدل شیء جاوا اسکریپت در دسترس است. برای جزئیات بیشتر، به « اشکالزدایی جاوا اسکریپت با دستورات ()print » مراجعه کنید.
متغیرهای جریان
این خطمشی بهطور پیشفرض هیچ متغیری را پر نمیکند؛ با این حال، میتوانید متغیرهای جریان را در کد جاوا اسکریپت خود با فراخوانی متدها روی شیء context تنظیم (و دریافت) کنید. یک الگوی معمول به این شکل است:
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))
شیء context بخشی از مدل شیء جاوا اسکریپت 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 موجود است.
مباحث مرتبط
- مدل شیء جاوا اسکریپت
- برای دستورالعملها، نمونههای سیاست و نمونههای جاوا اسکریپت، به برنامهنویسی پروکسیهای API با جاوا اسکریپت مراجعه کنید.
مقالات انجمن آپیجی
میتوانید این مقالات مرتبط را در انجمن Apigee پیدا کنید: