مدل شیء جاوا اسکریپت

درحال مشاهده اسناد Apigee Edge هستید.
به اسناد Apigee X بروید.
اطلاعات

این موضوع درباره «مدل شیء جاوا اسکریپت Apigee Edge» بحث می‌کند. اگر قصد دارید از خط‌مشی JavaScript برای افزودن JavaScript سفارشی به پراکسی API استفاده کنید، مهم است که این مدل را درک کنید.

درباره مدل شیء جاوا اسکریپت Edge

مدل شیء جاوا اسکریپت Apigee Edge اشیایی را با دارایی‌های مرتبط تعریف می‌کند که برای کد جاوا اسکریپت که در جریان پراکسی Apigee Edge اجرا می‌شود دردسترس هستند. از خط‌مشی JavaScript برای پیوست کردن این کد سفارشی به جریان پراکسی API استفاده می‌کنید.

اشیاء تعریف‌شده توسط این مدل در جریان پراکسی API دارای محدوده هستند، که به این معنی است که برخی‌از اشیاء و خصوصیات فقط در نقاط خاصی از جریان دردسترس هستند. وقتی جاوا اسکریپت شما اجرا می‌شود، یک محدوده برای اجرا ایجاد می‌شود. در آن محدوده، این ارجاع‌های شیء ایجاد می‌شود:

  • زمینه: شیئی که دسترسی به زمینه پیام را فراهم می‌کند
  • درخواست: مخففی که امکان دسترسی به شیء درخواست را فراهم می‌کند
  • پاسخ: مخففی که امکان دسترسی به شیء درخواست را فراهم می‌کند
  • crypto: توابع درهم‌ساز مختلفی را ارائه می‌دهد
  • چاپ: تابعی برای انتشار برونداد
  • دارایی‌ها: دسترسی خواندن به دارایی‌های پیکربندی در خط‌مشی را مجاز می‌کند

شیء زمینه‌ای

شیء context گستره جهانی دارد. این متغیر در همه جای جریان پراکسی API دردسترس است. چهار شیء فرزند دارد: proxyRequest، proxyResponse، targetRequest، targetResponse. این اشیای فرزند در محدوده درخواست و پاسخ محیطی، درخواست و پاسخ پراکسی، یا درخواست و پاسخ هدف قرار می‌گیرند. برای مثال، اگر خط‌مشی جاوا اسکریپت در بخش نقطه پایانی پراکسی جریان اجرا شود، آنگاه اشیای context.proxyRequest و context.proxyResponse در محدوده هستند. اگر جاوا اسکریپت در جریان هدف اجرا شود، اشیای 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 تنظیم شده باشد. این ثابت برای اجرای کد مختص حوزه مفید است. «دریافت‌کننده» به شما امکان می‌دهد متغیرهای جریان را دریافت کنید و «تنظیم‌کننده» به شما امکان می‌دهد متغیرهای جریان را تنظیم کنید. این متغیرها معمولاً در جریان پراکسی دردسترس هستند و می‌توانند توسط خط‌مشی‌های دیگر مصرف شوند.

برای جزئیات بیشتر و مثال‌ها، مرجع شیء زمینه‌ای زیر را ببینید.

شیء رمزارز

شیء رمزنگاری پشتیبانی رمزنگاری پایه و با عملکرد بالا را به «مدل شیء جاوا اسکریپت» اضافه می‌کند. برای جزئیات بیشتر و مثال‌ها، مرجع شیء رمزنگاری را در زیر ببینید.

درخواست و پاسخ اشیا

اشیاء request و response ارجاع‌های کوته‌نویسی‌شده به درخواست و پاسخ محیطی هستند، یا درخواست و پاسخ پراکسی یا درخواست و پاسخ هدف. اشیا ارجاع‌شده توسط این متغیرها به زمینه‌ای که خط‌مشی جاوا اسکریپت در آن اجرا می‌شود بستگی دارد. اگر JavaScript در جریان نقطه پایانی پراکسی اجرا شود، متغیرهای درخواست و پاسخ به context.proxyRequest و context.proxyResponse اشاره می‌کنند. اگر جاوا اسکریپت در یک جریان هدف اجرا شود، متغیرها به context.targetRequest و context.targetResponse اشاره می‌کنند.

مدل شیء جاوا اسکریپت شامل تابع print() است که می‌توانید از آن برای برونداد اطلاعات اشکال‌زدایی به ابزار «پیگیری Edge» استفاده کنید. به اشکال‌زدایی با دستورات JavaScript print() مراجعه کنید.

شیء خصوصیات

هنگام استفاده از عنصر در پیکربندی خط‌مشی، کد جاوا اسکریپت می‌تواند بااستفاده از متغیر properties به مقادیر آن دارایی‌ها دسترسی پیدا کند.

برای مثال، اگر پیکربندی جاوا اسکریپت شما حاوی موارد زیر باشد:

<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 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));
}

مرجع شیء رمزارز

شیء رمزنگاری به شما امکان می‌دهد توابع درهم‌سازی رمزنگاری پایه را در جاوا اسکریپت انجام دهید.

شیء رمزارز دارای محدوده جهانی است. این متغیر در همه جای جریان پراکسی API دردسترس است. «رمزنگاری» به شما امکان می‌دهد با این اشیای درهم‌سازی کار کنید:

  • 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])

پارامترها

  • قالب - (رشته) پیاده‌سازی زیرین برای این پارامتر java.text.SimpleDateFormat است. برای مثال: 'yyyy-MM-DD HH:mm:ss.SSS'
  • منطقه زمانی - (رشته، اختیاری) پیاده‌سازی زیربنایی برای این پارامتر java.util.TimeZone است. این پارامتر همان پیش‌فرض است: UTC
  • زمان - (عدد، اختیاری) مقدار مُهر زمان یونیکس برای قالب‌بندی. پیش‌فرض: زمان فعلی

مثال‌ها

زمان فعلی را تا میلی‌ثانیه دریافت کنید:

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';
}

مرجع شیء زمینه‌ای

برای هر تراکنش درخواست/پاسخ اجراشده توسط پراکسی API، یک شی context ایجاد می‌شود. شیء context روش‌هایی را برای دریافت، تنظیم، و برداشتن متغیرهای مربوط به هر تراکنش آشکار می‌کند.

متغیرها ویژگی‌های مختص به یک تراکنش را تعریف می‌کنند. زمان روز، منطقه جغرافیایی کارخواه درخواست‌کننده، عامل کاربر کارخواه درخواست‌کننده، و نشانی وب سرویس هدف همگی نمونه‌هایی از متغیرهایی هستند که در context دردسترس هستند. بنابراین، context برای ساختن منطقی که برای اجرای رفتار سفارشی به این دارایی‌ها متکی است مفید است.

به مرجع متغیرهای جاری‌سازی و خط‌مشی استخراج متغیرها مراجعه کنید.

زمینه خلاصه شیء

این جدول به‌طور خلاصه شیء زمینه‌ای و فرزندان آن را توصیف می‌کند و دارایی‌هایی را که به هریک از آن‌ها پیوند داده شده است فهرست می‌کند.

نام شرح مشخصات
context پوششی برای زمینه خط لوله پردازش پیام و درخواست و پاسخ جریان‌هایی که توسط ProxyEndpoint و TargetEndpoint اجرا می‌شوند. جریان، جلسه
context.proxyRequest شیئی که پیام درخواست ورودی به ProxyEndpoint را نشان می‌دهد (از برنامه درخواست‌کننده به پراکسی API) سرایندها، پارامترهای پُرسمان، روش، بدنه، نشانی وب
context.targetRequest شیئی که پیام درخواست خروجی را از TargetEndpoint نشان می‌دهد (از پراکسی API به سرویس زیرینه). سرایندها، پارامترهای پُرسمان، روش، بدنه، نشانی وب
context.targetResponse شیئی که نشان‌دهنده پیام پاسخ هدف ورودی (از سرویس زیرینه به پراکسی API) است سرایندها، محتوا، وضعیت
context.proxyResponse شیئی که نشان‌دهنده پیام پاسخ پراکسی خروجی (از پراکسی API به برنامه درخواست‌کننده) است سرایندها، محتوا، وضعیت
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);

مثال

سناریو رایج برای تنظیم متغیر زمانی است که یک پراکسی API باید نشانی وب هدف را به‌صورت پویا بنویسد. «جاوا اسکریپت» زیر مقدار متغیری به‌نام USER.name را دریافت می‌کند، آن مقدار را به‌عنوان پارامتر پُرسمان به نشانی وب 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 رشته‌ای است که جریان پراکسی «میانای برنامه‌سازی کاربردی» کنونی را شناسایی می‌کند. این دارایی برای نشان دادن «جریانی» که «جاوا اسکریپت» به آن پیوست شده است استفاده می‌شود. مقادیر پشتیبانی‌شده عبارت‌اند از:

  • PROXY_REQ_FLOW
  • PROXY_RESP_FLOW
  • TARGET_REQ_FLOW
  • TARGET_RESP_FLOW

هر نام «جریان» شامل «جریان پیش‌از جریان اصلی»، «جریان پس‌از جریان اصلی»، و هر «جریان» شرطی تعریف‌شده در ProxyEndpoints یا TargetEndpoints می‌شود.

این دارایی اختیاری زمانی مفید است که جاوا اسکریپت مشترک در بیش‌از یک «جریان» اجرا شود، اما ممکن است رفتار آن بسته به «جریانی» که در آن اجرا می‌شود متفاوت باشد. از دارایی «جریان» برای واحدهای جاوا اسکریپت که برای استفاده مجدد در چندین پراکسی API درنظر گرفته شده‌اند استفاده کنید، که در آن کد باید «جریان» فعلی را قبل‌از اجرای منطق بررسی کند.

مثال

سرایند HTTP را فقط در «جریان درخواست هدف» تنظیم کنید:

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

محتوا را فقط در «جریان پاسخ پراکسی» تنظیم کنید:

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

context.session

نقشه‌ای از جفت‌های نام/مقدار که می‌توان از آن برای انتقال اشیا بین دو خط‌مشی که در بافت پیام یکسان اجرا می‌شوند استفاده کرد.

مثال

مقدار را در جلسه تنظیم کنید:

context.session['key']  = 123;

مقدار را از جلسه دریافت کنید:

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

فرزندان شیء زمینه‌ای

همان‌طور که در زیر نشان داده شده است، «جریان» کامل کارگزار نیابت API شامل چهار مرحله متمایز است که هرکدام شیء پیام مرتبطی دارد که فرزند شیء زمینه‌ای است:

  • ‫context.proxyRequest: پیام درخواست ورودی که از کارخواه درخواست‌کننده دریافت شده است.
  • context.targetRequest: پیام درخواست خروجی که به سرویس زیرینه ارسال شده است.
  • ‫context.proxyResponse: پیام پاسخ برون‌سپاری به کارخواه درخواست‌کننده برگردانده شد.
  • context.targetResponse: پیام درخواست ورودی که از سرویس زیرینه دریافت شده است.

بخش‌های زیر روش‌ها و خواص این اشیا را توصیف می‌کند:

context.*Request child objects

برای هر تراکنش HTTP که در یک پراکسی API اجرا می‌شود، دو شیء پیام درخواست ایجاد می‌شود: یکی ورودی (درخواست از مشتری) و دیگری خروجی (درخواست تولیدشده توسط پراکسی API و ارسال‌شده به هدف زیرینه).

شیء context دارای اشیای فرزندی است که این پیام‌های درخواست را نشان می‌دهند: context.proxyRequest و context.targetRequest. این اشیا به شما امکان می‌دهند به دارایی‌های درون جریان درخواست که در محدوده زمانی اجرای کد جاوا اسکریپت شما است دسترسی داشته باشید.

توجه: همچنین می‌توانید از شیء کوته‌نویسی request برای دسترسی به این دارایی‌ها در جریان درخواست استفاده کنید. شیء request به context.proxyRequest یا context.targetRequest اشاره می‌کند، بسته به اینکه کد جاوا اسکریپت شما در کجای جریان اجرا می‌شود.

context.*Request خصوصیات شیء فرزند

نام دارایی شرح
url

دارایی url یک دارایی تسهیل‌کننده خواندن/نوشتن است که طرحواره، میزبان، درگاه، مسیر، و پارامترهای پُرسمان را برای targetRequest ترکیب می‌کند.

نشانی وب کامل درخواست از ویژگی‌های زیر تشکیل شده است:

  • پروتکل: پروتکل نشانی وب (برای مثال، HTTP،‏ HTTPS)
  • درگاه: درگاه (برای مثال، :۸۰، :۴۴۳)
  • میزبان: میزبان نشانی وب (برای مثال، www.example.com)
  • مسیر: مسیر نشانی وب (برای نمونه، /v1/mocktarget)

هنگام دریافت 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
جاوا اسکریپت زیر:
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

جاوا اسکریپت زیر:

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];

context.*Response child objects

برای هر تراکنش HTTP که در یک پراکسی API اجرا می‌شود، دو شیء پیام پاسخ ایجاد می‌شود: یکی ورودی (پاسخ از سرویس زیرینه) و دیگری خروجی (پاسخ ارسال‌شده به مشتری).

شیء زمینه‌ای دارای اشیای فرزندی است که این پیام‌های پاسخ را نشان می‌دهند: context.proxyResponse و context.targetResponse. این اشیا به شما امکان می‌دهند به دارایی‌های موجود در جریان پاسخ که هنگام اجرای کد جاوا اسکریپت شما در محدوده است دسترسی پیدا کنید.

توجه: همچنین می‌توانید از شیء کوته‌نویسی response برای دسترسی به این دارایی‌ها از جریان پاسخ استفاده کنید. شیء response به context.proxyResponse یا context.targetResponse اشاره می‌کند، بسته به اینکه کد جاوا اسکریپت شما در کجای جریان اجرا می‌شود.

context.*خصوصیت‌های شیء «پاسخ»

نام دارایی شرح
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

بااستفاده از نماد .asXML، روشی آسان برای پیمایش در سند XML وجود دارد. این بخش نحوه استفاده از این نمادگذاری و تفاوت آن با request.content و context.proxyRequest.content را توضیح می‌دهد.

برای مثال:

request.content.asXML

یا

context.proxyRequest.content.asXML

هر دو فرم *.content و *.content.asXML را می‌توان در بافت رشته‌ای استفاده کرد و جاوا اسکریپت آن‌ها را به رشته تبدیل می‌کند. در حالت اول (*.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 استفاده کنید. بااستفاده از دستورگان دیگر نمی‌توانید در سلسله‌مراتب پیمایش کنید.

اشکال‌زدایی با دستورات print() در جاوا اسکریپت

اگر از خط‌مشی جاوا اسکریپت برای اجرای کد جاوا اسکریپت سفارشی استفاده می‌کنید، توجه داشته باشید که می‌توانید از تابع 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 پیدا کنید.

ساختن پیام‌های نوشتاری جاوا اسکریپت با httpClient

از httpClient برای ایجاد چندین درخواست HTTP موازی و ناهم‌زمان به هر نشانی وب از درون کد سفارشی جاوا اسکریپت که در جریان پراکسی API اجرا می‌شود استفاده کنید. شیء httpClient توسط مدل شیء جاوا اسکریپت Apigee Edge آشکار می‌شود.

درباره httpClient

شیء httpClient ازطریق مدل شیء جاوا اسکریپت درمعرض کد جاوا اسکریپت سفارشی اجراشده در Apigee Edge قرار می‌گیرد. برای پیوست کردن جاوا اسکریپت سفارشی به پراکسی API، از خط‌مشی جاوا اسکریپت استفاده می‌کنید. وقتی خط‌مشی اجرا می‌شود، کد جاوا اسکریپت سفارشی اجرا می‌شود.

شیء httpClient برای توسعه خدمات ترکیبی یا ترکیب‌ها مفید است. برای مثال، می‌توانید چندین فراخوانی زیرینه را در یک روش API ادغام کنید. این شیء معمولاً به‌عنوان جایگزینی برای خط‌مشی «دعوت به سرویس» استفاده می‌شود.

در اینجا یک الگوی استفاده اولیه آورده شده است. یک شیء «درخواست» نمونه‌سازی کنید، نشانی وبی (برای مثال، برای سرویس زیرینه‌ای که می‌خواهید با آن تماس بگیرید) به آن اختصاص دهید، و با آن شیء درخواست، httpClient.send را فراخوانی کنید.

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

مرجع httpClient

«کارخواه HTTP» دو روش را آشکار می‌کند: get() و send().

httpClient.get()

روشی آسان برای درخواست‌های ساده HTTP GET، بدون پشتیبانی از سرایندهای HTTP.

استفاده

var exchangeObj = httpClient.get(url);

برگرداندن

این روش شیء exchange را برمی‌گرداند. این شیء هیچ خصوصیت ندارد و روش‌های زیر را آشکار می‌کند:

  • ‫isError(): (بولی) اگر httpClient نتواند به سرور متصل شود، true را برمی‌گرداند. رمزهای وضعیت اچ‌تی‌تی‌پی 4xx و 5xx منجر به isError() false می‌شود، زیرا اتصال تکمیل شده است و رمز پاسخ معتبری برگردانده شده است. اگر isError() مقدار true را برگرداند، تماس با getResponse() مقدار جاوا اسکریپت undefined را برمی‌گرداند.
  • isSuccess(): (مقدار منطقی) اگر ارسال کامل و موفقیت‌آمیز باشد، true برمی‌گرداند.
  • isComplete(): (مقدار منطقی) اگر درخواست کامل باشد، true را برمی‌گرداند.
  • ‫waitForComplete(): رشته را تا زمانی که درخواست کامل شود (با موفقیت یا خطا) متوقف می‌کند.
  • getResponse(): (شیء) اگر httpClient.send() کامل و موفقیت‌آمیز بود، شیء پاسخ را برمی‌گرداند. شیء برگشتی دارای روش‌ها و خصوصیت‌های یکسان با شیء context.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 سفارشی به جریان پراکسی استفاده کنید. خط‌مشی جاوا اسکریپت را ببینید.

موضوعات مرتبط

مقالات انجمن Apigee

این مقاله‌های مرتبط را می‌توانید در انجمن Apigeeپیدا کنید: