نموذج كائن JavaScript

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

يناقش هذا الموضوع نموذج كائن JavaScript في Apigee Edge. ومن المهم فهم هذا النموذج إذا كنت تنوي استخدام سياسة JavaScript لإضافة لغة JavaScript مخصّصة إلى خادم وكيل لواجهة برمجة التطبيقات.

لمحة عن نموذج كائن Edge JavaScript

يحدّد نموذج عنصر JavaScript في Apigee Edge العناصر ذات الخصائص المرتبطة المتاحة لرمز JavaScript الذي يتم تنفيذه ضمن تدفق الخادم الوكيل Apigee Edge. ويمكنك استخدام سياسة JavaScript لإرفاق هذا الرمز المخصّص بمسار الخادم الوكيل لواجهة برمجة التطبيقات.

تشتمل العناصر التي يحدّدها هذا النموذج على نطاق ضمن تدفق الخادم الوكيل لواجهة برمجة التطبيقات، ما يعني توفُّر عناصر وخصائص معيّنة في نقاط محدّدة فقط في المسار. عند تنفيذ JavaScript، يتم إنشاء نطاق للتنفيذ. في هذا النطاق، يتم إنشاء مراجع الكائنات التالية:

  • السياق: كائن يوفر إمكانية الوصول إلى سياق الرسالة
  • request: اختصار يسمح بالوصول إلى كائن الطلب
  • Response: اختصار يسمح بالوصول إلى كائن الطلب
  • crypto: يوفر دوال تجزئة مختلفة
  • print: دالة لإصدار المخرجات
  • properties: يسمح بالوصول لقراءة خصائص الإعداد في السياسة

كائن السياق

يحتوي الكائن context على نطاق عمومي. إنها متاحة في كل مكان ضمن تدفق الخادم الوكيل لواجهة برمجة التطبيقات. وتحتوي على أربعة كائنات فرعية: proxyRequest وproxyResponse وtargetRequest وtargetResponse. ويتم تحديد هذه العناصر الفرعية حسب الطلب والاستجابة في وضع الاستراحة، سواء كان طلب الخادم الوكيل والاستجابة له أو الطلب والاستجابة المستهدفَين. على سبيل المثال، إذا تم تنفيذ سياسة JavaScript في جزء نقطة نهاية الخادم الوكيل من التدفق، سيكون العنصران context.proxyRequest وcontext.proxyResponse في النطاق. إذا تم تشغيل JavaScript في تدفق مستهدف، سيكون العنصران context.targetRequest وcontext.targetResponse في النطاق.

يشمل العنصر context أيضًا خصائص وطرقًا موضّحة بالتفصيل في هذا الموضوع. على سبيل المثال، يستخدم المثال التالي لرمز JavaScript السمة context.flow ويُستدعي طرق get/setVariable() في context.

if (context.flow=="PROXY_REQ_FLOW") {
     var username = context.getVariable("request.formparam.user");
     context.setVariable("USER.name", username);
}

تتفاعل هذه الطرق مباشرةً مع متغيرات التدفق. قيمة السمة context.flow هي نطاق التدفق الحالي. وفي مسار طلب الخادم الوكيل، يتم ضبطها على القيمة PROXY_REQ_FLOW الثابتة. وإذا كان المسار ضمن مسار الاستجابة المستهدَف، يتم ضبطه على TARGET_RESP_FLOW. ويفيد هذا الثابت في تنفيذ التعليمات البرمجية الخاصة بالنطاق. تتيح لك دالة getter إمكانية الحصول على متغيّرات التدفق، بينما تتيح لك الأداة setter إمكانية ضبط متغيّرات التدفق. تتوفّر هذه المتغيّرات بشكلٍ عام في مسار الخادم الوكيل ويمكن استهلاكها من خلال سياسات أخرى.

اطّلِع على مرجع عنصر السياق أدناه للحصول على مزيد من التفاصيل والأمثلة.

كائن التشفير

يضيف كائن التشفير دعمًا تشفيريًا أساسيًا وعالي الأداء إلى نموذج كائن JavaScript. ويمكنك الاطّلاع على مرجع عناصر التشفير أدناه للحصول على المزيد من التفاصيل والأمثلة.

كائنات الطلب والاستجابة

العنصران request وresponse هما إشارات مختصرة إلى الطلب والاستجابة في وضع "العرض على الشاشة"، إما إلى طلب واستجابة الخادم الوكيل أو إلى الطلب والاستجابة المستهدفَين. وتعتمد الكائنات التي تشير إليها هذه المتغيّرات على السياق الذي يتم فيه تنفيذ سياسة JavaScript. وإذا كان رمز JavaScript يعمل في مسار نقطة نهاية الخادم الوكيل، يشير متغيّرا الطلب والاستجابة إلى context.proxyRequest وcontext.proxyResponse. وفي حال تشغيل JavaScript في تدفق مستهدف، يشير المتغيّرات إلى context.targetRequest وcontext.targetResponse.

يتضمّن نموذج عنصر JavaScript وظيفة print() يمكنك استخدامها لإخراج معلومات تصحيح الأخطاء إلى أداة Edge Trace. راجِع تصحيح الأخطاء باستخدام عبارات JavaScript print().

كائن الخصائص

عند استخدام عنصر في إعداد السياسة، يمكن لرمز JavaScript الوصول إلى قيم هذه السمات باستخدام متغيّر properties.

على سبيل المثال، إذا كانت تهيئة JavaScript تحتوي على:

<Javascript name='JS-1' >
  <Properties>
    <Property name="number">8675309</Property>
    <Property name="firstname">Jenny</Property>
  </Properties>
  <ResourceURL>jsc://my-code.js</ResourceURL>
</Javascript>

بعد ذلك، يمكنك في my-code.js:

  print(properties.firstname);  // prints Jenny
  print(properties.number);  // 8675309

ومن الناحية العملية، تتيح عملية الإعداد عمل الرمز البرمجي بشكل مختلف عند تشغيله في بيئات مختلفة أو في أوقات مختلفة أو لأي سبب كان.

على سبيل المثال، تحدّد السمة التالية "اسم المتغيّر" ونمط الإخراج الذي يجب أن تنبعث منه JavaScript المعلومات:

<Javascript name='JS-2' >
  <Properties>
    <Property name="output">my_output_variable</Property>
    <Property name="prettyPrint">true</Property>
  </Properties>
  <ResourceURL>jsc://emit-results.js</ResourceURL>
</Javascript>
بعد ذلك، في emit-results.js، يمكن للرمز تنفيذ هذا الإجراء:
var result = { prop1: "something", prop2 : "something else" } ;
if (properties.prettyPrint == "true") {
  context.setVariable(properties.output, JSON.stringify(result, null, 2));
}
else {
  context.setVariable(properties.output, JSON.stringify(result));
}

مرجع عناصر التشفير

يتيح لك كائن التشفير تنفيذ وظائف تجزئة التشفير الأساسية في JavaScript.

لكائن التشفير نطاق عمومي. وهو متاح في كل مكان ضمن تدفق الخادم الوكيل لواجهة برمجة التطبيقات. يتيح لك Crypto التعامل مع كائنات التجزئة التالية:

  • SHA-1
  • SHA256
  • SHA512
  • MD5

التعامل مع كائنات SHA-1

يمكنك إنشاء كائنات SHA-1 وتحديثها وتحويلها إلى قيم سداسية عشرية وbase64.

إنشاء كائن SHA-1 جديد

var _sha1 = crypto.getSHA1();

تعديل كائن SHA-1

البنية

_sha1.update(value);

المَعلمات

  • value - (سلسلة) أي قيمة سلسلة.

مثال

تحديث كائن SHA-1:

_sha1.update("salt_value");

_sha1.update("some text");

عرض كائن SHA-1 كسلسلة سداسية عشرية

var _hashed_token = _sha1.digest();

عرض كائن SHA-1 كسلسلة base64

var _hashed_token = _sha1.digest64();

التعامل مع كائنات SHA-256

يمكنك إنشاء كائنات SHA-256 وتحديثها وتحويلها إلى قيم سداسية عشرية وbase64.

إنشاء كائن SHA-256 جديد

var _sha256 = crypto.getSHA256();

تعديل كائن SHA-256

البنية

_sha256.update(value);

المَعلمات

  • value - (سلسلة) أي قيمة سلسلة.

مثال

تحديث كائن SHA-256:

_sha256.update("salt_value");

_sha256.update("some text");

عرض كائن SHA-256 كسلسلة سداسية عشرية

var _hashed_token = _sha256.digest();

عرض كائن SHA-256 كسلسلة base64

var _hashed_token = _sha256.digest64();

التعامل مع كائنات SHA-512

يمكنك إنشاء كائنات SHA-512 وتحديثها وتحويلها إلى قيم سداسية عشرية وbase64.

إنشاء كائن SHA-512 جديد

var _sha512 = crypto.getSHA512();

تعديل كائن SHA-512

البنية

_sha512.update(value);

المَعلمات

  • value - (سلسلة) أي قيمة سلسلة.

مثال

تحديث كائن SHA-512:

_sha512.update("salt_value");

_sha512.update("some text");

عرض كائن SHA-512 كسلسلة سداسية عشرية

var _hashed_token = _sha512.digest();

عرض كائن SHA-512 كسلسلة base64

var _hashed_token = _sha512.digest64();

التعامل مع كائنات MD5

يمكنك إنشاء كائنات MD5 وتحديثها وتحويلها إلى قيم سداسية عشرية وbase64.

إنشاء عنصر MD5 جديد

var _md5 = crypto.getMD5();

تعديل كائن MD5

البنية

_md5.update(value);

المَعلمات

  • value - (سلسلة) أي قيمة سلسلة.

مثال

تعديل كائن MD5:

_md5.update("salt_value");

_md5.update("some text");

عرض الكائن MD5 كسلسلة سداسية عشرية

var _hashed_token = _md5.digest();

عرض كائن MD5 كسلسلة base64

var _hashed_token = _md5.digest64();

دعم تاريخ/وقت التشفير

يدعم كائن التشفير أنماط تنسيق التاريخ/الوقت.

crypto.dateFormat()

لعرض تاريخ بتنسيق سلسلة.

البنية

crypto.dateFormat(format, [timezone], [time])

المَعلمات

  • format - (سلسلة) طريقة التنفيذ الأساسية لهذه المَعلمة هي java.text.SimpleDateFormat. على سبيل المثال: "yyyy-MM-DD HH:mm:ss.SSS"
  • timezone - (سلسلة، اختيارية) التنفيذ الأساسي لهذه المعلَمة هو java.util.TimeZone. هذه المعلمة هي sameDefault: التوقيت العالمي المنسق
  • time - (رقم، اختياري) قيمة الطابع الزمني لـ Unix المطلوب تنسيقها. الوضع التلقائي: الوقت الحالي

أمثلة

الحصول على الوقت الحالي، حتى بالمللي ثانية:

var _now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS');

احصل على التوقيت الحالي للمنطقة الزمنية للمحيط الهادئ:

var _pst = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST');

احصل على قيمة عشر ثوانٍ من الآن:

var _timeNow = Number(context.getVariable('system.timestamp'));
var ten_seconds = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow + 10 * 1000);

أمثلة إضافية راجع أيضًا وثائق java.text.SimpleDateFormat.

var _pst = crypto.dateFormat('M');
var _pst = crypto.dateFormat('EEE, d MMM yyyy HH:mm:ss Z');
var _pst = crypto.dateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

استخدِم getHash() للحصول على أي من كائنات التجزئة المتوافقة

أمثلة

var _hash1 = crypto.getHash('MD5');

var _hash2 = crypto.getHash('SHA-1');

var _hash3 = crypto.getHash('SHA-256');

var _hash4 = crypto.getHash('SHA-512');

عيّنة من العملات المشفرة

try {
    // get values to use with hash functions
    var salt = context.getVariable("salt") || 'SomeHardCodedSalt';
    var host = context.getVariable("request.header.Host");
    var unhashed_token = "";

    var _timeNow = Number(context.getVariable('system.timestamp'));
    var now = crypto.dateFormat('yyyy-MM-DD HH:mm:ss.SSS','PST', _timeNow);
    unhashed_token = "|" + now + "|" + host

    // generate a hash with the unhashedToken:
    var sha512 = crypto.getSHA512();
    sha512.update(salt);
    sha512.update(unhashed_token);

    // convert to base64
    var base64_token = sha512.digest64();

    // set headers
    context.setVariable("request.header.now", now);
    context.setVariable("request.header.token", base64_token);

} catch(e) {
    throw 'Error in Javascript';
}

مرجع كائن السياق

يتم إنشاء كائن context لكل معاملة طلب/استجابة يتم تنفيذها من خلال الخادم الوكيل لواجهة برمجة التطبيقات. يعرض الكائن context طُرقًا للحصول على متغيّرات مرتبطة بكل معاملة وضبطها وإزالتها.

تحدد المتغيرات الخصائص الخاصة بمعاملة معيّنة. ومن الأمثلة على المتغيّرات المتوفرة في context هي الوقت من اليوم واللغة للعميل الذي قدّم الطلب ووكيل المستخدم للعميل الذي قدّم الطلب وعنوان URL للخدمة المستهدفة. وبالتالي، تكون السمة context مفيدة في إنشاء المنطق الذي يعتمد على هذه السمات لتنفيذ السلوك المخصّص.

اطّلِع على مرجع متغيّرات التدفق وسياسة استخراج المتغيّرات.

ملخّص عنصر السياق

يصف هذا الجدول بإيجاز عنصر السياق وعناصره الثانوية، ويسرد السمات المرتبطة بكل منها.

الاسم الوصف أماكن إقامة
context برنامج تضمين لسياق مسار معالجة الرسائل وتدفقات الطلبات والاستجابة التي يتم تنفيذها بواسطة ProxyEndpoint وTargetEndpoint. التدفق، جلسة
context.proxyRequest يشير هذا المصطلح إلى عنصر يمثّل رسالة الطلب الواردة إلى ProxyEndpoint (من التطبيق الذي يقدّم الطلب إلى الخادم الوكيل لواجهة برمجة التطبيقات). عناوين، مَعلمات طلب البحث، طريقة، نص، عنوان url
context.targetRequest يشير ذلك المصطلح إلى كائن يمثّل رسالة الطلب الصادر من TargetEndpoint (من الخادم الوكيل لواجهة برمجة التطبيقات) إلى خدمة الخلفية. عناوين، مَعلمات طلب البحث، طريقة، نص، عنوان url
context.targetResponse يشير هذا المصطلح إلى عنصر يمثّل رسالة الاستجابة المستهدفة الواردة (من خدمة الخلفية إلى الخادم الوكيل لواجهة برمجة التطبيقات). العناوين، المحتوى، الحالة
context.proxyResponse يشير هذا المصطلح إلى عنصر يمثّل رسالة استجابة الخادم الوكيل الصادر (من الخادم الوكيل لواجهة برمجة التطبيقات إلى التطبيق مقدِّم الطلب). العناوين، المحتوى، الحالة
context.flow اسم التدفق الحالي. يُرجى الاطّلاع على context.flow أدناه.
context.session خريطة لأزواج الأسماء/القيم التي يمكنك استخدامها لتمرير العناصر بين خطوتَين مختلفتَين يتم تنفيذهما في السياق نفسه. مثلاً: context.session['key'] = 123 لمزيد من المعلومات حول الحالات التي لا يتم فيها استخدام هذا الكائن وحالات عدم استخدامه، يُرجى الاطّلاع على مناقشة منتدى Apigee.

طرق كائنات السياق

context.getVariable()

استرداد قيمة متغيّر محدّد مسبقًا أو مخصّص

البنية

context.getVariable("variable-name");

مثال

وللحصول على القيمة للسنة الحالية:

var year = context.getVariable('system.time.year');

context.setVariable()

تحدِّد قيمة متغيّر مخصَّص أو لأي متغيّرات قابلة للكتابة محدّدة مسبقًا.

البنية

context.setVariable("variable-name", value);

مثال

من السيناريوهات الشائعة لإعداد متغيّر عندما يجب أن يكتب الخادم الوكيل لواجهة برمجة التطبيقات عنوان URL المستهدف ديناميكيًا. يحصل رمز JavaScript التالي على قيمة متغيّر يُطلق عليه USER.name، ثم يلحق هذه القيمة كمَعلمة طلب بحث في عنوان URL http://mocktarget.apigee.net?user=، ثم يضبط سمة target.url المحدّدة مسبقًا على تلك القيمة.

context.setVariable("target.url", "http://mocktarget.apigee.net/user?user="+context.getVariable("USER.name"));

context.removeVariable()

لإزالة متغيّر من السياق.

البنية

context.removeVariable('variable-name');

خصائص عنصر السياق

context.flow

السمة flow هي سلسلة تحدّد التدفق الحالي للخادم الوكيل لواجهة برمجة التطبيقات. تُستخدَم هذه السمة للإشارة إلى التدفق الذي يتم إرفاق JavaScript به. القيمتان المسموح بإدراجهما هما:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

يشمل كل اسم لتدفق البيانات PreFlow وPostFlow وأي تدفقات شرطية تم تحديدها في ProxyEndpoints أو TargetEndpoints.

وتُعدّ هذه السمة الاختيارية مفيدة عند تنفيذ لغة JavaScript الشائعة في أكثر من مسار واحد، ولكنّها قد تختلف سلوكها حسب التدفق الذي يتم تنفيذه فيه. استخدِم خاصية Flow لوحدات JavaScript المعدّة لإعادة استخدامها في عدة خوادم وكيل لواجهة برمجة التطبيقات، حيث يكون الرمز مطلوبًا للتحقق من التدفق الحالي قبل تنفيذ المنطق.

مثال

تحديد عنوان HTTP فقط في targetRequest Flow:

if (context.flow=="TARGET_REQ_FLOW") {
     context.targetRequest.headers['TARGET-HEADER-X']='foo';
}

قم بتعيين المحتوى فقط في حدثProxyResponse:

if (context.flow=="PROXY_RESP_FLOW") {
     context.proxyResponse.content='bar';
}

context.session

خريطة لأزواج الأسماء/القيم التي يمكن استخدامها لتمرير العناصر بين سياستين يتم تنفيذهما ضمن سياق الرسالة نفسه.

مثال

حدِّد قيمة في الجلسة:

context.session['key']  = 123;

الحصول على القيمة من الجلسة:

var value = context.session['key']; // 123

العناصر الثانوية لكائن السياق

كما هو موضّح أدناه، يشمل المسار الكامل للخادم الوكيل لواجهة برمجة التطبيقات أربع مراحل منفصلة، ولكل مرحلة منها عنصر رسالة مرتبط بعنصر السياق:

  • context.proxyRequest: رسالة الطلب الواردة التي تم استلامها من العميل الذي يقدّم الطلب.
  • context.targetRequest: رسالة الطلب الصادر التي تم إرسالها إلى خدمة الخلفية.
  • context.proxyResponse: رسالة الاستجابة الصادرة التي تم إرجاعها إلى البرنامج مقدّم الطلب.
  • context.targetResponse: رسالة الطلب الواردة التي تم استلامها من خدمة الخلفية.

توضح الأقسام التالية طرق هذه الكائنات وخصائصها:

السياق.*طلب الكائنات الفرعية

بالنسبة إلى كل معاملة HTTP يتم تنفيذها في خادم وكيل لواجهة برمجة التطبيقات، يتم إنشاء كائنَين لرسالة طلب: أحدهما inbound (طلب من العميل) والآخر inbound (الطلب الذي تم إنشاؤه من خلال الخادم الوكيل لواجهة برمجة التطبيقات والذي يتم إرساله إلى الواجهة الخلفية).

يحتوي الكائن context على عناصر ثانوية تمثّل رسائل الطلب هذه: context.proxyRequest وcontext.targetRequest. وتتيح لك هذه الكائنات الوصول إلى الخصائص ضمن تدفق الطلب الذي يكون ضمن النطاق عند تنفيذ رمز JavaScript.

ملاحظة: يمكنك أيضًا استخدام الكائن الاختزالي request للوصول إلى هذه السمات في مسار الطلب. يشير الكائن request إلى context.proxyRequest أو context.targetRequest، بناءً على مكان تنفيذ رمز JavaScript في التدفق.

السياق.*طلب خصائص الكائن الفرعي

اسم الموقع الوصف
url

السمة url هي خاصية مريحة للقراءة/الكتابة تجمع بين معلَمات المخطَّط والمضيف والمنفذ والمسار وطلب البحث لـ targetRequest.

يتألف عنوان URL الكامل للطلب من السمات التالية:

  • البروتوكول: بروتوكول عنوان URL (على سبيل المثال، HTTP وHTTPS)
  • المنفذ: المنفذ (على سبيل المثال، :80 أو :443)
  • المضيف: مضيف عنوان URL (على سبيل المثال، www.example.com)
  • path: مسار معرف الموارد المنتظم (URI) (على سبيل المثال، /v1/mocktarget)

عند الحصول على url، يتم عرض عنوان URL بالتنسيق التالي:

protocol://host:port/path?queryParams

أمثلة:

context.targetRequest.url = 'http://www.example.com/path?q1=1'
context.targetRequest.protocol ='https';
headers

عناوين طلبات HTTP كتعيين لـ String => List

أمثلة:

بالنسبة إلى طلب HTTP هذا:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
ملف JavaScript التالي:
context.proxyRequest.headers['Content-Type'];
context.proxyRequest.headers['Authorization'];

في إظهار القيم التالية

application/json
Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z
queryParams

مَعلمات طلب البحث في رسالة الطلب كتعيين لـ String => List.

أمثلة:

"?city=PaloAlto&city=NewYork"

يمكن الوصول إليه على النحو التالي:

context.proxyRequest.queryParams['city'];  // == 'PaloAlto'
context.proxyRequest.queryParams['city'][0]     // == 'PaloAlto'
context.proxyRequest.queryParams['city'][1];    // == 'NewYork'
context.proxyRequest.queryParams['city'].length(); // == 2
method

فعل HTTP (GET وPOST وPUT وDELETE وPATCH وما إلى ذلك) المرتبط بالطلب

أمثلة:

بالنسبة إلى هذا الطلب:

POST /v1/blogs HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer ylSkZIjbdWybfs4fUQe9BqP0LH5Z

ملف JavaScript التالي:

context.proxyRequest.method;

ستعرض القيمة التالية

POST
body

نص الرسالة (حمولة) لطلب HTTP.

يحتوي نص الطلب على الأعضاء التاليين:

  • context.targetRequest.body.asXML;
  • context.targetRequest.body.asJSON;
  • context.targetRequest.body.asForm;

أمثلة:

بالنسبة إلى نص XML:

<customer number='1'>
<name>Fred<name/>
<customer/>

للوصول إلى عناصر كائن XML على النحو التالي:

var name = context.targetRequest.body.asXML.name;

للوصول إلى سمات XML، استخدِم العلامة @.

var number = context.targetRequest.body.asXML.@number;

لنص طلب JSON:

{
"a":  1 ,
"b" : "2"
}
var a = context.proxyRequest.body.asJSON.a;    // == 1
var b = context.proxyRequest.body.asJSON.b;    // == 2

لقراءة مَعلمات النموذج:

"vehicle=Car&vehicle=Truck"
v0 = context.proxyRequest.body.asForm['vehicle'][0];
v1 = context.proxyRequest.body.asForm['vehicle'][1];

السياق.*الكائنات الثانوية للاستجابة

بالنسبة إلى كل معاملة HTTP يتم تنفيذها في خادم وكيل لواجهة برمجة التطبيقات، يتم إنشاء كائنَين لرسالة الاستجابة: أحدهما inbound (الاستجابة من خدمة الخلفية) والأخرى outbound (الاستجابة التي تم إرسالها إلى العميل).

يحتوي كائن السياق على عناصر ثانوية تمثّل رسالتَي الاستجابة هاتين: context.proxyResponse وcontext.targetResponse. وتتيح لك هذه الكائنات الوصول إلى الخصائص ضمن تدفق الاستجابة المحدد عند تنفيذ رمز JavaScript.

ملاحظة: يمكنك أيضًا استخدام الكائن الاختزالي response للوصول إلى هذه السمات من مسار الاستجابة. يشير الكائن response إلى context.proxyResponse أو context.targetResponse، بناءً على مكان تنفيذ رمز JavaScript في التدفق.

السياق.*خصائص عنصر الاستجابة

اسم الموقع الوصف
headers

عناوين HTTP لرسالة الاستجابة كتعيين لـ String => List.

مثال:

var cookie = context.targetResponse.headers['Set-Cookie'];
status

رمز الحالة مع رسالة الحالة كخاصية. يتوفر كل من رمز الحالة ورسالة الحالة كسمات.

مثال:

var status = context.targetResponse.status.code;   // 200
var msg = context.targetResponse.status.message;   // "OK"
content

نص HTTP (محتوى حمولة البيانات) لرسالة الاستجابة

يتضمن محتوى الرد الأعضاء التاليين:

context.targetResponse.content.asXML;
context.targetResponse.content.asJSON;

استخدام تدوين .asXML

هناك طريقة سهلة للتنقُّل في مستند XML باستخدام العلامة .asXML. يوضّح هذا القسم طريقة استخدام هذه العلامة ومدى اختلافها عن request.content وcontext.proxyRequest.content.

مثال:

request.content.asXML

أو

context.proxyRequest.content.asXML

يمكن استخدام النموذجَين *.content و*.content.asXML في سياق سلسلة، وستفرض لغة JavaScript عليهما ليصبحا سلاسل. في الحالة السابقة (*.content)، تتضمّن السلسلة جميع التعريفات بالإضافة إلى تعليقات XML. في الحالة الثانية (*.content.asXML)، يتم تنظيف قيمة السلسلة للنتيجة من البيانات والتعليقات.

مثال

msg.content:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>
<!-- mg023.mail.gq1.yahoo.com uncompressed/chunked Sat Dec 14 01:23:35 UTC 2013 -->

msg.content.asXML:

<?xml version="1.0" encoding="UTF-8"?>
<yahoo:error xmlns:yahoo="http://yahooapis.com/v1/base.rng" xml:lang="en-US">
   <yahoo:description>Please provide valid credentials. OAuth oauth_problem="unable_to_determine_oauth_type", realm="yahooapis.com"
   </yahoo:description>
</yahoo:error>

بالإضافة إلى ذلك، يمكنك استخدام النموذج .asXML لاجتياز التسلسل الهرمي بتنسيق XML، من خلال تحديد أسماء العناصر والسمات. لا يمكن اجتياز التسلسل الهرمي باستخدام البنية الأخرى.

تصحيح الأخطاء باستخدام عبارات JavaScript print()

إذا كنت تستخدم سياسة JavaScript لتنفيذ رمز JavaScript مخصّص، تجدر الإشارة إلى أنّه يمكنك استخدام الدالة print() لإخراج معلومات تصحيح الأخطاء إلى أداة التتبُّع. وتتوفر هذه الدالة مباشرةً من خلال نموذج كائن JavaScript. مثال:

if (context.flow=="PROXY_REQ_FLOW") {
     print("In proxy request flow");
     var username = context.getVariable("request.queryparam.user");
     print("Got query param: " + username);
     context.setVariable("USER.name", username);
     print("Set query param: " + context.getVariable("USER.name"));
}


if (context.flow=="TARGET_REQ_FLOW") {
     print("In target request flow");
     var username = context.getVariable("USER.name");
     var url = "http://mocktarget.apigee.net/user?"
     context.setVariable("target.url", url + "user=" + username);
     print("callout to URL: ", context.getVariable("target.url"));
}

للاطّلاع على النتائج، اختَر الإخراج من كل المعاملات في أسفل نافذة التتبُّع. يمكنك أيضًا العثور على مُخرجات في سمة التتبُّع المسماة stepExecution-stdout.

توفير وسائل شرح بلغة JavaScript باستخدام httpClient

يمكنك استخدام httpClient لإجراء طلبات HTTP متعددة ومتوازية وغير متزامنة لأي عنوان URL من داخل رمز JavaScript مخصّص يتم تنفيذه في تدفق الخادم الوكيل لواجهة برمجة التطبيقات. يظهر الكائن httpClient من خلال نموذج عنصر JavaScript Apigee Edge.

لمحة عن httpClient

الكائن httpClient معرّض لرمز JavaScript المخصّص الذي يتم تشغيله على Apigee Edge من خلال نموذج كائن JavaScript. لإرفاق محتوى JavaScript مخصّص بخادم وكيل لواجهة برمجة التطبيقات، يمكنك استخدام سياسة JavaScript. عند تنفيذ السياسة، يتم تنفيذ رمز JavaScript المخصّص.

ويُعدّ الكائن httpClient مفيدًا لتطوير الخدمات المركّبة أو التطبيقات المدمجة. على سبيل المثال، يمكنك دمج طلبات متعددة للخلفية في طريقة واحدة لواجهة برمجة التطبيقات. يشيع استخدام هذا الكائن كبديل لسياسة ServiceCallout.

إليك نمط الاستخدام الأساسي. أنشئ مثيلاً لكائن "طلب"، وعيِّن له عنوان URL (على سبيل المثال، لخدمة خلفية تريد الاتصال بها)، واستدعِ httpClient.send باستخدام كائن الطلب هذا.

var myRequest = new Request();
myRequest.url = "http://www.example.com";
var exchangeObj = httpClient.send(myRequest);

httpمرجع العميل

يعرض عميل HTTP طريقتين: get() وsend().

httpClient.get()

طريقة ملائمة لطلبات HTTP GET البسيطة، مع عدم دعم عناوين HTTP.

الاستخدام

var exchangeObj = httpClient.get(url);

المرتجعات

وتُرجع الطريقة كائن exchange. لا يحتوي هذا الكائن على سمات، ويعرض الطرق التالية:

  • isError(): (منطقي) تعرض القيمة true إذا تعذّر على httpClient الاتصال بالخادم. يؤدي رمزا حالة HTTP 4xx و5xx إلى isError() false، نظرًا لاكتمال الاتصال وعرض رمز استجابة صالح. وإذا عرَضَ isError() الخطأ true، سيؤدي استدعاء getResponse() إلى عرض رمز JavaScript undefined.
  • isSuccess(): (منطقية) تعرض true إذا كان الإرسال قد اكتمل بنجاح.
  • isComplete(): (منطقية) تعرض true إذا اكتمل الطلب.
  • waitForComplete(): لإيقاف سلسلة المحادثات مؤقتًا حتى اكتمال الطلب (بنجاح أو خطأ).
  • getResponse(): (كائن) يعرض كائن الاستجابة إذا كان httpClient.send() كاملاً وناجحًا. ويحتوي الكائن المعروض على الطرق والخصائص نفسها التي يتضمّنها الكائن content.proxyResponse. يمكنك الاطّلاع على ملخّص عنصر السياق.
  • getError(): (سلسلة) إذا أدى طلب httpClient.send() إلى حدوث خطأ، سيتم عرض رسالة الخطأ كسلسلة.

مثال

أرسِل كائن طلب تم إعداده بالكامل ويحتوي على خصائص طلب HTTP. يمكنك استخدام استدعاء لا يحظره لمعالجة الرد.

// Add the required the headers for making a specific API request
var headers = {'X-SOME-HEADER' : 'some value' };
// Make a GET API request along with headers
var myRequest = new Request("http://www.example.com","GET",headers);

// Define the callback function and process the response from the GET API request
function onComplete(response,error) {
 // Check if the HTTP request was successful
    if (response) {
      context.setVariable('example.status', response.status);
     } else {
      context.setVariable('example.error', 'Woops: ' + error);
     }
}

// Specify the callback Function as an argument
httpClient.get(myRequest, onComplete);

استخدام سياسة JavaScript

استخدِم سياسة JavaScript لإرفاق رمز JavaScript مخصّص بتدفق الخادم الوكيل. راجِع سياسة JavaScript.

مواضيع ذات صلة

مقالات في منتدى Apigee

يمكنك العثور على هذه المقالات ذات الصلة في منتدى Apigee: