أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى
مستندات Apigee X. info
الأدوات المستخدمة
تتيح لك هذه السياسة إضافة رمز JavaScript مخصّص يتم تنفيذه في سياق تدفّق خادم وكيل لواجهة برمجة التطبيقات. في رمز JavaScript المخصّص، يمكنك استخدام الكائنات والطُرق والسمات الخاصة بنموذج كائن JavaScript في Apigee Edge. يتيح لك نموذج العناصر الحصول على المتغيّرات وضبطها وإزالتها في سياق تدفّق الخادم الوكيل. يمكنك أيضًا استخدام وظائف التشفير الأساسية التي يتم توفيرها مع نموذج العناصر.
لمحة
هناك العديد من حالات استخدام سياسة JavaScript. على سبيل المثال، يمكنك الحصول على متغيّرات التدفق وتحديدها، وتنفيذ منطق مخصّص، والتعامل مع الأخطاء، واستخراج البيانات من الطلبات أو الردود، وتعديل عنوان URL المستهدف للخادم الخلفي بشكل ديناميكي، وغير ذلك الكثير. تتيح لك هذه السياسة تنفيذ سلوك مخصّص لا تغطّيه أي سياسات Edge عادية أخرى. في الواقع، يمكنك استخدام سياسة JavaScript لتحقيق العديد من السلوكيات نفسها التي تنفّذها سياسات أخرى، مثل AssignMessage وExtractVariable.
إحدى حالات الاستخدام التي لا ننصح بها لسياسة JavaScript هي التسجيل. تكون سياسة تسجيل الرسائل أنسب بكثير للتسجيل في منصات تسجيل تابعة لجهات خارجية، مثل Splunk وSumo وLoggly، ويمكنك تحسين أداء خادم وكيل واجهة برمجة التطبيقات من خلال تنفيذ سياسة تسجيل الرسائل في PostClientFlow، التي يتم تنفيذها بعد إرسال الردّ إلى العميل.
تتيح لك سياسة JavaScript تحديد ملف مصدر JavaScript لتنفيذه، أو يمكنك تضمين رمز JavaScript مباشرةً في إعدادات السياسة باستخدام العنصر <Source>.
في كلتا الحالتين، يتم تنفيذ رمز JavaScript البرمجي عند تنفيذ الخطوة التي تم ربط السياسة بها.
بالنسبة إلى خيار ملف المصدر، يتم دائمًا تخزين رمز المصدر في موقع عادي ضمن حزمة الخادم الوكيل: apiproxy/resources/jsc. يمكنك أيضًا تخزين رمز المصدر في ملف موارد على مستوى البيئة أو المؤسسة. للحصول على التعليمات، يُرجى الاطّلاع على ملفات الموارد. يمكنك أيضًا تحميل JavaScript من خلال محرر الخادم الوكيل في واجهة مستخدم Apigee.
يجب أن تتضمّن ملفات مصدر JavaScript دائمًا الامتداد .js.
يمكنك الاطّلاع على البرامج والإصدارات المتوافقة لمعرفة إصدار JavaScript المتوافق حاليًا.
فيديو
شاهِد فيديو قصيرًا للتعرّف على كيفية إنشاء إضافة سياسة مخصّصة باستخدام سياسة JavaScript.
نماذج
إعادة كتابة عنوان URL المستهدَف
في ما يلي إحدى حالات الاستخدام الشائعة: استخراج البيانات من نص الطلب وتخزينها في متغيّر في التدفق واستخدام هذا المتغيّر في التدفق في مكان آخر ضمن تدفق الخادم الوكيل. لنفترض أنّ لديك تطبيقًا يطلب من المستخدم إدخال اسمه في نموذج HTML وإرساله. تريد أن يستخرج خادم وكيل واجهة برمجة التطبيقات بيانات النموذج ويضيفها بشكل ديناميكي إلى عنوان URL المستخدَم لاستدعاء خدمة الخلفية. كيف يمكنك تنفيذ ذلك في سياسة JavaScript؟
ملاحظة: إذا أردت تجربة هذا المثال، نفترض أنّك أنشأت وكيلًا جديدًا في أداة تعديل الوكيل. عند إنشائه، ما عليك سوى إدخال عنوان URL لخدمة الخلفية على النحو التالي: http://www.example.com. في هذا المثال، سنعيد كتابة عنوان URL للخلفية بشكلٍ ديناميكي. إذا كنت لا تعرف كيفية إنشاء خادم وكيل جديد، يمكنك الرجوع إلى البرنامج التعليمي الخاص ببدء الاستخدام. .
- في واجهة مستخدم Edge، افتح الخادم الوكيل الذي أنشأته في محرّر الخادم الوكيل.
- انقر على علامة التبويب تطوير.
- من القائمة "جديد"، انقر على نص برمجي جديد.
- في مربّع الحوار، اختَر JavaScript وأدخِل اسمًا للنص البرمجي، مثل
js-example. - ألصِق الرمز التالي في أداة تعديل الرموز واحفظ الخادم الوكيل. الأمر المهم الذي يجب ملاحظته هو العنصر
context. يتوفّر هذا العنصر لرمز JavaScript البرمجي في أي مكان في مسار الخادم الوكيل. ويُستخدم للحصول على ثوابت خاصة بالتدفق، ولطلب طرق get/set المفيدة، ولإجراء المزيد من العمليات. يمثّل جزء الكائن هذا نموذج كائن JavaScript في Edge. يُرجى العِلم أيضًا أنّ المتغيّرtarget.urlهو متغيّر مضمّن للقراءة والكتابة ويمكن الوصول إليه في مسار طلب الاستهداف. عندما نضبط هذا المتغير باستخدام عنوان URL الخاص بواجهة برمجة التطبيقات، يرسل Edge طلبًا إلى الخلفية إلى عنوان 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); }
- من قائمة "سياسة جديدة"، اختَر JavaScript.
- أدخِل اسمًا للسياسة، مثل
target-rewrite. اقبل الإعدادات التلقائية واحفظ السياسة. - إذا اخترت Proxy Endpoint Preflow في "المستكشف"، ستلاحظ أنّه تمت إضافة السياسة إلى هذا التدفق.
- في "المستكشف" (Navigator)، انقر على رمز PreFlow لنقطة النهاية المستهدَفة.
- من "المستكشف"، اسحب سياسة JavaScript إلى جانب "الطلب" في "نقطة النهاية المستهدَفة" ضمن أداة تعديل سير العمل.
- حفظ.
- يمكنك استدعاء واجهة برمجة التطبيقات على النحو التالي، مع استبدال اسم المؤسسة واسم الخادم الوكيل الصحيحَين حسب الاقتضاء:
curl -i -H 'Content-Type: application/x-www-form-urlencoded' -X POST -d 'user=Will' http://myorg-test.apigee.net/js-example
أخيرًا، لنلقِ نظرة على تعريف XML لسياسة JavaScript المستخدَمة في هذا المثال. من المهم ملاحظة أنّ العنصر <ResourceURL>
يُستخدم لتحديد ملف مصدر JavaScript المطلوب تنفيذه. يتم استخدام النمط نفسه مع أي ملف مصدر JavaScript: jsc://filename.js. إذا كان رمز JavaScript يتطلّب تضمينات، يمكنك استخدام عنصر واحد أو أكثر من عناصر <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>
استرداد قيمة السمة من JavaScript
يمكنك إضافة عنصر <Property> في الإعدادات، ثم استرداد قيمة العنصر باستخدام JavaScript في وقت التشغيل.
استخدِم سمة name الخاصة بالعنصر لتحديد الاسم الذي سيتم استخدامه للوصول إلى السمة من رمز JavaScript. قيمة العنصر <Property> (القيمة بين علامتَي الفتح والإغلاق) هي القيمة الحرفية التي سيتلقّاها JavaScript.
في JavaScript، يمكنك استرداد قيمة سمة السياسة من خلال الوصول إليها كسمة من سمات الكائن 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>
- استرداد السمة باستخدام 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 |
تحدّد هذه السمة الحد الأقصى للمدة الزمنية (بالملي ثانية) المسموح بها لتنفيذ النص البرمجي. على سبيل المثال، في حال تجاوز الحدّ البالغ 200 ملي ثانية، ستعرض السياسة الخطأ التالي:
ملاحظة: بالنسبة إلى حسابات الفترة التجريبية المجانية، يقتصر وقت التنفيذ على 200 ملي ثانية. |
لا ينطبق | مطلوب |
يصف الجدول التالي السمات المشتركة بين جميع العناصر الرئيسية للسياسة:
| السمة | الوصف | تلقائي | التواجد في المنزل |
|---|---|---|---|
name |
الاسم الداخلي للسياسة. يمكن لقيمة السمة يمكنك، إذا أردت، استخدام العنصر |
لا ينطبق | مطلوب |
continueOnError |
اضبط القيمة على يمكنك ضبط القيمة على |
خطأ | اختياري |
enabled |
اضبط القيمة على اضبط القيمة على |
صحيح | اختياري |
async |
تم إيقاف هذه السمة نهائيًا. |
خطأ | منهي العمل به |
<DisplayName> عنصر
استخدِمه مع السمة name لتصنيف السياسة في
إدارة خادم وكيل لواجهة المستخدم باسم مختلف بلغة طبيعية.
<DisplayName>Policy Display Name</DisplayName>
| تلقائي |
لا ينطبق إذا لم تستخدم هذا العنصر، سيتم ضبط قيمة السمة |
|---|---|
| التواجد في المنزل | اختياري |
| النوع | سلسلة |
العنصر <IncludeURL>
تحدّد هذه السمة ملف مكتبة JavaScript سيتم تحميله كعنصر تابع لملف JavaScript الرئيسي المحدّد باستخدام العنصر <ResourceURL> أو <Source>. سيتم تقييم النصوص البرمجية بالترتيب الذي تم إدراجها به في السياسة. يمكن أن يستخدم الرمز البرمجي الكائنات والطرق والسمات الخاصة بنموذج كائن JavaScript.
تضمين أكثر من مورد واحد يعتمد على JavaScript مع عناصر <IncludeURL> إضافية
<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
| القيمة التلقائية: | بدون |
| الظهور: | اختياري |
| النوع: | سلسلة |
مثال
يمكنك الاطّلاع على المثال الأساسي في قسم الأمثلة.
العنصر <Property>
تحدّد هذه السمة إحدى السمات التي يمكنك الوصول إليها من رمز JavaScript البرمجي في وقت التشغيل.
<Properties> <Property name="propName">propertyValue</Property> </Properties>
| القيمة التلقائية: | بدون |
| الظهور: | اختياري |
| النوع: | سلسلة |
السمات
| السمة | الوصف | تلقائي | التواجد في المنزل |
|---|---|---|---|
| الاسم |
تحدّد هذه السمة اسم الموقع. |
لا ينطبق | الحقل مطلوب. |
مثال
يمكنك الاطّلاع على المثال في قسم النماذج.
العنصر <ResourceURL>
تحدّد هذه السمة ملف JavaScript الرئيسي الذي سيتم تنفيذه في مسار واجهة برمجة التطبيقات. يمكنك تخزين هذا الملف
في نطاق خادم وكيل لواجهة برمجة التطبيقات (ضمن /apiproxy/resources/jsc في حزمة خادم وكيل لواجهة برمجة التطبيقات أو في
قسم "البرامج النصية" في جزء "المستكشف" في محرر خادم وكيل لواجهة برمجة التطبيقات)، أو في نطاقات المؤسسة أو
البيئة لإعادة الاستخدام في عدة خوادم وكيلة لواجهة برمجة التطبيقات، كما هو موضح في ملفات الموارد. يمكن أن يستخدم الرمز البرمجي الكائنات والطرق والسمات الخاصة بنموذج كائن JavaScript.
<ResourceURL>jsc://my-javascript.js</ResourceURL>
| القيمة التلقائية: | بدون |
| الظهور: | يجب توفير قيمة إما لـ <ResourceURL> أو <Source>. إذا كانت السمتان <ResourceURL> و<Source> متوفّرتَين، سيتم تجاهل <ResourceURL>. |
| النوع: | سلسلة |
مثال
يمكنك الاطّلاع على المثال الأساسي في قسم الأمثلة.
العنصر <Source>
تتيح لك إدراج JavaScript مباشرةً في إعدادات XML للسياسة. يتم تنفيذ رمز JavaScript الذي تم إدراجه عندما يتم تنفيذ السياسة في مسار واجهة برمجة التطبيقات.
| القيمة التلقائية: | بدون |
| الظهور: | يجب توفير قيمة إما لـ <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 التي تم إنشاؤها بواسطة سياسة JavaScript.
<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 إلى الخلفية.
ملاحظات الاستخدام
لا تحتوي سياسة JavaScript على أي رمز فعلي. بدلاً من ذلك، تشير سياسة JavaScript إلى "مصدر" JavaScript وتحدّد الخطوة في مسار واجهة برمجة التطبيقات التي يتم فيها تنفيذ JavaScript. يمكنك تحميل النص البرمجي من خلال محرّر وكيل واجهة مستخدم الإدارة، أو يمكنك تضمينه في الدليل /resources/jsc في خوادم وكيل واجهة برمجة التطبيقات التي تطوّرها محليًا.
تصحيح أخطاء رمز سياسة JavaScript
استخدِم الدالة print() لإخراج معلومات تصحيح الأخطاء إلى لوحة إخراج المعاملات في "أداة التتبُّع". للاطّلاع على التفاصيل والأمثلة، راجِع عبارات print() في تصحيح الأخطاء باستخدام JavaScript.
لعرض عبارات الطباعة في "سجلّ التتبُّع"، اتّبِع الخطوات التالية:
- افتح "أداة التتبُّع" وابدأ جلسة تتبُّع لخادم وكيل يحتوي على سياسة JavaScript.
- الاتصال بالخادم الوكيل
- في "أداة التتبُّع"، انقر على الإخراج من جميع المعاملات لفتح لوحة الإخراج.

- ستظهر بياناتك المطبوعة في هذه اللوحة.
يمكنك استخدام الدالة print() لعرض معلومات تصحيح الأخطاء في أداة التتبُّع. تتوفّر هذه الدالة مباشرةً من خلال نموذج عناصر JavaScript. لمزيد من التفاصيل، راجِع مقالة تصحيح أخطاء JavaScript باستخدام عبارات print().
متغيّرات التدفق
لا تملأ هذه السياسة أي متغيّرات تلقائيًا، ولكن يمكنك ضبط (واسترداد) متغيّرات التدفق في رمز JavaScript من خلال استدعاء طرق في عنصر السياق. يبدو النمط النموذجي على النحو التالي:
context.setVariable("response.header.X-Apigee-Target", context.getVariable("target.name"))
كائن السياق هو جزء من نموذج كائن JavaScript في Apigee Edge.
مرجع الخطأ
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
steps.javascript.ScriptExecutionFailed |
500 | The JavaScript policy can throw many different types of ScriptExecutionFailed errors. Commonly seen types of errors include RangeError, ReferenceError, SyntaxError, TypeError, and URIError. | build |
steps.javascript.ScriptExecutionFailedLineNumber |
500 | An error occurred in the JavaScript code. See the fault string for details. | N/A |
steps.javascript.ScriptSecurityError |
500 | A security error occurred when the JavaScript executed. See the fault string for details. | N/A |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
| Error name | Cause | Fix |
|---|---|---|
InvalidResourceUrlFormat |
If the format of the resource URL specified within the <ResourceURL> or the <IncludeURL> element of the JavaScript policy is invalid, then the deployment of the API proxy fails. |
build |
InvalidResourceUrlReference |
If the <ResourceURL> or the <IncludeURL> elements
refer to a JavaScript file that does not exist, then the deployment of the API proxy fails.
The referenced source file must exist either the API proxy, environment, or organization level. |
build |
WrongResourceType |
This error occurs during deployment if the <ResourceURL> or the <IncludeURL>
elements of the JavaScript policy refer to any resource type other than jsc (JavaScript file). |
build |
NoResourceURLOrSource |
The deployment of the JavaScript policy can fail with this error if the <ResourceURL>
element is not declared or if the resource URL is not defined within this element.
<ResourceURL> element is a mandatory element. Or, The <IncludeURL> element is declared
but the resource URL is not defined within this element. The <IncludeURL> element is optional
but if declared, the resource URL must be specified within the <IncludeURL> element. |
build |
Fault variables
These variables are set when this policy triggers an error at runtime. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "ScriptExecutionFailed" |
javascript.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | javascript.JavaScript-1.failed = true |
Example error response
{ "fault": { "faultstring": "Execution of SetResponse failed with error: Javascript runtime error: "ReferenceError: "status" is not defined. (setresponse.js:6)\"", "detail": { "errorcode": "steps.javascript.ScriptExecutionFailed" } } }
Example fault rule
<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.
مواضيع ذات صلة
- نموذج كائن JavaScript
- للحصول على التعليمات ونماذج السياسات ونماذج JavaScript، يُرجى الاطّلاع على برمجة خوادم وكيلة لواجهات برمجة التطبيقات باستخدام JavaScript.
مقالات "منتدى Apigee"
يمكنك العثور على هذه المقالات ذات الصلة في منتدى Apigee: