يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات
Apigee X. المعلومات
الموضوع
تتيح لك هذه السياسة إضافة رمز JavaScript مخصّص يتم تنفيذه ضمن سياق تدفق الخادم الوكيل لواجهة برمجة التطبيقات. في رمز JavaScript المخصّص، يمكنك استخدام الكائنات والطرق وخصائص نموذج عنصر JavaScript في Apigee Edge. يتيح لك نموذج الكائن الحصول على متغيّرات وإعدادها وإزالتها في سياق تدفق الخادم الوكيل. يمكنك أيضًا استخدام وظائف التشفير الأساسية التي يتم توفيرها مع نموذج الكائن.
لمحة عامة
هناك حالات متعددة لاستخدام سياسة JavaScript. على سبيل المثال، يمكنك الحصول على متغيّرات التدفق وإعدادها، وتنفيذ منطق مخصّص ومعالجة الأخطاء، واستخراج البيانات من الطلبات أو الاستجابات، وتعديل عنوان URL المستهدف للخلفية ديناميكيًا، وغير ذلك الكثير. وتتيح لك هذه السياسة تنفيذ سلوك مخصّص لا تنطبق عليه أي من سياسات Edge العادية الأخرى. في الواقع، يمكنك استخدام سياسة JavaScript لتحقيق العديد من السلوكيات نفسها التي تطبّقها سياسات أخرى، مثل AssignMessage واستخراج Variable.
إنّ تسجيل الدخول هو إحدى حالات الاستخدام التي لا ننصح بها لسياسة JavaScript. تكون سياسة تسجيل الرسائل أكثر ملاءمة لتسجيل الدخول إلى منصات تسجيل تابعة لجهات خارجية، مثل Splunk وSumo وLoggly. ويمكنك تحسين أداء الخادم الوكيل لواجهة برمجة التطبيقات من خلال تنفيذ سياسة تسجيل الرسائل في PostClientFlow التي يتم تنفيذها بعد إرسال الردّ إلى العميل.
وتتيح لك سياسة JavaScript تحديد ملف مصدر JavaScript لتنفيذه أو
يمكنك تضمين رمز JavaScript مباشرةً في إعدادات السياسة باستخدام
العنصر <Source>
.
وفي كلتا الحالتين، يتم تنفيذ رمز JavaScript عندما يتم تنفيذ الخطوة التي تم إرفاق السياسة بها.
بالنسبة إلى خيار ملف المصدر، يتم تخزين رمز المصدر دائمًا في
موقع عادي ضمن حزمة الخادم الوكيل: apiproxy/resources/jsc
. أو يمكنك أيضًا
تخزين رمز المصدر في ملف مورد على مستوى البيئة أو المؤسسة. للحصول على
تعليمات، راجع ملفات الموارد. يمكنك أيضًا تحميل JavaScript من خلال محرِّر الخادم الوكيل لواجهة مستخدم Apigee.
يجب أن تحتوي ملفات مصدر JavaScript دائمًا على الامتداد .js
.
راجِع البرامج المتوافقة والإصدارات المتوافقة لمعرفة إصدار JavaScript المتوافق حاليًا.
حملة فيديو
يمكنك مشاهدة فيديو قصير للتعرّف على كيفية إنشاء إضافة سياسة مخصّصة باستخدام سياسة JavaScript.
عيّنات
إعادة كتابة عنوان URL المستهدف
في ما يلي حالة استخدام شائعة: استخراج البيانات من نص الطلب وتخزينها في متغيّر تدفق واستخدام هذا المتغيّر في مكان آخر في مسار الخادم الوكيل. لِنفترض أنّك تمتلك تطبيقًا يُدخل فيه المستخدم اسمه في نموذج HTML ويرسله. عندما تريد أن يستخرج الخادم الوكيل لواجهة برمجة التطبيقات بيانات النموذج وأن يضيفها بشكل ديناميكي إلى عنوان URL المستخدَم لاستدعاء الخدمة الخلفية. كيف يمكنك تنفيذ ذلك في سياسة JavsScript؟
ملاحظة: إذا كنت تريد تجربة هذا المثال، لنفترض أنّك أنشأت خادمًا وكيلاً جديدًا في أداة تعديل الخادم الوكيل. عند إنشائه، ما عليك سوى منحه عنوان URL لخدمة الخلفية على النحو التالي: http://www.example.com. في هذا المثال، سنعيد كتابة عنوان URL للخلفية بشكل ديناميكي. في حال عدم معرفة كيفية إنشاء خادم وكيل جديد، يمكنك الرجوع إلى البرنامج التعليمي للبدء. .
- في واجهة مستخدم Edge، افتح الخادم الوكيل الذي أنشأته في محرِّر الخادم الوكيل.
- اختَر علامة التبويب التطوير.
- من القائمة "جديد"، اختَر نص برمجي جديد.
- في مربّع الحوار، اختَر JavaScript وأدخِل اسمًا للنص البرمجي، مثل
js-example
. - الصق الرمز التالي في أداة تعديل الرموز واحفظ الخادم الوكيل. ويجب الانتباه إلى الكائن
context
. يتوفّر هذا الكائن لرمز JavaScript في أي مكان في مسار الخادم الوكيل. ويتم استخدامه للحصول على ثوابت خاصة بالتدفق، ولاستدعاء طرق الحصول/ضبط مفيدة، وللمزيد من العمليات. هذا الجزء من نموذج عنصر 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
. اقبل الخيارات التلقائية واحفظ السياسة. - في حال اختيار التدفق المسبق لنقطة نهاية الخادم الوكيل في المستكشف، سيظهر لك أنّ السياسة قد تمت إضافتها إلى ذلك المسار.
- في المستكشف، حدد رمز الاستهداف المسبق لنقطة النهاية المستهدفة.
- من المستكشف، اسحب سياسة 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 |
اضبط القيمة على اضبط القيمة على |
false | إجراء اختياري |
enabled |
اضبط القيمة على اضبط القيمة على |
صحيح | إجراء اختياري |
async |
تم إيقاف هذه السمة نهائيًا. |
false | منهي العمل به |
العنصر <DisplayName>
استخدِم هذه السمة بالإضافة إلى السمة name
لتصنيف السياسة في محرِّر الخادم الوكيل لواجهة المستخدم الإدارية باستخدام اسم مختلف بلغة طبيعية.
<DisplayName>Policy Display Name</DisplayName>
تلقائي |
لا ينطبق إذا لم تستخدم هذا العنصر، سيتم استخدام قيمة السمة |
---|---|
التواجد في المنزل | إجراء اختياري |
Type | سلسلة |
عنصر <InsertURL>
تحدّد هذه العلامة ملف مكتبة JavaScript لتحميله كتبعية لملف JavaScript الرئيسي المحدّد مع العنصر <ResourceURL>
أو <Source>
. سيتم تقييم النصوص البرمجية
بالترتيب الذي تم إدراجها به في السياسة. ويمكن أن يستخدم الرمز العناصر والطرق وخصائص نموذج عنصر JavaScript.
ضمِّن أكثر من مورد تبعية واحد لـ JavaScript مع عناصر <IncludeURL>
الإضافية.
<IncludeURL>jsc://my-javascript-dependency.js</IncludeURL>
الخيار التلقائي: | لا ينطبق |
الحضور: | إجراء اختياري |
النوع: | سلسلة |
مثال
راجِع المثال الأساسي في القسم عيّنات.
عنصر <الخاصية>
تحدِّد هذه السياسة خاصية يمكنك الوصول إليها باستخدام رمز 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> . |
النوع: | سلسلة |
مثال
راجِع المثال الأساسي في القسم عيّنات.
عنصر <المصدر>
تسمح لك هذه السياسة بإدراج 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.
مرجع الخطأ
يصف هذا القسم رموز الأخطاء ورسائل الخطأ التي يتم عرضها ومتغيّرات الأخطاء التي تضبطها Edge عندما تؤدي هذه السياسة إلى ظهور خطأ. هذه المعلومات مهمة لمعرفة ما إذا كنت تعمل على تطوير قواعد للأخطاء للتعامل مع الأخطاء. لمزيد من المعلومات، يمكنك الاطّلاع على المعلومات التي يجب معرفتها عن الأخطاء المتعلقة بالسياسات وأخطاء المعالجة.
أخطاء في وقت التشغيل
يمكن أن تحدث هذه الأخطاء عند تنفيذ السياسة.
رمز الخطأ | رموز حالة HTTP | السبب | إصلاح |
---|---|---|---|
steps.javascript.ScriptExecutionFailed |
500 | يمكن أن تؤدي سياسة JavaScript إلى العديد من الأنواع المختلفة من أخطاء ScriptExecutionتعذّر. تشتمل أنواع الأخطاء الشائعة على RangeError وReferenceError وSyntaxError وTypeError وURIError. | build |
steps.javascript.ScriptExecutionFailedLineNumber |
500 | حدث خطأ في رمز JavaScript. راجع سلسلة الخطأ للحصول على التفاصيل. | لا ينطبق |
steps.javascript.ScriptSecurityError |
500 | حدث خطأ متعلق بالأمان عند تنفيذ JavaScript. راجِع سلسلة الخطأ للحصول على التفاصيل. | لا ينطبق |
أخطاء النشر
يمكن أن تحدث هذه الأخطاء عند نشر خادم وكيل يحتوي على هذه السياسة.
اسم الخطأ | السبب | إصلاح |
---|---|---|
InvalidResourceUrlFormat |
إذا كان تنسيق عنوان URL للمورد المحدّد في <ResourceURL> أو العنصر <IncludeURL> في سياسة JavaScript غير صالح، سيتعذّر نشر الخادم الوكيل لواجهة برمجة التطبيقات. |
build |
InvalidResourceUrlReference |
وإذا كان العنصران <ResourceURL> أو <IncludeURL>
يشيران إلى ملف JavaScript غير متوفّر، سيتعذّر نشر الخادم الوكيل لواجهة برمجة التطبيقات.
يجب أن يكون ملف المصدر المشار إليه متوفرًا على مستوى الخادم الوكيل لواجهة برمجة التطبيقات أو البيئة أو مستوى المؤسسة. |
build |
WrongResourceType |
يحدث هذا الخطأ أثناء النشر إذا كانت العناصر <ResourceURL> أو <IncludeURL> في سياسة JavaScript تشير إلى أي نوع موارد بخلاف jsc (ملف JavaScript). |
build |
NoResourceURLOrSource |
قد يتعذّر نشر سياسة JavaScript مع ظهور هذا الخطأ إذا لم يتم تعريف العنصر <ResourceURL> أو إذا لم يتم تحديد عنوان URL للمورد داخل هذا العنصر.
العنصر <ResourceURL> هو عنصر إجباري. أو تم تعريف العنصر <IncludeURL>
بدون تحديد عنوان URL للمورد داخل هذا العنصر. إنّ العنصر <IncludeURL> اختياري، ولكن إذا تم تعريفه، يجب تحديد عنوان URL للمورد داخل العنصر <IncludeURL> . |
build |
متغيرات الخطأ
ويتم ضبط هذه المتغيّرات عندما تؤدي هذه السياسة إلى ظهور خطأ في وقت التشغيل. لمزيد من المعلومات، اطّلِع على المعلومات التي تحتاج إلى معرفتها عن الأخطاء المتعلقة بالسياسات.
المتغيرات | المكان | مثال |
---|---|---|
fault.name="fault_name" |
fault_name هو اسم الخطأ، كما هو موضَّح في جدول أخطاء وقت التشغيل أعلاه. اسم الخطأ هو الجزء الأخير من رمز الخطأ. | 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.
مواضيع ذات صلة
- نموذج عنصر JavaScript
- للحصول على التعليمات وعيّنات السياسات ونماذج JavaScript، يمكنك الاطّلاع على الخوادم الوكيلة لواجهة برمجة التطبيقات باستخدام JavaScript.
مقالات في منتدى Apigee
يمكنك العثور على هذه المقالات ذات الصلة في منتدى Apigee: